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"