File indexing completed on 2024-04-28 05:42:00

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 "helpers/ktranslateurl.h"
0022 #include "helpers/sshagent.h"
0023 #include "helpers/windowgeometryhelper.h"
0024 #include "ksvnwidgets/ksvndialog.h"
0025 #include "settings/kdesvnsettings.h"
0026 #include "svnfrontend/copymoveview_impl.h"
0027 #include "svnfrontend/dummydisplay.h"
0028 #include "svnfrontend/fronthelpers/rangeinput_impl.h"
0029 #include "svnfrontend/svnactions.h"
0030 #include "svnqt/dirent.h"
0031 #include "svnqt/targets.h"
0032 #include "svnqt/url.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 CommandExec::~CommandExec()
0110 {
0111     delete m_pCPart;
0112 }
0113 
0114 int CommandExec::exec(const QCommandLineParser *parser)
0115 {
0116     m_pCPart->parser = const_cast<QCommandLineParser *>(parser);
0117     m_pCPart->args = parser->positionalArguments();
0118     if (m_pCPart->args.isEmpty()) {
0119         return -1;
0120     }
0121     m_lastMessages.clear();
0122     m_lastMessagesLines = 0;
0123     m_pCPart->m_SvnWrapper->reInitClient();
0124     bool dont_check_second = false;
0125     bool dont_check_all = false;
0126     bool path_only = false;
0127     bool no_revision = false;
0128     bool check_force = false;
0129 
0130     if (m_pCPart->args.count() >= 2) {
0131         m_pCPart->cmd = m_pCPart->args.at(1);
0132         m_pCPart->cmd = m_pCPart->cmd.toLower();
0133     }
0134     QByteArray slotCmd;
0135     if (!QString::compare(m_pCPart->cmd, QLatin1String("log"))) {
0136         slotCmd = SLOT(slotCmd_log());
0137     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("cat"))) {
0138         slotCmd = SLOT(slotCmd_cat());
0139         m_pCPart->single_revision = true;
0140     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("get"))) {
0141         slotCmd = SLOT(slotCmd_get());
0142         m_pCPart->single_revision = true;
0143     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("help"))) {
0144         slotCmd = SLOT(slotCmd_help());
0145     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("blame")) || !QString::compare(m_pCPart->cmd, QLatin1String("annotate"))) {
0146         slotCmd = SLOT(slotCmd_blame());
0147     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("update"))) {
0148         slotCmd = SLOT(slotCmd_update());
0149         m_pCPart->single_revision = true;
0150     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("diff"))) {
0151         m_pCPart->start = svn::Revision::WORKING;
0152         slotCmd = SLOT(slotCmd_diff());
0153     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("info"))) {
0154         slotCmd = SLOT(slotCmd_info());
0155         m_pCPart->single_revision = true;
0156     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("commit")) || !QString::compare(m_pCPart->cmd, QLatin1String("ci"))) {
0157         slotCmd = SLOT(slotCmd_commit());
0158     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("list")) || !QString::compare(m_pCPart->cmd, QLatin1String("ls"))) {
0159         slotCmd = SLOT(slotCmd_list());
0160     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("copy")) || !QString::compare(m_pCPart->cmd, QLatin1String("cp"))) {
0161         slotCmd = SLOT(slotCmd_copy());
0162         dont_check_second = true;
0163     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("move")) || !QString::compare(m_pCPart->cmd, QLatin1String("rename"))
0164                || !QString::compare(m_pCPart->cmd, QLatin1String("mv"))) {
0165         slotCmd = SLOT(slotCmd_move());
0166         dont_check_second = true;
0167     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checkout")) || !QString::compare(m_pCPart->cmd, QLatin1String("co"))) {
0168         slotCmd = SLOT(slotCmd_checkout());
0169         dont_check_second = true;
0170     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checkoutto")) || !QString::compare(m_pCPart->cmd, QLatin1String("coto"))) {
0171         slotCmd = SLOT(slotCmd_checkoutto());
0172         dont_check_second = true;
0173     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("export"))) {
0174         slotCmd = SLOT(slotCmd_export());
0175         dont_check_second = true;
0176     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("exportto"))) {
0177         slotCmd = SLOT(slotCmd_exportto());
0178         dont_check_second = true;
0179     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("delete")) || !QString::compare(m_pCPart->cmd, QLatin1String("del"))
0180                || !QString::compare(m_pCPart->cmd, QLatin1String("rm")) || !QString::compare(m_pCPart->cmd, QLatin1String("remove"))) {
0181         slotCmd = SLOT(slotCmd_delete());
0182     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("add"))) {
0183         slotCmd = SLOT(slotCmd_add());
0184         dont_check_all = true;
0185         path_only = true;
0186     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("undo")) || !QString::compare(m_pCPart->cmd, QLatin1String("revert"))) {
0187         slotCmd = SLOT(slotCmd_revert());
0188     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("checknew")) || !QString::compare(m_pCPart->cmd, QLatin1String("addnew"))) {
0189         slotCmd = SLOT(slotCmd_addnew());
0190     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("switch"))) {
0191         slotCmd = SLOT(slotCmd_switch());
0192     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("tree"))) {
0193         slotCmd = SLOT(slotCmd_tree());
0194     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("lock"))) {
0195         slotCmd = SLOT(slotCmd_lock());
0196         no_revision = true;
0197         check_force = true;
0198     } else if (!QString::compare(m_pCPart->cmd, QLatin1String("unlock"))) {
0199         slotCmd = SLOT(slotCmd_unlock());
0200         no_revision = true;
0201         check_force = true;
0202     }
0203 
0204     bool found = connect(this, SIGNAL(executeMe()), this, slotCmd.constData());
0205     if (!found) {
0206         KMessageBox::error(nullptr, i18n("Command \"%1\" not implemented or known", m_pCPart->cmd), i18n("SVN Error"));
0207         return -1;
0208     }
0209 
0210     QString tmp;
0211     QString mainProto;
0212     for (int j = 2; j < m_pCPart->args.count(); ++j) {
0213         QUrl tmpurl = QUrl::fromUserInput(m_pCPart->args.at(j), QDir::currentPath());
0214         tmpurl.setScheme(svn::Url::transformProtokoll(tmpurl.scheme()));
0215         if (tmpurl.scheme().contains(QLatin1String("ssh"))) {
0216             SshAgent ag;
0217             // this class itself checks if done before
0218             ag.addSshIdentities();
0219         }
0220         m_pCPart->extraRevisions[j - 2] = svn::Revision::HEAD;
0221 
0222         if (tmpurl.isLocalFile() && (j == 2 || !dont_check_second) && !dont_check_all) {
0223             QUrl repoUrl;
0224             if (m_pCPart->m_SvnWrapper->isLocalWorkingCopy(tmpurl.path(), repoUrl)) {
0225                 tmp = tmpurl.path();
0226                 m_pCPart->repoUrls[j - 2] = repoUrl;
0227                 m_pCPart->extraRevisions[j - 2] = svn::Revision::WORKING;
0228                 if (j == 2) {
0229                     mainProto.clear();
0230                 }
0231             } else {
0232                 tmp = tmpurl.url();
0233                 if (j == 2) {
0234                     mainProto = QLatin1String("file://");
0235                 }
0236             }
0237         } else if (path_only) {
0238             tmp = tmpurl.path();
0239         } else {
0240             tmp = tmpurl.url();
0241             if (j == 2) {
0242                 mainProto = tmpurl.scheme();
0243             }
0244         }
0245         if ((j > 2 && dont_check_second) || dont_check_all) {
0246             if (mainProto.isEmpty()) {
0247                 tmp = tmpurl.path();
0248             }
0249         }
0250         const QVector<QStringRef> l = tmp.splitRef(QLatin1Char('?'), QString::SkipEmptyParts);
0251         if (!l.isEmpty()) {
0252             tmp = l.first().toString();
0253         }
0254         while (tmp.endsWith(QLatin1Char('/'))) {
0255             tmp.chop(1);
0256         }
0257         m_pCPart->urls.append(tmp);
0258         if ((j > 2 && dont_check_second) || dont_check_all) {
0259             continue;
0260         }
0261         const QList<QPair<QString, QString>> q = QUrlQuery(tmpurl).queryItems();
0262         for (const auto &item : q) {
0263             if (item.first == QLatin1String("rev")) {
0264                 svn::Revision re = item.second;
0265                 if (re) {
0266                     m_pCPart->extraRevisions[j - 2] = re;
0267                 }
0268             }
0269         }
0270     }
0271     if (m_pCPart->urls.isEmpty()) {
0272         m_pCPart->urls.append(QLatin1String("."));
0273     }
0274 
0275     if (!no_revision) {
0276         if (m_pCPart->parser->isSet("R")) {
0277             m_pCPart->ask_revision = true;
0278             if (!askRevision()) {
0279                 return 0;
0280             }
0281         } else if (m_pCPart->parser->isSet("r")) {
0282             scanRevision();
0283         }
0284     }
0285 
0286     m_pCPart->force = check_force && m_pCPart->parser->isSet("f");
0287 
0288     if (m_pCPart->parser->isSet("o")) {
0289         m_pCPart->outfile_set = true;
0290         m_pCPart->outfile = m_pCPart->parser->value("o");
0291     }
0292     if (m_pCPart->parser->isSet("l")) {
0293         QString s = m_pCPart->parser->value("l");
0294         m_pCPart->log_limit = s.toInt();
0295         if (m_pCPart->log_limit < 0) {
0296             m_pCPart->log_limit = 0;
0297         }
0298     }
0299 
0300     emit executeMe();
0301     if (Kdesvnsettings::self()->cmdline_show_logwindow() && m_lastMessagesLines >= Kdesvnsettings::self()->cmdline_log_minline()) {
0302         QPointer<KSvnSimpleOkDialog> dlg(new KSvnSimpleOkDialog(QStringLiteral("kdesvn_cmd_log"), QApplication::activeModalWidget()));
0303         QTextBrowser *ptr = new QTextBrowser(dlg);
0304         ptr->setText(m_lastMessages);
0305         ptr->setReadOnly(true);
0306         dlg->addWidget(ptr);
0307         QString cmd = qApp->arguments().join(QLatin1Char(' '));
0308         dlg->setWindowTitle(cmd);
0309         dlg->exec();
0310         delete dlg;
0311     }
0312     return 0;
0313 }
0314 
0315 /*!
0316     \fn CommandExec::clientException(const QString&)
0317  */
0318 void CommandExec::clientException(const QString &what)
0319 {
0320     m_pCPart->Stderr << what << Qt::endl;
0321     KMessageBox::error(nullptr, what, i18n("SVN Error"));
0322 }
0323 
0324 void CommandExec::slotCmd_log()
0325 {
0326     int limit = m_pCPart->log_limit;
0327     if (m_pCPart->end == svn::Revision::UNDEFINED) {
0328         m_pCPart->end = svn::Revision::HEAD;
0329     }
0330     if (m_pCPart->start == svn::Revision::UNDEFINED) {
0331         m_pCPart->start = 1;
0332     }
0333     bool list = Kdesvnsettings::self()->log_always_list_changed_files();
0334     if (m_pCPart->extraRevisions[0] == svn::Revision::WORKING) {
0335         m_pCPart->extraRevisions[0] = svn::Revision::UNDEFINED;
0336     }
0337     m_pCPart->m_SvnWrapper
0338         ->makeLog(m_pCPart->start, m_pCPart->end, m_pCPart->extraRevisions.value(0), m_pCPart->urls.at(0), Kdesvnsettings::log_follows_nodes(), list, limit);
0339 }
0340 
0341 void CommandExec::slotCmd_tree()
0342 {
0343     if (m_pCPart->end == svn::Revision::UNDEFINED) {
0344         m_pCPart->end = svn::Revision::HEAD;
0345     }
0346     if (m_pCPart->start == svn::Revision::UNDEFINED) {
0347         m_pCPart->start = 1;
0348     }
0349     m_pCPart->m_SvnWrapper->makeTree(m_pCPart->urls.at(0), m_pCPart->extraRevisions.value(0), m_pCPart->start, m_pCPart->end);
0350 }
0351 
0352 void CommandExec::slotCmd_checkout()
0353 {
0354     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0), QDir::currentPath()), false);
0355 }
0356 
0357 void CommandExec::slotCmd_checkoutto()
0358 {
0359     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0), QDir::currentPath()), false, true);
0360 }
0361 
0362 void CommandExec::slotCmd_export()
0363 {
0364     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0), QDir::currentPath()), true);
0365 }
0366 
0367 void CommandExec::slotCmd_exportto()
0368 {
0369     m_pCPart->m_SvnWrapper->CheckoutExport(QUrl::fromUserInput(m_pCPart->urls.at(0), QDir::currentPath()), true, true);
0370 }
0371 
0372 void CommandExec::slotCmd_blame()
0373 {
0374     if (!m_pCPart->end) {
0375         m_pCPart->end = svn::Revision::HEAD;
0376     }
0377     if (!m_pCPart->start) {
0378         m_pCPart->start = 1;
0379     }
0380     m_pCPart->m_SvnWrapper->makeBlame(m_pCPart->start, m_pCPart->end, m_pCPart->urls.at(0));
0381 }
0382 
0383 void CommandExec::slotCmd_cat()
0384 {
0385     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0386     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0387         m_pCPart->rev_set = true;
0388         m_pCPart->start = cIt.value();
0389     } else {
0390         m_pCPart->end = svn::Revision::HEAD;
0391     }
0392     m_pCPart->m_SvnWrapper->slotMakeCat((m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end),
0393                                         m_pCPart->urls.at(0),
0394                                         m_pCPart->urls.at(0),
0395                                         (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end),
0396                                         nullptr);
0397 }
0398 
0399 void CommandExec::slotCmd_get()
0400 {
0401     if (m_pCPart->extraRevisions.find(0) != m_pCPart->extraRevisions.end()) {
0402         m_pCPart->rev_set = true;
0403         m_pCPart->start = m_pCPart->extraRevisions[0];
0404     } else {
0405         m_pCPart->end = svn::Revision::HEAD;
0406     }
0407     if (!m_pCPart->outfile_set || m_pCPart->outfile.isEmpty()) {
0408         clientException(i18n("\"GET\" requires output file"));
0409         return;
0410     }
0411     m_pCPart->m_SvnWrapper->makeGet((m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end),
0412                                     m_pCPart->urls.at(0),
0413                                     m_pCPart->outfile,
0414                                     (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end));
0415 }
0416 
0417 void CommandExec::slotCmd_update()
0418 {
0419     const svn::Targets targets = svn::Targets::fromStringList(m_pCPart->urls);
0420     m_pCPart->m_SvnWrapper->makeUpdate(targets, (m_pCPart->rev_set ? m_pCPart->start : svn::Revision::HEAD), svn::DepthUnknown);
0421 }
0422 
0423 void CommandExec::slotCmd_diff()
0424 {
0425     if (m_pCPart->urls.count() == 1) {
0426         if (!m_pCPart->rev_set && !svn::Url::isValid(m_pCPart->urls.at(0))) {
0427             m_pCPart->start = svn::Revision::BASE;
0428             m_pCPart->end = svn::Revision::WORKING;
0429         }
0430         m_pCPart->m_SvnWrapper->makeDiff(m_pCPart->urls.at(0), m_pCPart->start, m_pCPart->urls.at(0), m_pCPart->end);
0431     } else {
0432         svn::Revision r1 = svn::Revision::HEAD;
0433         svn::Revision r2 = svn::Revision::HEAD;
0434         QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0435         if (cIt != m_pCPart->extraRevisions.constEnd()) {
0436             r1 = cIt.value();
0437         } else if (!svn::Url::isValid(m_pCPart->urls.at(0))) {
0438             r1 = svn::Revision::WORKING;
0439         }
0440         if (m_pCPart->extraRevisions.find(1) != m_pCPart->extraRevisions.end()) {
0441             r2 = m_pCPart->extraRevisions[1];
0442         } else if (!svn::Url::isValid(m_pCPart->urls.at(1))) {
0443             r2 = svn::Revision::WORKING;
0444         }
0445         m_pCPart->m_SvnWrapper->makeDiff(m_pCPart->urls.at(0), r1, m_pCPart->urls.at(1), r2);
0446     }
0447 }
0448 
0449 void CommandExec::slotCmd_info()
0450 {
0451     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0452     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0453         m_pCPart->rev_set = true;
0454         m_pCPart->start = cIt.value();
0455     }
0456     m_pCPart->m_SvnWrapper->makeInfo(m_pCPart->urls, (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end), svn::Revision::UNDEFINED, false);
0457 }
0458 
0459 void CommandExec::slotCmd_commit()
0460 {
0461     const svn::Targets targets(svn::Targets::fromStringList(m_pCPart->urls));
0462     m_pCPart->m_SvnWrapper->makeCommit(targets);
0463 }
0464 
0465 void CommandExec::slotCmd_list()
0466 {
0467     svn::DirEntries res;
0468     svn::Revision rev = m_pCPart->end;
0469     if (m_pCPart->rev_set) {
0470         rev = m_pCPart->start;
0471     } else if (m_pCPart->extraRevisions[0]) {
0472         rev = m_pCPart->extraRevisions[0];
0473     }
0474     if (!m_pCPart->m_SvnWrapper->makeList(m_pCPart->urls.at(0), res, rev, svn::DepthInfinity)) {
0475         return;
0476     }
0477     for (const svn::DirEntry &entry : qAsConst(res)) {
0478         QString d = entry.time().toString(QStringLiteral("yyyy-MM-dd hh:mm::ss"));
0479         m_pCPart->Stdout << (entry.kind() == svn_node_dir ? "D" : "F") << " " << d << " " << entry.name() << Qt::endl;
0480     }
0481 }
0482 
0483 void CommandExec::slotCmd_copy()
0484 {
0485     QString target;
0486     if (m_pCPart->urls.count() < 2) {
0487         bool ok;
0488         target = CopyMoveView_impl::getMoveCopyTo(&ok, false, m_pCPart->urls.at(0), QString(), nullptr);
0489         if (!ok) {
0490             return;
0491         }
0492     } else {
0493         target = m_pCPart->urls.at(1);
0494     }
0495     QMap<int, svn::Revision>::const_iterator cIt = m_pCPart->extraRevisions.constFind(0);
0496     if (cIt != m_pCPart->extraRevisions.constEnd()) {
0497         m_pCPart->rev_set = true;
0498         m_pCPart->start = cIt.value();
0499     } else {
0500         m_pCPart->end = svn::Revision::HEAD;
0501     }
0502     m_pCPart->m_SvnWrapper->makeCopy(m_pCPart->urls.at(0), target, (m_pCPart->rev_set ? m_pCPart->start : m_pCPart->end));
0503 }
0504 
0505 void CommandExec::slotCmd_move()
0506 {
0507     bool ok;
0508     QString target;
0509     if (m_pCPart->urls.count() < 2) {
0510         target = CopyMoveView_impl::getMoveCopyTo(&ok, true, m_pCPart->urls.at(0), QString(), nullptr);
0511         if (!ok) {
0512             return;
0513         }
0514     } else {
0515         target = m_pCPart->urls.at(1);
0516     }
0517     m_pCPart->m_SvnWrapper->makeMove(m_pCPart->urls.at(0), target);
0518 }
0519 
0520 void CommandExec::slotCmd_delete()
0521 {
0522     m_pCPart->m_SvnWrapper->makeDelete(m_pCPart->urls);
0523 }
0524 
0525 void CommandExec::slotCmd_add()
0526 {
0527     m_pCPart->m_SvnWrapper->addItems(svn::Targets::fromStringList(m_pCPart->urls), svn::DepthInfinity);
0528 }
0529 
0530 void CommandExec::slotCmd_revert()
0531 {
0532     m_pCPart->m_SvnWrapper->slotRevertItems(m_pCPart->urls);
0533 }
0534 
0535 void CommandExec::slotCmd_addnew()
0536 {
0537     m_pCPart->m_SvnWrapper->checkAddItems(m_pCPart->urls.at(0));
0538 }
0539 
0540 /*!
0541     \fn CommandExec::scanRevision()
0542  */
0543 bool CommandExec::scanRevision()
0544 {
0545     const QString revstring = m_pCPart->parser->value(QStringLiteral("r"));
0546     const QVector<QStringRef> revl = revstring.splitRef(QLatin1Char(':'), QString::SkipEmptyParts);
0547     if (revl.isEmpty()) {
0548         return false;
0549     }
0550     m_pCPart->start = revl[0].toString();
0551     if (revl.count() > 1) {
0552         m_pCPart->end = revl[1].toString();
0553     }
0554     m_pCPart->rev_set = true;
0555     return true;
0556 }
0557 
0558 void CommandExec::slotNotifyMessage(const QString &msg)
0559 {
0560     m_pCPart->m_SvnWrapper->slotExtraLogMsg(msg);
0561     if (Kdesvnsettings::self()->cmdline_show_logwindow()) {
0562         ++m_lastMessagesLines;
0563         if (!m_lastMessages.isEmpty()) {
0564             m_lastMessages.append("\n");
0565         }
0566         m_lastMessages.append(msg);
0567     }
0568 }
0569 
0570 bool CommandExec::askRevision()
0571 {
0572     bool ret = false;
0573     Rangeinput_impl::revision_range range;
0574     if (Rangeinput_impl::getRevisionRange(range, true, m_pCPart->single_revision)) {
0575         m_pCPart->start = range.first;
0576         m_pCPart->end = range.second;
0577         m_pCPart->rev_set = true;
0578         ret = true;
0579     }
0580     return ret;
0581 }
0582 
0583 /*!
0584     \fn CommandExec::slotCmd_switch()
0585  */
0586 void CommandExec::slotCmd_switch()
0587 {
0588     if (m_pCPart->urls.count() > 1) {
0589         clientException(i18n("May only switch one URL at time"));
0590         return;
0591     }
0592     if (m_pCPart->repoUrls.find(0) == m_pCPart->repoUrls.end()) {
0593         clientException(i18n("Switch only on working copies"));
0594         return;
0595     }
0596     m_pCPart->m_SvnWrapper->makeSwitch(m_pCPart->urls.at(0), m_pCPart->repoUrls.value(0));
0597 }
0598 
0599 void CommandExec::slotCmd_lock()
0600 {
0601     //     m_pCPart->m_SvnWrapper->makeLock(m_pCPart->urls.at(0),"",m_pCPart->force);
0602     m_pCPart->m_SvnWrapper->makeLock(m_pCPart->urls, QString(), m_pCPart->force);
0603 }
0604 
0605 void CommandExec::slotCmd_unlock()
0606 {
0607     //     m_pCPart->m_SvnWrapper->makeUnlock(m_pCPart->urls.at(0),m_pCPart->force);
0608     m_pCPart->m_SvnWrapper->makeUnlock(m_pCPart->urls, m_pCPart->force);
0609 }
0610 
0611 #include "moc_commandexec.cpp"