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"