File indexing completed on 2024-04-14 05:34:13
0001 /* 0002 SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "backoutdialog.h" 0008 #include "commitinfowidget.h" 0009 #include "fileviewhgpluginsettings.h" 0010 #include "hgwrapper.h" 0011 0012 #include <QWidget> 0013 #include <QGroupBox> 0014 #include <QCheckBox> 0015 #include <QGridLayout> 0016 #include <QVBoxLayout> 0017 #include <QListWidgetItem> 0018 #include <QLabel> 0019 #include <QTextCodec> 0020 #include <QProcess> 0021 #include <QDebug> 0022 #include <QLineEdit> 0023 #include <KLocalizedString> 0024 #include <KMessageBox> 0025 0026 HgBackoutDialog::HgBackoutDialog(QWidget *parent) : 0027 DialogBase(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, parent) 0028 { 0029 // dialog properties 0030 this->setWindowTitle(xi18nc("@title:window", 0031 "<application>Hg</application> Backout")); 0032 0033 okButton()->setText(xi18nc("@action:button", "Backout")); 0034 okButton()->setDisabled(true); 0035 0036 // 0037 setupUI(); 0038 0039 // Load saved settings 0040 FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self(); 0041 this->resize(QSize(settings->backoutDialogWidth(), 0042 settings->backoutDialogHeight())); 0043 0044 // connections 0045 connect(this, SIGNAL(finished(int)), this, SLOT(saveGeometry())); 0046 connect(m_selectBaseCommitButton, &QAbstractButton::clicked, 0047 this, &HgBackoutDialog::slotSelectBaseChangeset); 0048 connect(m_selectParentCommitButton, &QAbstractButton::clicked, 0049 this, &HgBackoutDialog::slotSelectParentChangeset); 0050 connect(m_baseRevision, &QLineEdit::textChanged, 0051 this, &HgBackoutDialog::slotUpdateOkButton); 0052 } 0053 0054 void HgBackoutDialog::setupUI() 0055 { 0056 m_mainGroup = new QGroupBox; 0057 m_baseRevision = new QLineEdit; 0058 m_parentRevision = new QLineEdit; 0059 m_optMerge = new QCheckBox(xi18nc("@label:checkbox", 0060 "Merge with old dirstate parent after backout")); 0061 m_selectParentCommitButton = new QPushButton(xi18nc("@label:button", 0062 "Select Changeset")); 0063 m_selectBaseCommitButton = new QPushButton(xi18nc("@label:button", 0064 "Select Changeset")); 0065 QGridLayout *mainGroupLayout = new QGridLayout; 0066 0067 mainGroupLayout->addWidget(new QLabel(xi18nc("@label", 0068 "Revision to Backout: ")), 0, 0); 0069 mainGroupLayout->addWidget(m_baseRevision, 0, 1); 0070 mainGroupLayout->addWidget(m_selectBaseCommitButton, 0, 2); 0071 0072 mainGroupLayout->addWidget(new QLabel(xi18nc("@label", 0073 "Parent Revision (optional): ")), 1, 0); 0074 mainGroupLayout->addWidget(m_parentRevision, 1, 1); 0075 mainGroupLayout->addWidget(m_selectParentCommitButton, 1, 2); 0076 0077 mainGroupLayout->addWidget(m_optMerge, 2, 0, 1, 0); 0078 0079 m_mainGroup->setLayout(mainGroupLayout); 0080 0081 QVBoxLayout *lay = new QVBoxLayout; 0082 lay->addWidget(m_mainGroup); 0083 layout()->insertLayout(0, lay); 0084 } 0085 0086 void HgBackoutDialog::saveGeometry() 0087 { 0088 FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self(); 0089 settings->setBackoutDialogHeight(this->height()); 0090 settings->setBackoutDialogWidth(this->width()); 0091 settings->save(); 0092 } 0093 0094 void HgBackoutDialog::loadCommits() 0095 { 0096 HgWrapper *hgWrapper = HgWrapper::instance(); 0097 0098 // update heads list 0099 QProcess process; 0100 process.setWorkingDirectory(hgWrapper->getBaseDir()); 0101 0102 QStringList args; 0103 args << QLatin1String("log"); 0104 args << QLatin1String("--template"); 0105 args << QLatin1String("{rev}\n{node|short}\n{branch}\n" 0106 "{author}\n{desc|firstline}\n"); 0107 0108 process.start(QLatin1String("hg"), args); 0109 process.waitForFinished(); 0110 m_commitInfo->clear(); 0111 0112 const int FINAL = 5; 0113 char buffer[FINAL][1024]; 0114 int count = 0; 0115 while (process.readLine(buffer[count], sizeof(buffer[count])) > 0) { 0116 if (count == FINAL - 1) { 0117 QString rev = QTextCodec::codecForLocale()->toUnicode(buffer[0]).trimmed(); 0118 QString changeset = QTextCodec::codecForLocale()->toUnicode(buffer[1]).trimmed(); 0119 QString branch = QTextCodec::codecForLocale()->toUnicode(buffer[2]).trimmed(); 0120 QString author = QTextCodec::codecForLocale()->toUnicode(buffer[3]).trimmed(); 0121 QString log = QTextCodec::codecForLocale()->toUnicode(buffer[4]).trimmed(); 0122 0123 QListWidgetItem *item = new QListWidgetItem; 0124 item->setData(Qt::DisplayRole, changeset); 0125 item->setData(Qt::UserRole + 1, rev); 0126 item->setData(Qt::UserRole + 2, branch); 0127 item->setData(Qt::UserRole + 3, author); 0128 item->setData(Qt::UserRole + 4, log); 0129 m_commitInfo->addItem(item); 0130 } 0131 count = (count + 1)%FINAL; 0132 } 0133 } 0134 0135 QString HgBackoutDialog::selectChangeset() 0136 { 0137 DialogBase diag(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); 0138 diag.setWindowTitle(xi18nc("@title:window", 0139 "Select Changeset")); 0140 diag.okButton()->setText(xi18nc("@action:button", "Select")); 0141 0142 diag.setMinimumWidth(700); 0143 0144 m_commitInfo = new HgCommitInfoWidget; 0145 loadCommits(); 0146 diag.layout()->insertWidget(0, m_commitInfo); 0147 0148 if (diag.exec() == QDialog::Accepted) { 0149 return m_commitInfo->selectedChangeset(); 0150 } 0151 return QString(); 0152 } 0153 0154 void HgBackoutDialog::slotSelectBaseChangeset() 0155 { 0156 QString changeset = selectChangeset(); 0157 if (!changeset.isEmpty()) { 0158 m_baseRevision->setText(changeset); 0159 } 0160 } 0161 0162 void HgBackoutDialog::slotSelectParentChangeset() 0163 { 0164 QString changeset = selectChangeset(); 0165 if (!changeset.isEmpty()) { 0166 m_parentRevision->setText(changeset); 0167 } 0168 } 0169 0170 void HgBackoutDialog::done(int r) 0171 { 0172 if (r == QDialog::Accepted) { 0173 HgWrapper *hgw = HgWrapper::instance(); 0174 QStringList args; 0175 args << QLatin1String("--rev"); 0176 args << m_baseRevision->text(); 0177 0178 if (!m_parentRevision->text().isEmpty()) { 0179 args << QLatin1String("--parent"); 0180 args << m_parentRevision->text(); 0181 } 0182 0183 if (m_optMerge->checkState() == Qt::Checked) { 0184 args << QLatin1String("--merge"); 0185 } 0186 0187 if (hgw->executeCommandTillFinished(QLatin1String("backout"), args)) { 0188 KMessageBox::information(this, hgw->readAllStandardOutput()); 0189 QDialog::done(r); 0190 } 0191 else { 0192 KMessageBox::error(this, hgw->readAllStandardError()); 0193 } 0194 } 0195 else { 0196 QDialog::done(r); 0197 } 0198 } 0199 0200 void HgBackoutDialog::slotUpdateOkButton(const QString &text) 0201 { 0202 qDebug() << "text" << text; 0203 okButton()->setEnabled(!text.isEmpty()); 0204 } 0205 0206 0207 0208 #include "moc_backoutdialog.cpp"