File indexing completed on 2024-05-12 17:16:10

0001 /***************************************************************************
0002  *   Copyright (C) 2005-2009 by Rajko Albrecht                             *
0003  *   ral@alwins-world.de                                                   *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
0019  ***************************************************************************/
0020 #include "commandexec.h"
0021 #include "settings/kdesvnsettings.h"
0022 #include "svnfrontend/svnactions.h"
0023 #include "svnfrontend/dummydisplay.h"
0024 #include "svnqt/targets.h"
0025 #include "svnqt/url.h"
0026 #include "svnqt/dirent.h"
0027 #include "helpers/ktranslateurl.h"
0028 #include "helpers/sshagent.h"
0029 #include "helpers/windowgeometryhelper.h"
0030 #include "svnfrontend/fronthelpers/rangeinput_impl.h"
0031 #include "svnfrontend/copymoveview_impl.h"
0032 #include "ksvnwidgets/ksvndialog.h"
0033 
0034 #include <KMessageBox>
0035 
0036 #include <QCommandLineParser>
0037 #include <QDir>
0038 #include <QTextBrowser>
0039 #include <QTextStream>
0040 #include <QUrlQuery>
0041 
0042 class pCPart
0043 {
0044 public:
0045     pCPart();
0046     ~pCPart();
0047 
0048     QString cmd;
0049     QStringList urls;
0050     bool ask_revision;
0051     bool rev_set;
0052     bool outfile_set;
0053     bool single_revision;
0054     bool force;
0055     int log_limit;
0056     SvnActions *m_SvnWrapper;
0057     QCommandLineParser *parser;
0058     QStringList args;
0059     svn::Revision start, end;
0060 
0061     // for output
0062     QString outfile;
0063     QTextStream Stdout, Stderr;
0064     DummyDisplay *disp;
0065     QMap<int, svn::Revision> extraRevisions;
0066     QMap<int, QUrl> repoUrls;
0067 };
0068 
0069 pCPart::pCPart()
0070     : cmd()
0071     , urls()
0072     , ask_revision(false)
0073     , rev_set(false)
0074     , outfile_set(false)
0075     , single_revision(false)
0076     , force(false)
0077     , log_limit(0)
0078     , m_SvnWrapper(nullptr)
0079     , parser(nullptr)
0080     , start(svn::Revision::UNDEFINED)
0081     , end(svn::Revision::UNDEFINED)
0082     , Stdout(stdout)
0083     , Stderr(stderr)
0084     , disp(new DummyDisplay())
0085 {
0086     m_SvnWrapper = new SvnActions(disp, true);
0087 }
0088 
0089 pCPart::~pCPart()
0090 {
0091     delete m_SvnWrapper;
0092     delete disp;
0093 }
0094 
0095 CommandExec::CommandExec(QObject *parent)
0096     : QObject(parent)
0097     , m_lastMessagesLines(0)
0098 {
0099     m_pCPart = new pCPart;
0100     m_pCPart->parser = nullptr;
0101     SshAgent ag;
0102     ag.querySshAgent();
0103 
0104     connect(m_pCPart->m_SvnWrapper, &SvnActions::clientException, this, &CommandExec::clientException);
0105     connect(m_pCPart->m_SvnWrapper, &SvnActions::sendNotify, this, &CommandExec::slotNotifyMessage);
0106     m_pCPart->m_SvnWrapper->reInitClient();
0107 }
0108 
0109 
0110 CommandExec::~CommandExec()
0111 {
0112     delete m_pCPart;
0113 }
0114 
0115 int CommandExec::exec(const QCommandLineParser *parser)
0116 {
0117     m_pCPart->parser = const_cast<QCommandLineParser*>(parser);
0118     m_pCPart->args = parser->positionalArguments();
0119     if (m_pCPart->args.isEmpty()) {
0120         return -1;
0121     }
0122     m_lastMessages.clear();
0123     m_lastMessagesLines = 0;
0124     m_pCPart->m_SvnWrapper->reInitClient();
0125     bool dont_check_second = false;
0126     bool dont_check_all = false;
0127     bool path_only = false;
0128     bool no_revision = false;
0129     bool check_force = false;
0130 
0131     if (m_pCPart->args.count() >= 2) {
0132         m_pCPart->cmd = m_pCPart->args.at(1);
0133         m_pCPart->cmd = m_pCPart->cmd.toLower();
0134     }
0135     QByteArray slotCmd;
0136     if (!QString::compare(m_pCPart->cmd, QLatin1String("log"))) {
0137         slotCmd = SLOT(slotCmd_log());
0138     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("cat"))) {
0139         slotCmd = SLOT(slotCmd_cat());
0140         m_pCPart->single_revision = true;
0141     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("get"))) {
0142         slotCmd = SLOT(slotCmd_get());
0143         m_pCPart->single_revision = true;
0144     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("help"))) {
0145         slotCmd = SLOT(slotCmd_help());
0146     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("blame")) ||
0147                !QString::compare(m_pCPart->cmd, QLatin1String("annotate"))) {
0148         slotCmd = SLOT(slotCmd_blame());
0149     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("update"))) {
0150         slotCmd = SLOT(slotCmd_update());
0151         m_pCPart->single_revision = true;
0152     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("diff"))) {
0153         m_pCPart->start = svn::Revision::WORKING;
0154         slotCmd = SLOT(slotCmd_diff());
0155     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("info"))) {
0156         slotCmd = SLOT(slotCmd_info());
0157         m_pCPart->single_revision = true;
0158     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("commit")) ||
0159                !QString::compare(m_pCPart->cmd, QLatin1String("ci"))) {
0160         slotCmd = SLOT(slotCmd_commit());
0161     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("list")) ||
0162                !QString::compare(m_pCPart->cmd, QLatin1String("ls"))) {
0163         slotCmd = SLOT(slotCmd_list());
0164     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("copy")) ||
0165                !QString::compare(m_pCPart->cmd, QLatin1String("cp"))) {
0166         slotCmd = SLOT(slotCmd_copy());
0167         dont_check_second = true;
0168     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("move")) ||
0169                !QString::compare(m_pCPart->cmd, QLatin1String("rename")) ||
0170                !QString::compare(m_pCPart->cmd, QLatin1String("mv"))) {
0171         slotCmd = SLOT(slotCmd_move());
0172         dont_check_second = true;
0173     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checkout")) ||
0174                !QString::compare(m_pCPart->cmd, QLatin1String("co"))) {
0175         slotCmd = SLOT(slotCmd_checkout());
0176         dont_check_second = true;
0177     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checkoutto")) ||
0178                !QString::compare(m_pCPart->cmd, QLatin1String("coto"))) {
0179         slotCmd = SLOT(slotCmd_checkoutto());
0180         dont_check_second = true;
0181     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("export"))) {
0182         slotCmd = SLOT(slotCmd_export());
0183         dont_check_second = true;
0184     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("exportto"))) {
0185         slotCmd = SLOT(slotCmd_exportto());
0186         dont_check_second = true;
0187     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("delete")) ||
0188                !QString::compare(m_pCPart->cmd, QLatin1String("del")) ||
0189                !QString::compare(m_pCPart->cmd, QLatin1String("rm")) ||
0190                !QString::compare(m_pCPart->cmd, QLatin1String("remove"))) {
0191         slotCmd = SLOT(slotCmd_delete());
0192     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("add"))) {
0193         slotCmd = SLOT(slotCmd_add());
0194         dont_check_all = true;
0195         path_only = true;
0196     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("undo")) ||
0197                !QString::compare(m_pCPart->cmd, QLatin1String("revert"))) {
0198         slotCmd = SLOT(slotCmd_revert());
0199     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checknew")) ||
0200                !QString::compare(m_pCPart->cmd, QLatin1String("addnew"))) {
0201         slotCmd = SLOT(slotCmd_addnew());
0202     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("switch"))) {
0203         slotCmd = SLOT(slotCmd_switch());
0204     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("tree"))) {
0205         slotCmd = SLOT(slotCmd_tree());
0206     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("lock"))) {
0207         slotCmd = SLOT(slotCmd_lock());
0208         no_revision = true;
0209         check_force = true;
0210     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("unlock"))) {
0211         slotCmd = SLOT(slotCmd_unlock());
0212         no_revision = true;
0213         check_force = true;
0214     }
0215 
0216     bool found = connect(this, SIGNAL(executeMe()), this, slotCmd.constData());
0217     if (!found) {
0218         KMessageBox::sorry(nullptr,
0219                            i18n("Command \"%1\" not implemented or known", m_pCPart->cmd),
0220                            i18n("SVN Error"));
0221         return -1;
0222     }
0223 
0224     QString tmp;
0225     QString mainProto;
0226     for (int j = 2; j < m_pCPart->args.count(); ++j) {
0227         QUrl tmpurl = QUrl::fromUserInput(m_pCPart->args.at(j),
0228                                           QDir::currentPath());
0229         tmpurl.setScheme(svn::Url::transformProtokoll(tmpurl.scheme()));
0230         if (tmpurl.scheme().contains(QLatin1String("ssh"))) {
0231             SshAgent ag;
0232             // this class itself checks if done before
0233             ag.addSshIdentities();
0234         }
0235         m_pCPart->extraRevisions[j - 2] = svn::Revision::HEAD;
0236 
0237         if (tmpurl.isLocalFile() && (j == 2 || !dont_check_second) && !dont_check_all) {
0238             QUrl repoUrl;
0239             if (m_pCPart->m_SvnWrapper->isLocalWorkingCopy(tmpurl.path(), repoUrl)) {
0240                 tmp = tmpurl.path();
0241                 m_pCPart->repoUrls[j - 2] = repoUrl;
0242                 m_pCPart->extraRevisions[j - 2] = svn::Revision::WORKING;
0243                 if (j == 2) {
0244                     mainProto.clear();
0245                 }
0246             } else {
0247                 tmp = tmpurl.url();
0248                 if (j == 2) {
0249                     mainProto = QLatin1String("file://");
0250                 }
0251             }
0252         } else if (path_only) {
0253             tmp = tmpurl.path();
0254         } else {
0255             tmp = tmpurl.url();
0256             if (j == 2) {
0257                 mainProto = tmpurl.scheme();
0258             }
0259         }
0260         if ((j > 2 && dont_check_second) || dont_check_all) {
0261             if (mainProto.isEmpty()) {
0262                 tmp = tmpurl.path();
0263             }
0264         }
0265         const QVector<QStringRef> l = tmp.splitRef(QLatin1Char('?'), QString::SkipEmptyParts);
0266         if (!l.isEmpty()) {
0267             tmp = l.first().toString();
0268         }
0269         while (tmp.endsWith(QLatin1Char('/'))) {
0270             tmp.chop(1);
0271         }
0272         m_pCPart->urls.append(tmp);
0273         if ((j > 2 && dont_check_second) || dont_check_all) {
0274             continue;
0275         }
0276         const QList<QPair<QString, QString> > q = QUrlQuery(tmpurl).queryItems();
0277         for (const auto &item : q) {
0278             if (item.first == QLatin1String("rev")) {
0279                 svn::Revision re = item.second;
0280                 if (re) {
0281                     m_pCPart->extraRevisions[j - 2] = re;
0282                 }
0283             }
0284         }
0285     }
0286     if (m_pCPart->urls.isEmpty()) {
0287         m_pCPart->urls.append(QLatin1String("."));
0288     }
0289 
0290     if (!no_revision) {
0291         if (m_pCPart->parser->isSet("R")) {
0292             m_pCPart->ask_revision = true;
0293             if (!askRevision()) {
0294                 return 0;
0295             }
0296         } else if (m_pCPart->parser->isSet("r")) {
0297             scanRevision();
0298         }
0299     }
0300 
0301     m_pCPart->force = check_force && m_pCPart->parser->isSet("f");
0302 
0303     if (m_pCPart->parser->isSet("o")) {
0304         m_pCPart->outfile_set = true;
0305         m_pCPart->outfile = m_pCPart->parser->value("o");
0306     }
0307     if (m_pCPart->parser->isSet("l")) {
0308         QString s = m_pCPart->parser->value("l");
0309         m_pCPart->log_limit = s.toInt();
0310         if (m_pCPart->log_limit < 0) {
0311             m_pCPart->log_limit = 0;
0312         }
0313     }
0314 
0315     emit executeMe();
0316     if (Kdesvnsettings::self()->cmdline_show_logwindow() &&
0317             m_lastMessagesLines >= Kdesvnsettings::self()->cmdline_log_minline()) {
0318         QPointer<KSvnSimpleOkDialog> dlg(new KSvnSimpleOkDialog(QStringLiteral("kdesvn_cmd_log"), QApplication::activeModalWidget()));
0319         QTextBrowser *ptr = new QTextBrowser(dlg);
0320         ptr->setText(m_lastMessages);
0321         ptr->setReadOnly(true);
0322         dlg->addWidget(ptr);
0323         QString cmd = qApp->arguments().join(QLatin1Char(' '));
0324         dlg->setWindowTitle(cmd);
0325         dlg->exec();
0326         delete dlg;
0327     }
0328     return 0;
0329 }
0330 
0331 
0332 
0333 /*!
0334     \fn CommandExec::clientException(const QString&)
0335  */
0336 void CommandExec::clientException(const QString &what)
0337 {
0338     m_pCPart->Stderr << what << endl;
0339     KMessageBox::sorry(nullptr, what, i18n("SVN Error"));
0340 }
0341 
0342 
0343 void CommandExec::slotCmd_log()
0344 {
0345     int limit = m_pCPart->log_limit;
0346     if (m_pCPart->end == svn::Revision::UNDEFINED) {
0347         m_pCPart->end = svn::Revision::HEAD;
0348     }
0349     if (m_pCPart->start == svn::Revision::UNDEFINED) {
0350         m_pCPart->start = 1;
0351     }
0352     bool list = Kdesvnsettings::self()->log_always_list_changed_files();
0353     if (m_pCPart->extraRevisions[0] == svn::Revision::WORKING) {
0354         m_pCPart->extraRevisions[0] = svn::Revision::UNDEFINED;
0355     }
0356     m_pCPart->m_SvnWrapper->makeLog(m_pCPart->start, m_pCPart->end,
0357                                     m_pCPart->extraRevisions.value(0),
0358                                     m_pCPart->urls.at(0),
0359                                     Kdesvnsettings::log_follows_nodes(),
0360                                     list,
0361                                     limit);
0362 }
0363 
0364 void CommandExec::slotCmd_tree()
0365 {
0366     if (m_pCPart->end == svn::Revision::UNDEFINED) {
0367         m_pCPart->end = svn::Revision::HEAD;
0368     }
0369     if (m_pCPart->start == svn::Revision::UNDEFINED) {
0370         m_pCPart->start = 1;
0371     }
0372     m_pCPart->m_SvnWrapper->makeTree(m_pCPart->urls.at(0), m_pCPart->extraRevisions.value(0),
0373                                      m_pCPart->start, m_pCPart->end);
0374 }
0375 
0376 void CommandExec::slotCmd_checkout()
0377 {
0378     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0),
0379                                                                QDir::currentPath()), false);
0380 }
0381 
0382 void CommandExec::slotCmd_checkoutto()
0383 {
0384     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0),
0385                                                                QDir::currentPath()), false, true);
0386 }
0387 
0388 void CommandExec::slotCmd_export()
0389 {
0390     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0),
0391                                                                QDir::currentPath()), true);
0392 }
0393 
0394 void CommandExec::slotCmd_exportto()
0395 {
0396     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0),
0397                                                                QDir::currentPath()), true, true);
0398 }
0399 
0400 void CommandExec::slotCmd_blame()
0401 {
0402     if (!m_pCPart->end) {
0403         m_pCPart->end = svn::Revision::HEAD;
0404     }
0405     if (!m_pCPart->start) {
0406         m_pCPart->start = 1;
0407     }
0408     m_pCPart->m_SvnWrapper->makeBlame(m_pCPart->start, m_pCPart->end, m_pCPart->urls.at(0));
0409 }
0410 
0411 void CommandExec::slotCmd_cat()
0412 {
0413     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0414     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0415         m_pCPart->rev_set = true;
0416         m_pCPart->start = cIt.value();
0417     } else {
0418         m_pCPart->end = svn::Revision::HEAD;
0419     }
0420     m_pCPart->m_SvnWrapper->slotMakeCat(
0421         (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end), m_pCPart->urls.at(0), m_pCPart->urls.at(0)
0422         , (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end), nullptr);
0423 }
0424 
0425 void CommandExec::slotCmd_get()
0426 {
0427     if (m_pCPart->extraRevisions.find(0) != m_pCPart->extraRevisions.end()) {
0428         m_pCPart->rev_set = true;
0429         m_pCPart->start = m_pCPart->extraRevisions[0];
0430     } else {
0431         m_pCPart->end = svn::Revision::HEAD;
0432     }
0433     if (!m_pCPart->outfile_set || m_pCPart->outfile.isEmpty()) {
0434         clientException(i18n("\"GET\" requires output file"));
0435         return;
0436     }
0437     m_pCPart->m_SvnWrapper->makeGet((m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end), m_pCPart->urls.at(0), m_pCPart->outfile,
0438                                     (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end));
0439 }
0440 
0441 void CommandExec::slotCmd_update()
0442 {
0443     const svn::Targets targets = svn::Targets::fromStringList(m_pCPart->urls);
0444     m_pCPart->m_SvnWrapper->makeUpdate(targets,
0445                                        (m_pCPart->rev_set ? m_pCPart->start : svn::Revision::HEAD), svn::DepthUnknown);
0446 }
0447 
0448 void CommandExec::slotCmd_diff()
0449 {
0450     if (m_pCPart->urls.count() == 1) {
0451         if (!m_pCPart->rev_set && !svn::Url::isValid(m_pCPart->urls.at(0))) {
0452             m_pCPart->start = svn::Revision::BASE;
0453             m_pCPart->end = svn::Revision::WORKING;
0454         }
0455         m_pCPart->m_SvnWrapper->makeDiff(m_pCPart->urls.at(0), m_pCPart->start, m_pCPart->urls.at(0), m_pCPart->end);
0456     } else {
0457         svn::Revision r1 = svn::Revision::HEAD;
0458         svn::Revision r2 = svn::Revision::HEAD;
0459         QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0460         if (cIt != m_pCPart->extraRevisions.constEnd()) {
0461             r1 = cIt.value();
0462         } else if (!svn::Url::isValid(m_pCPart->urls.at(0))) {
0463             r1 = svn::Revision::WORKING;
0464         }
0465         if (m_pCPart->extraRevisions.find(1) != m_pCPart->extraRevisions.end()) {
0466             r2 = m_pCPart->extraRevisions[1];
0467         } else if (!svn::Url::isValid(m_pCPart->urls.at(1))) {
0468             r2 = svn::Revision::WORKING;
0469         }
0470         m_pCPart->m_SvnWrapper->makeDiff(m_pCPart->urls.at(0), r1, m_pCPart->urls.at(1), r2);
0471     }
0472 }
0473 
0474 void CommandExec::slotCmd_info()
0475 {
0476     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0477     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0478         m_pCPart->rev_set = true;
0479         m_pCPart->start = cIt.value();
0480     }
0481     m_pCPart->m_SvnWrapper->makeInfo(m_pCPart->urls, (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end),
0482                                      svn::Revision::UNDEFINED, false);
0483 }
0484 
0485 void CommandExec::slotCmd_commit()
0486 {
0487     const svn::Targets targets(svn::Targets::fromStringList(m_pCPart->urls));
0488     m_pCPart->m_SvnWrapper->makeCommit(targets);
0489 }
0490 
0491 void CommandExec::slotCmd_list()
0492 {
0493     svn::DirEntries res;
0494     svn::Revision rev = m_pCPart->end;
0495     if (m_pCPart->rev_set) {
0496         rev = m_pCPart->start;
0497     } else if (m_pCPart->extraRevisions[0]) {
0498         rev = m_pCPart->extraRevisions[0];
0499     }
0500     if (!m_pCPart->m_SvnWrapper->makeList(m_pCPart->urls.at(0), res, rev, svn::DepthInfinity)) {
0501         return;
0502     }
0503     for (const svn::DirEntry &entry : qAsConst(res)) {
0504         QString d = entry.time().toString(QStringLiteral("yyyy-MM-dd hh:mm::ss"));
0505         m_pCPart->Stdout
0506                 << (entry.kind() == svn_node_dir ? "D" : "F") << " "
0507                 << d << " "
0508                 << entry.name() << endl;
0509     }
0510 }
0511 
0512 void CommandExec::slotCmd_copy()
0513 {
0514     QString target;
0515     if (m_pCPart->urls.count() < 2) {
0516         bool ok;
0517         target = CopyMoveView_impl::getMoveCopyTo(&ok, false,
0518                                                   m_pCPart->urls.at(0), QString(), nullptr);
0519         if (!ok) {
0520             return;
0521         }
0522     } else {
0523         target = m_pCPart->urls.at(1);
0524     }
0525     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0526     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0527         m_pCPart->rev_set = true;
0528         m_pCPart->start = cIt.value();
0529     } else {
0530         m_pCPart->end = svn::Revision::HEAD;
0531     }
0532     m_pCPart->m_SvnWrapper->makeCopy(m_pCPart->urls.at(0), target, (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end));
0533 }
0534 
0535 void CommandExec::slotCmd_move()
0536 {
0537     bool ok;
0538     QString target;
0539     if (m_pCPart->urls.count() < 2) {
0540         target = CopyMoveView_impl::getMoveCopyTo(&ok, true,
0541                                                   m_pCPart->urls.at(0), QString(), nullptr);
0542         if (!ok) {
0543             return;
0544         }
0545     } else {
0546         target = m_pCPart->urls.at(1);
0547     }
0548     m_pCPart->m_SvnWrapper->makeMove(m_pCPart->urls.at(0), target);
0549 }
0550 
0551 void CommandExec::slotCmd_delete()
0552 {
0553     m_pCPart->m_SvnWrapper->makeDelete(m_pCPart->urls);
0554 }
0555 
0556 void CommandExec::slotCmd_add()
0557 {
0558     m_pCPart->m_SvnWrapper->addItems(svn::Targets::fromStringList(m_pCPart->urls), svn::DepthInfinity);
0559 }
0560 
0561 void CommandExec::slotCmd_revert()
0562 {
0563     m_pCPart->m_SvnWrapper->slotRevertItems(m_pCPart->urls);
0564 }
0565 
0566 void CommandExec::slotCmd_addnew()
0567 {
0568     m_pCPart->m_SvnWrapper->checkAddItems(m_pCPart->urls.at(0));
0569 }
0570 
0571 /*!
0572     \fn CommandExec::scanRevision()
0573  */
0574 bool CommandExec::scanRevision()
0575 {
0576     const QString revstring = m_pCPart->parser->value(QStringLiteral("r"));
0577     const QVector<QStringRef> revl = revstring.splitRef(QLatin1Char(':'), QString::SkipEmptyParts);
0578     if (revl.isEmpty()) {
0579         return false;
0580     }
0581     m_pCPart->start = revl[0].toString();
0582     if (revl.count() > 1) {
0583         m_pCPart->end = revl[1].toString();
0584     }
0585     m_pCPart->rev_set = true;
0586     return true;
0587 }
0588 
0589 void CommandExec::slotNotifyMessage(const QString &msg)
0590 {
0591     m_pCPart->m_SvnWrapper->slotExtraLogMsg(msg);
0592     if (Kdesvnsettings::self()->cmdline_show_logwindow()) {
0593         ++m_lastMessagesLines;
0594         if (!m_lastMessages.isEmpty()) {
0595             m_lastMessages.append("\n");
0596         }
0597         m_lastMessages.append(msg);
0598     }
0599 }
0600 
0601 bool CommandExec::askRevision()
0602 {
0603     bool ret = false;
0604     Rangeinput_impl::revision_range range;
0605     if (Rangeinput_impl::getRevisionRange(range, true, m_pCPart->single_revision)) {
0606         m_pCPart->start = range.first;
0607         m_pCPart->end = range.second;
0608         m_pCPart->rev_set = true;
0609         ret = true;
0610     }
0611     return ret;
0612 }
0613 
0614 
0615 /*!
0616     \fn CommandExec::slotCmd_switch()
0617  */
0618 void CommandExec::slotCmd_switch()
0619 {
0620     if (m_pCPart->urls.count() > 1) {
0621         clientException(i18n("May only switch one URL at time"));
0622         return;
0623     }
0624     if (m_pCPart->repoUrls.find(0) == m_pCPart->repoUrls.end()) {
0625         clientException(i18n("Switch only on working copies"));
0626         return;
0627     }
0628     m_pCPart->m_SvnWrapper->makeSwitch(m_pCPart->urls.at(0),
0629                                        m_pCPart->repoUrls.value(0));
0630 }
0631 
0632 void CommandExec::slotCmd_lock()
0633 {
0634 //     m_pCPart->m_SvnWrapper->makeLock(m_pCPart->urls.at(0),"",m_pCPart->force);
0635     m_pCPart->m_SvnWrapper->makeLock(m_pCPart->urls, QString(), m_pCPart->force);
0636 }
0637 
0638 void CommandExec::slotCmd_unlock()
0639 {
0640 //     m_pCPart->m_SvnWrapper->makeUnlock(m_pCPart->urls.at(0),m_pCPart->force);
0641     m_pCPart->m_SvnWrapper->makeUnlock(m_pCPart->urls, m_pCPart->force);
0642 }