diff --git a/src/kiosvn/kiosvn.cpp b/src/kiosvn/kiosvn.cpp --- a/src/kiosvn/kiosvn.cpp +++ b/src/kiosvn/kiosvn.cpp @@ -316,7 +316,7 @@ void kio_svnProtocol::mkdir(const QList &urls, int) { try { - m_pData->m_Svnclient->mkdir(svn::Targets::fromUrlList(urls), getDefaultLog()); + m_pData->m_Svnclient->mkdir(svn::Targets::fromUrlList(urls, svn::Targets::UrlConversion::PreferLocalPath), getDefaultLog()); } catch (const svn::ClientException &e) { extraError(KIO::ERR_SLAVE_DEFINED, e.msg()); return; @@ -808,7 +808,7 @@ msg = lt[0]; svn::Revision nnum = svn::Revision::UNDEFINED; svn::CommitParameter commit_parameters; - commit_parameters.targets(svn::Targets::fromUrlList(urls)).message(msg).depth(svn::DepthInfinity).keepLocks(false); + commit_parameters.targets(svn::Targets::fromUrlList(urls, svn::Targets::UrlConversion::PreferLocalPath)).message(msg).depth(svn::DepthInfinity).keepLocks(false); try { nnum = m_pData->m_Svnclient->commit(commit_parameters); @@ -898,7 +898,7 @@ void kio_svnProtocol::revert(const QList &urls) { try { - m_pData->m_Svnclient->revert(svn::Targets::fromUrlList(urls), svn::DepthEmpty); + m_pData->m_Svnclient->revert(svn::Targets::fromUrlList(urls, svn::Targets::UrlConversion::PreferLocalPath), svn::DepthEmpty); } catch (const svn::ClientException &e) { extraError(KIO::ERR_SLAVE_DEFINED, e.msg()); } @@ -979,7 +979,7 @@ void kio_svnProtocol::wc_delete(const QList &urls) { try { - m_pData->m_Svnclient->remove(svn::Targets::fromUrlList(urls), false); + m_pData->m_Svnclient->remove(svn::Targets::fromUrlList(urls, svn::Targets::UrlConversion::PreferLocalPath), false); } catch (const svn::ClientException &e) { extraError(KIO::ERR_SLAVE_DEFINED, e.msg()); return; diff --git a/src/svnfrontend/svnactions.cpp b/src/svnfrontend/svnactions.cpp --- a/src/svnfrontend/svnactions.cpp +++ b/src/svnfrontend/svnactions.cpp @@ -2227,8 +2227,10 @@ StopDlg sdlg(m_Data->m_SvnContextListener, m_Data->m_ParentList->realWidget(), i18n("Move"), i18n("Moving entries")); connect(this, SIGNAL(sigExtraLogMsg(QString)), &sdlg, SLOT(slotExtraMessage(QString))); - const svn::Targets t(svn::Targets::fromUrlList(Old)); - m_Data->m_Svnclient->move(svn::CopyParameter(t, svn::Path(New)).asChild(true).makeParent(false)); + const svn::Path pNew(New); + // either both are local paths -> move in wc, or both are urls -> move in repository + const svn::Targets t(svn::Targets::fromUrlList(Old, pNew.isUrl() ? svn::Targets::UrlConversion::KeepUrl : svn::Targets::UrlConversion::PreferLocalPath)); + m_Data->m_Svnclient->move(svn::CopyParameter(t, pNew).asChild(true).makeParent(false)); } catch (const svn::Exception &e) { emit clientException(e.msg()); return false; @@ -2256,13 +2258,14 @@ bool SvnActions::makeCopy(const QList &Old, const QString &New, const svn::Revision &rev) { - const svn::Targets t(svn::Targets::fromUrlList(Old)); - try { StopDlg sdlg(m_Data->m_SvnContextListener, m_Data->m_ParentList->realWidget(), i18n("Copy / Move"), i18n("Copy or Moving entries")); connect(this, SIGNAL(sigExtraLogMsg(QString)), &sdlg, SLOT(slotExtraMessage(QString))); - m_Data->m_Svnclient->copy(svn::CopyParameter(t, svn::Path(New)).srcRevision(rev).pegRevision(rev).asChild(true)); + const svn::Path pNew(New); + const svn::Targets t(svn::Targets::fromUrlList(Old, pNew.isUrl() ? svn::Targets::UrlConversion::KeepUrl : svn::Targets::UrlConversion::PreferLocalPath)); + // either both are local paths -> copy in wc, or both are urls -> copy in repository + m_Data->m_Svnclient->copy(svn::CopyParameter(t, pNew).srcRevision(rev).pegRevision(rev).asChild(true)); } catch (const svn::Exception &e) { emit clientException(e.msg()); return false; diff --git a/src/svnqt/targets.h b/src/svnqt/targets.h --- a/src/svnqt/targets.h +++ b/src/svnqt/targets.h @@ -122,7 +122,13 @@ /** convenience functions */ static Targets fromStringList(const QStringList &paths); - static Targets fromUrlList(const QList &urls); + enum class UrlConversion + { + KeepUrl, + PreferLocalPath + }; + + static Targets fromUrlList(const QList &urls, UrlConversion conversion); private: Paths m_targets; diff --git a/src/svnqt/targets.cpp b/src/svnqt/targets.cpp --- a/src/svnqt/targets.cpp +++ b/src/svnqt/targets.cpp @@ -127,12 +127,13 @@ return svn::Targets(ret); } -svn::Targets Targets::fromUrlList(const QList &urls) +svn::Targets Targets::fromUrlList(const QList &urls, UrlConversion conversion) { svn::Paths ret; ret.reserve(urls.size()); + const bool preferLocalFile = conversion == UrlConversion::PreferLocalPath; Q_FOREACH(const QUrl &url, urls) { - ret.push_back(svn::Path(url.isLocalFile() ? url.toLocalFile() : url.url())); + ret.push_back(svn::Path((preferLocalFile && url.isLocalFile()) ? url.toLocalFile() : url.url())); } return svn::Targets(ret); }