File indexing completed on 2024-05-05 10:02:26
0001 /* 0002 SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "mergedialog.h" 0008 #include "hgwrapper.h" 0009 #include "commititemdelegate.h" 0010 #include "commitinfowidget.h" 0011 #include "fileviewhgpluginsettings.h" 0012 0013 #include <QLabel> 0014 #include <QHBoxLayout> 0015 #include <QVBoxLayout> 0016 #include <QTextEdit> 0017 #include <QListWidgetItem> 0018 #include <QTextCodec> 0019 #include <KLocalizedString> 0020 #include <KMessageBox> 0021 0022 HgMergeDialog::HgMergeDialog(QWidget *parent): 0023 DialogBase(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, parent) 0024 { 0025 // dialog properties 0026 this->setWindowTitle(xi18nc("@title:window", 0027 "<application>Hg</application> Merge")); 0028 okButton()->setText(xi18nc("@label:button", "Merge")); 0029 0030 // UI 0031 0032 m_currentChangeset = new QLabel; 0033 m_commitInfoWidget = new HgCommitInfoWidget; 0034 0035 QVBoxLayout *vbox = new QVBoxLayout; 0036 vbox->addWidget(m_currentChangeset); 0037 vbox->addWidget(m_commitInfoWidget); 0038 0039 layout()->insertLayout(0, vbox); 0040 0041 updateInitialDialog(); 0042 0043 // load saved geometry 0044 FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self(); 0045 this->resize(QSize(settings->mergeDialogWidth(), 0046 settings->mergeDialogHeight())); 0047 0048 // connections 0049 connect(this, SIGNAL(finished(int)), this, SLOT(saveGeometry())); 0050 } 0051 0052 void HgMergeDialog::updateInitialDialog() 0053 { 0054 HgWrapper *hgWrapper = HgWrapper::instance(); 0055 0056 // update label - current branch 0057 const QString line = QLatin1String("<b>parents:</b> ") + hgWrapper->getParentsOfHead(); 0058 m_currentChangeset->setText(line); 0059 0060 // update heads list 0061 QProcess process; 0062 process.setWorkingDirectory(hgWrapper->getBaseDir()); 0063 0064 const QStringList args{ 0065 QStringLiteral("heads"), 0066 QStringLiteral("--template"), 0067 QStringLiteral("{rev}\n{node|short}\n{branch}\n" 0068 "{author}\n{desc|firstline}\n"), 0069 }; 0070 0071 process.start(QStringLiteral("hg"), args); 0072 m_commitInfoWidget->clear(); 0073 0074 const int FINAL = 5; 0075 char buffer[FINAL][1024]; 0076 int count = 0; 0077 while (process.waitForReadyRead()) { 0078 while (process.readLine(buffer[count], sizeof(buffer[count])) > 0) { 0079 if (count == FINAL - 1) { 0080 QString rev = QTextCodec::codecForLocale()->toUnicode(buffer[0]).trimmed(); 0081 QString changeset = QTextCodec::codecForLocale()->toUnicode(buffer[1]).trimmed(); 0082 QString branch = QTextCodec::codecForLocale()->toUnicode(buffer[2]).trimmed(); 0083 QString author = QTextCodec::codecForLocale()->toUnicode(buffer[3]).trimmed(); 0084 QString log = QTextCodec::codecForLocale()->toUnicode(buffer[4]).trimmed(); 0085 0086 QListWidgetItem *item = new QListWidgetItem; 0087 item->setData(Qt::DisplayRole, changeset); 0088 item->setData(Qt::UserRole + 1, rev); 0089 item->setData(Qt::UserRole + 2, branch); 0090 item->setData(Qt::UserRole + 3, author); 0091 item->setData(Qt::UserRole + 4, log); 0092 m_commitInfoWidget->addItem(item); 0093 0094 } 0095 count = (count + 1)%FINAL; 0096 } 0097 } 0098 } 0099 0100 void HgMergeDialog::done(int r) 0101 { 0102 if (r == QDialog::Accepted) { 0103 HgWrapper *hgw = HgWrapper::instance(); 0104 0105 QListWidgetItem *currentItem = m_commitInfoWidget->currentItem(); 0106 if (currentItem == nullptr) { 0107 KMessageBox::error(this, 0108 xi18nc("@message", "No head selected for merge!")); 0109 return; 0110 } 0111 0112 QString changeset = m_commitInfoWidget->selectedChangeset(); 0113 const QStringList args{ 0114 QStringLiteral("-r"), 0115 changeset, 0116 }; 0117 0118 if (hgw->executeCommandTillFinished(QStringLiteral("merge"), args)) { 0119 KMessageBox::information(this, hgw->readAllStandardOutput()); 0120 QDialog::done(r); 0121 } 0122 else { 0123 KMessageBox::error(this, hgw->readAllStandardError()); 0124 return; 0125 } 0126 } 0127 else { 0128 QDialog::done(r); 0129 } 0130 } 0131 0132 void HgMergeDialog::saveGeometry() 0133 { 0134 FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self(); 0135 settings->setMergeDialogHeight(this->height()); 0136 settings->setMergeDialogWidth(this->width()); 0137 settings->save(); 0138 } 0139 0140 0141 0142 #include "moc_mergedialog.cpp"