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"