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 }