File indexing completed on 2024-04-21 05:41:02

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"