File indexing completed on 2024-04-14 05:34:14

0001 /*
0002     SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "exportdialog.h"
0008 #include "fileviewhgpluginsettings.h"
0009 #include "commitinfowidget.h"
0010 #include "hgwrapper.h"
0011 
0012 #include <QCheckBox>
0013 #include <QGroupBox>
0014 #include <QVBoxLayout>
0015 #include <QGridLayout>
0016 #include <QListWidget>
0017 #include <QProcess>
0018 #include <QTextCodec>
0019 #include <QFileDialog>
0020 #include <KLocalizedString>
0021 #include <KMessageBox>
0022 
0023 HgExportDialog::HgExportDialog(QWidget *parent) :
0024     DialogBase(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, parent)
0025 {
0026     // dialog properties
0027     this->setWindowTitle(i18nc("@title:window",
0028                 "<application>Hg</application> Export"));
0029     okButton()->setText(xi18nc("@action:button", "Export"));
0030 
0031     //
0032     setupUI();
0033     loadCommits();
0034 
0035     // Load saved settings
0036     FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self();
0037     this->resize(QSize(settings->exportDialogWidth(),
0038                                settings->exportDialogHeight()));
0039 
0040     //
0041     connect(this, SIGNAL(finished(int)), this, SLOT(saveGeometry()));
0042 }
0043 
0044 void HgExportDialog::setupUI()
0045 {
0046     QGroupBox *mainGroup = new QGroupBox;
0047     QGridLayout *mainLayout = new QGridLayout;
0048     m_commitInfoWidget = new HgCommitInfoWidget;
0049 
0050     m_commitInfoWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
0051     mainLayout->addWidget(m_commitInfoWidget);
0052     mainGroup->setLayout(mainLayout);
0053 
0054     // options
0055     m_optionGroup = new QGroupBox(i18nc("@label:group", "Options"));
0056     m_optText = new QCheckBox(i18nc("@label", "Treat all files as text"));
0057     m_optGit = new QCheckBox(i18nc("@label", "Use Git extended diff format"));
0058     m_optNoDates = new QCheckBox(i18nc("@label", "Omit dates from diff headers"));
0059     QVBoxLayout *optionLayout = new QVBoxLayout;
0060     optionLayout->addWidget(m_optText);
0061     optionLayout->addWidget(m_optGit);
0062     optionLayout->addWidget(m_optNoDates);
0063     m_optionGroup->setLayout(optionLayout);
0064 
0065     //setup main dialog widget
0066     QVBoxLayout *lay = new QVBoxLayout;
0067     lay->addWidget(mainGroup);
0068     lay->addWidget(m_optionGroup);
0069     layout()->insertLayout(0, lay);
0070 }
0071 
0072 void HgExportDialog::loadCommits()
0073 {
0074     HgWrapper *hgWrapper = HgWrapper::instance();
0075 
0076     // update heads list
0077     QProcess process;
0078     process.setWorkingDirectory(hgWrapper->getBaseDir());
0079 
0080     QStringList args;
0081     args << QLatin1String("log");
0082     args << QLatin1String("--template");
0083     args << QLatin1String("{rev}\n{node|short}\n{branch}\n"
0084                           "{author}\n{desc|firstline}\n");
0085 
0086     process.start(QLatin1String("hg"), args);
0087     process.waitForFinished();
0088     m_commitInfoWidget->clear();
0089 
0090     const int FINAL = 5;
0091     char buffer[FINAL][1024];
0092     int count = 0;
0093     while (process.readLine(buffer[count], sizeof(buffer[count])) > 0) {
0094         if (count == FINAL - 1) {
0095             QString rev = QTextCodec::codecForLocale()->toUnicode(buffer[0]).trimmed();
0096             QString changeset = QTextCodec::codecForLocale()->toUnicode(buffer[1]).trimmed();
0097             QString branch = QTextCodec::codecForLocale()->toUnicode(buffer[2]).trimmed();
0098             QString author = QTextCodec::codecForLocale()->toUnicode(buffer[3]).trimmed();
0099             QString log = QTextCodec::codecForLocale()->toUnicode(buffer[4]).trimmed();
0100 
0101             QListWidgetItem *item = new QListWidgetItem;
0102             item->setData(Qt::DisplayRole, changeset);
0103             item->setData(Qt::UserRole + 1, rev);
0104             item->setData(Qt::UserRole + 2, branch);
0105             item->setData(Qt::UserRole + 3, author);
0106             item->setData(Qt::UserRole + 4, log);
0107             m_commitInfoWidget->addItem(item);
0108         }
0109         count = (count + 1)%FINAL;
0110     }
0111 }
0112 
0113 void HgExportDialog::saveGeometry()
0114 {
0115     FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self();
0116     settings->setExportDialogHeight(this->height());
0117     settings->setExportDialogWidth(this->width());
0118     settings->save();
0119 }
0120 
0121 void HgExportDialog::done(int r)
0122 {
0123     if (r == QDialog::Accepted) {
0124         const QList<QListWidgetItem*> items = m_commitInfoWidget->selectedItems();
0125         if (items.empty()) {
0126             KMessageBox::error(this, i18nc("@message:error",
0127                      "Please select at least one changeset to be exported!"));
0128             return;
0129         }
0130 
0131         QStringList args;
0132         if (m_optText->checkState() == Qt::Checked) {
0133             args << QStringLiteral("--text");
0134         }
0135         if (m_optGit->checkState() == Qt::Checked) {
0136             args << QStringLiteral("--git");
0137         }
0138         if (m_optNoDates->checkState() == Qt::Checked) {
0139             args << QStringLiteral("--nodates");
0140         }
0141 
0142         args << QStringLiteral("-r");
0143         for (QListWidgetItem *item : items) {
0144             args << item->data(Qt::DisplayRole).toString();
0145         }
0146 
0147         QString directory = QFileDialog::getExistingDirectory(this);
0148         if (directory.isEmpty()) {
0149             return;
0150         }
0151         if (!directory.endsWith(QLatin1Char('/'))) {
0152             directory.append(QLatin1Char('/'));
0153         }
0154 
0155         args << QStringLiteral("--output");
0156         args << directory + QLatin1String("%b_%h.patch");
0157 
0158         HgWrapper *hgw = HgWrapper::instance();
0159         if (hgw->executeCommandTillFinished(QStringLiteral("export"), args)) {
0160             QDialog::done(r);
0161         }
0162         else {
0163             KMessageBox::error(this, hgw->readAllStandardError());
0164         }
0165     }
0166     else {
0167         QDialog::done(r);
0168     }
0169 }
0170 
0171 
0172 
0173 #include "moc_exportdialog.cpp"