summaryrefslogtreecommitdiffstats
path: root/src/svnqt/client_modify.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/svnqt/client_modify.cpp')
-rw-r--r--src/svnqt/client_modify.cpp722
1 files changed, 722 insertions, 0 deletions
diff --git a/src/svnqt/client_modify.cpp b/src/svnqt/client_modify.cpp
new file mode 100644
index 0000000..352760b
--- /dev/null
+++ b/src/svnqt/client_modify.cpp
@@ -0,0 +1,722 @@
+/*
+ * Port for usage with qt-framework and development for kdesvn
+ * (C) 2005-2007 by Rajko Albrecht
+ * http://kdesvn.alwins-world.de
+ */
+/*
+ * ====================================================================
+ * Copyright (c) 2002-2005 The RapidSvn Group. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library (in the file LGPL.txt); if not,
+ * write to the Free Software Foundation, Inc., 51 Franklin St,
+ * Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals. For exact contribution history, see the revision
+ * history and logs, available at http://rapidsvn.tigris.org/.
+ * ====================================================================
+ */
+#if defined( _MSC_VER) && _MSC_VER <= 1200
+#pragma warning( disable: 4786 )// debug symbol truncated
+#endif
+// svncpp
+#include "svnqt/client_impl.hpp"
+
+// subversion api
+#include "svn_client.h"
+
+#include "svnqt/exception.hpp"
+#include "svnqt/pool.hpp"
+#include "svnqt/targets.hpp"
+#include "svnqt/svnqt_defines.hpp"
+#include "svnqt/stringarray.hpp"
+
+#include "svnqt/helper.hpp"
+
+namespace svn
+{
+ svn_revnum_t
+ Client_impl::checkout (const Path& url, const Path & destPath,
+ const Revision & revision,
+ const Revision & peg,
+ svn::Depth depth,
+ bool ignore_externals,
+ bool overwrite
+ ) throw (ClientException)
+ {
+ Pool subPool;
+ svn_revnum_t revnum = 0;
+ Path up(url);
+ svn_error_t * error = 0;
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ error = svn_client_checkout3(&revnum,
+ up.cstr(),
+ destPath.cstr(),
+ peg.revision(),
+ revision.revision (),
+ internal::DepthToSvn(depth),
+ ignore_externals,
+ overwrite,
+ *m_context,
+ subPool);
+#else
+ bool recurse = depth==DepthInfinity;
+ Q_UNUSED(overwrite);
+ error = svn_client_checkout2(&revnum,
+ up.cstr(),
+ destPath.cstr(),
+ peg.revision(),
+ revision.revision (),
+ recurse,
+ ignore_externals,
+ *m_context,
+ subPool);
+#endif
+ if(error != NULL)
+ throw ClientException (error);
+ return revnum;
+ }
+
+ Revision Client_impl::remove (const Path & path,bool force,
+ bool keep_local,
+ const PropertiesMap&revProps) throw (ClientException)
+ {
+ Targets targets (path.path());
+ return remove(targets,force,keep_local,revProps);
+ }
+
+ Revision
+ Client_impl::remove (const Targets & targets,
+ bool force,
+ bool keep_local,
+ const PropertiesMap&revProps
+ ) throw (ClientException)
+ {
+ Pool pool;
+
+ svn_commit_info_t *commit_info = 0;
+
+ svn_error_t * error =
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_client_delete3(
+ &commit_info,
+ targets.array(pool),
+ force,
+ keep_local,
+ map2hash(revProps,pool),
+ *m_context,
+ pool
+ );
+#else
+ svn_client_delete2
+ (&commit_info,
+ const_cast<apr_array_header_t*> (targets.array (pool)),
+ force,
+ *m_context,
+ pool);
+ Q_UNUSED(keep_local);
+ Q_UNUSED(revProps);
+#endif
+ if(error != 0) {
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+ }
+
+ void
+ Client_impl::revert (const Targets & targets,
+ Depth depth,
+ const StringArray&changelist
+ ) throw (ClientException)
+ {
+ Pool pool;
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_error_t * error =
+ svn_client_revert2 ((targets.array (pool)),
+ internal::DepthToSvn(depth),
+ changelist.array(pool),
+ *m_context,
+ pool);
+
+#else
+ bool recurse = depth==DepthInfinity;
+ Q_UNUSED(changelist);
+ svn_error_t * error =
+ svn_client_revert ((targets.array (pool)),
+ recurse,
+ *m_context,
+ pool);
+#endif
+ if(error != NULL) {
+ throw ClientException (error);
+ }
+ }
+
+ void
+ Client_impl::add (const Path & path,
+ svn::Depth depth,bool force, bool no_ignore, bool add_parents) throw (ClientException)
+ {
+ Pool pool;
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_error_t * error =
+ svn_client_add4(path.cstr (),
+ internal::DepthToSvn(depth),
+ force,
+ no_ignore,
+ add_parents,
+ *m_context,
+ pool);
+#else
+ Q_UNUSED(add_parents);
+ svn_error_t * error =
+ svn_client_add3 (path.cstr (),
+ depth==DepthInfinity,
+ force,
+ no_ignore,
+ *m_context,
+ pool);
+#endif
+ if(error != NULL)
+ throw ClientException (error);
+ }
+
+ Revisions
+ Client_impl::update (const Targets & path,
+ const Revision & revision,
+ Depth depth,
+ bool ignore_externals,
+ bool allow_unversioned,
+ bool sticky_depth
+ ) throw (ClientException)
+ {
+ Pool pool;
+ Revisions resulting;
+ svn_error_t * error;
+
+ apr_pool_t *apr_pool = pool.pool();
+ apr_array_header_t *apr_revisions = apr_array_make (apr_pool,
+ path.size(),
+ sizeof (svn_revnum_t));
+ if (depth==DepthUnknown) {
+ depth=DepthInfinity;
+ }
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ error = svn_client_update3(&apr_revisions,path.array(pool),revision,internal::DepthToSvn(depth),sticky_depth,ignore_externals,allow_unversioned,*m_context,pool);
+#else
+ bool recurse = depth==DepthInfinity;
+ Q_UNUSED(sticky_depth);
+ Q_UNUSED(allow_unversioned);
+ error = svn_client_update2(&apr_revisions,path.array(pool),revision,recurse,ignore_externals,*m_context,pool);
+#endif
+ if (error!=NULL) {
+ throw ClientException(error);
+ }
+ for (int i = 0; i < apr_revisions->nelts; ++i)
+ {
+ svn_revnum_t * _rev =
+ &APR_ARRAY_IDX (apr_revisions, i, svn_revnum_t);
+
+ resulting.push_back((*_rev));
+ }
+ return resulting;
+ }
+
+ svn::Revision
+ Client_impl::commit (const Targets & targets, const QString& message,
+ svn::Depth depth,bool keep_locks,
+ const svn::StringArray&changelist,
+ const PropertiesMap&revProps,
+ bool keep_changelist) throw (ClientException)
+ {
+ Pool pool;
+
+ m_context->setLogMessage (message);
+ svn_commit_info_t *commit_info = NULL;
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_error_t * error =
+ svn_client_commit4 (
+ &commit_info,
+ targets.array (pool),
+ internal::DepthToSvn(depth),
+ keep_locks,
+ keep_changelist,
+ changelist.array(pool),
+ map2hash(revProps,pool),
+ *m_context,
+ pool);
+#else
+ Q_UNUSED(changelist);
+ Q_UNUSED(keep_changelist);
+ Q_UNUSED(revProps);
+ bool recurse = depth==DepthInfinity;
+
+ svn_error_t * error =
+ svn_client_commit3
+ (&commit_info,
+ targets.array (pool),
+ recurse,
+ keep_locks,
+ *m_context,
+ pool);
+#endif
+ if (error != NULL) {
+ throw ClientException (error);
+ }
+
+ if (commit_info && SVN_IS_VALID_REVNUM (commit_info->revision))
+ return (commit_info->revision);
+
+ return svn::Revision::UNDEFINED;
+ }
+
+ Revision
+ Client_impl::copy(const Targets & srcPaths,
+ const Revision & srcRevision,
+ const Revision &pegRevision,
+ const Path & destPath,
+ bool asChild,bool makeParent,
+ const PropertiesMap&revProps
+ ) throw (ClientException)
+ {
+ if (srcPaths.size()<1)
+ {
+ throw ClientException("Wrong size of sources.");
+ }
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ Pool pool;
+ svn_commit_info_t *commit_info = 0L;
+ apr_array_header_t * sources = apr_array_make(pool,srcPaths.size(),sizeof(svn_client_copy_source_t *));
+ for (size_t j=0;j<srcPaths.size();++j)
+ {
+ svn_client_copy_source_t* source = (svn_client_copy_source_t*)apr_palloc(pool, sizeof(svn_client_copy_source_t));
+ source->path = apr_pstrdup(pool,srcPaths[j].path().TOUTF8());
+ source->revision=srcRevision.revision();
+ source->peg_revision=pegRevision.revision();
+ APR_ARRAY_PUSH(sources, svn_client_copy_source_t *) = source;
+ }
+ svn_error_t * error =
+ svn_client_copy4(&commit_info,
+ sources,
+ destPath.cstr(),
+ asChild,makeParent,map2hash(revProps,pool),*m_context,pool);
+ if (error!=0){
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+#else
+ Q_UNUSED(asChild);
+ Q_UNUSED(makeParent);
+ Q_UNUSED(revProps);
+ Q_UNUSED(pegRevision);
+ Revision rev;
+ if (srcPaths.size()>1 && !asChild)
+ {
+ throw ClientException("Multiple sources not allowed");
+ }
+
+ Path _dest;
+ QString base,dir;
+ for (size_t j=0;j<srcPaths.size();++j)
+ {
+ _dest=destPath;
+ if (asChild) {
+ srcPaths[j].split(dir,base);
+ _dest.addComponent(base);
+ }
+ rev = copy(srcPaths[j],srcRevision,_dest);
+ }
+ return rev;
+#endif
+ }
+
+ Revision
+ Client_impl::copy (const Path & srcPath,
+ const Revision & srcRevision,
+ const Path & destPath) throw (ClientException)
+ {
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ return copy(srcPath,srcRevision,srcRevision,destPath,true,false);
+#else
+ Pool pool;
+ svn_commit_info_t *commit_info = NULL;
+ svn_error_t * error =
+ svn_client_copy2
+ (&commit_info,
+ srcPath.cstr (),
+ srcRevision.revision (),
+ destPath.cstr (),
+ *m_context,
+ pool);
+
+ if(error != 0) {
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+#endif
+ }
+
+ svn::Revision Client_impl::move (const Path & srcPath,
+ const Path & destPath,
+ bool force) throw (ClientException)
+ {
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ return move(srcPath,destPath,force,false,false,PropertiesMap());
+#else
+ Pool pool;
+ svn_commit_info_t *commit_info = 0;
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 4))
+ svn_error_t * error = svn_client_move4
+#else
+ svn_error_t * error = svn_client_move3
+#endif
+ (&commit_info,
+ srcPath.cstr (),
+ destPath.cstr (),
+ force,
+ *m_context,
+ pool);
+
+ if(error != 0) {
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+#endif
+ }
+
+ svn::Revision Client_impl::move (
+ const Targets & srcPaths,
+ const Path & destPath,
+ bool force,
+ bool asChild,
+ bool makeParent,
+ const PropertiesMap&revProps) throw (ClientException)
+ {
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ Pool pool;
+ svn_commit_info_t *commit_info = 0;
+ svn_error_t * error = svn_client_move5(
+ &commit_info,
+ srcPaths.array(pool),
+ destPath.cstr(),
+ force,
+ asChild,
+ makeParent,
+ map2hash(revProps,pool),
+ *m_context,
+ pool
+ );
+ if (error!=0) {
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+#else
+ Q_UNUSED(makeParent);
+ Q_UNUSED(revProps);
+ Revision rev;
+ if (srcPaths.size()>1 && !asChild)
+ {
+ throw ClientException("Multiple sources not allowed");
+ }
+ QString base,dir;
+ Path _dest;
+ for (size_t j=0;j<srcPaths.size();++j)
+ {
+ _dest=destPath;
+ if (asChild) {
+ srcPaths[j].split(dir,base);
+ _dest.addComponent(base);
+ }
+ rev = move(srcPaths[j],_dest,force);
+ }
+ return rev;
+#endif
+ }
+
+ svn::Revision
+ Client_impl::mkdir (const Path & path,
+ const QString& message,
+ bool makeParent,
+ const PropertiesMap&revProps
+ ) throw (ClientException)
+ {
+ Targets targets(path.path());
+ return mkdir(targets,message,makeParent,revProps);
+ }
+
+ svn::Revision
+ Client_impl::mkdir (const Targets & targets,
+ const QString&msg,
+ bool makeParent,
+ const PropertiesMap&revProps
+ ) throw (ClientException)
+ {
+ Pool pool;
+ m_context->setLogMessage(msg);
+
+ svn_commit_info_t *commit_info = NULL;
+
+ svn_error_t * error = 0;
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ error = svn_client_mkdir3
+ (&commit_info,
+ const_cast<apr_array_header_t*>(targets.array (pool)),
+ makeParent,
+ map2hash(revProps,pool),
+ *m_context, pool);
+#else
+ Q_UNUSED(makeParent);
+ Q_UNUSED(revProps);
+ error = svn_client_mkdir2
+ (&commit_info,
+ const_cast<apr_array_header_t*>(targets.array (pool)),
+ *m_context, pool);
+#endif
+
+ /* important! otherwise next op on repository uses that logmessage again! */
+ m_context->setLogMessage(QString::null);
+
+ if(error != NULL)
+ throw ClientException (error);
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+ }
+
+ void
+ Client_impl::cleanup (const Path & path) throw (ClientException)
+ {
+ Pool subPool;
+ apr_pool_t * apr_pool = subPool.pool ();
+
+ svn_error_t * error =
+ svn_client_cleanup (path.cstr (), *m_context, apr_pool);
+
+ if(error != NULL)
+ throw ClientException (error);
+ }
+
+ void Client_impl::resolve(const Path & path,Depth depth,const ConflictResult&resolution) throw (ClientException)
+ {
+ Pool pool;
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ const svn_wc_conflict_result_t*aResult=resolution.result(pool);
+ svn_error_t*error=svn_client_resolve(path.cstr(),internal::DepthToSvn(depth),aResult->choice,*m_context,pool);
+
+#else
+ Q_UNUSED(resolution);
+ bool recurse=depth==DepthInfinity;
+ svn_error_t * error =
+ svn_client_resolved (path.cstr (),
+ recurse,
+ *m_context,
+ pool);
+#endif
+ if(error != NULL) {
+ throw ClientException (error);
+ }
+ }
+
+ svn_revnum_t
+ Client_impl::doExport (const Path & srcPath,
+ const Path & destPath,
+ const Revision & revision,
+ const Revision & peg,
+ bool overwrite,
+ const QString&native_eol,
+ bool ignore_externals,
+ svn::Depth depth) throw (ClientException)
+ {
+ Pool pool;
+ svn_revnum_t revnum = 0;
+ const char*_neol;
+ if (native_eol==QString::null) {
+ _neol = (const char*)0;
+ } else {
+ _neol = native_eol.TOUTF8();
+ }
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_error_t * error =
+ svn_client_export4(&revnum,
+ srcPath.cstr(),
+ destPath.cstr(),
+ peg.revision(),
+ revision.revision(),
+ overwrite,
+ ignore_externals,
+ internal::DepthToSvn(depth),
+ _neol,
+ *m_context,
+ pool);
+#else
+ bool recurse = depth==svn::DepthInfinity;
+ svn_error_t * error =
+ svn_client_export3(&revnum,
+ srcPath.cstr(),
+ destPath.cstr(),
+ peg.revision(),
+ revision.revision(),
+ overwrite,
+ ignore_externals,
+ recurse,
+ _neol,
+ *m_context,
+ pool);
+#endif
+ if(error != NULL)
+ throw ClientException (error);
+ return revnum;
+ }
+
+ svn_revnum_t
+ Client_impl::doSwitch (
+ const Path & path, const QString& url,
+ const Revision & revision,
+ Depth depth,
+ const Revision & peg,
+ bool sticky_depth,
+ bool ignore_externals,
+ bool allow_unversioned
+ ) throw (ClientException)
+ {
+ Pool pool;
+ svn_revnum_t revnum = 0;
+ svn_error_t * error = 0;
+
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ error = svn_client_switch2(
+ &revnum,
+ path.cstr(),
+ url.TOUTF8(),
+ peg.revision(),
+ revision.revision(),
+ internal::DepthToSvn(depth),
+ sticky_depth,
+ ignore_externals,
+ allow_unversioned,
+ *m_context,
+ pool
+ );
+#else
+ bool recurse = depth==DepthInfinity;
+ Q_UNUSED(peg);
+ Q_UNUSED(sticky_depth);
+ Q_UNUSED(ignore_externals);
+ Q_UNUSED(allow_unversioned);
+ error = svn_client_switch (&revnum,
+ path.cstr(),
+ url.TOUTF8(),
+ revision.revision (),
+ recurse,
+ *m_context,
+ pool);
+#endif
+ if(error != NULL) {
+ throw ClientException (error);
+ }
+ return revnum;
+ }
+
+ Revision
+ Client_impl::import (const Path & path,
+ const QString& url,
+ const QString& message,
+ svn::Depth depth,
+ bool no_ignore,bool no_unknown_nodetype,
+ const PropertiesMap&revProps
+ ) throw (ClientException)
+
+ {
+ svn_commit_info_t *commit_info = NULL;
+ Pool pool;
+
+ m_context->setLogMessage (message);
+#if ((SVN_VER_MAJOR == 1) && (SVN_VER_MINOR >= 5)) || (SVN_VER_MAJOR > 1)
+ svn_error_t * error =
+ svn_client_import3(&commit_info,path.cstr (),url.TOUTF8(),
+ internal::DepthToSvn(depth),no_ignore,no_unknown_nodetype,
+ map2hash(revProps,pool),
+ *m_context,pool);
+#else
+ bool recurse = depth==DepthInfinity;
+ Q_UNUSED(revProps);
+ Q_UNUSED(no_unknown_nodetype);
+
+ svn_error_t * error =
+ svn_client_import2(&commit_info,
+ path.cstr (),
+ url.TOUTF8(),
+ !recurse,
+ no_ignore,
+ *m_context,
+ pool);
+#endif
+ /* important! otherwise next op on repository uses that logmessage again! */
+ m_context->setLogMessage(QString::null);
+
+ if(error != 0) {
+ throw ClientException (error);
+ }
+ if (commit_info) {
+ return commit_info->revision;
+ }
+ return Revision::UNDEFINED;
+ }
+
+ void
+ Client_impl::relocate (const Path & path,
+ const QString& from_url,
+ const QString& to_url,
+ bool recurse) throw (ClientException)
+ {
+ Pool pool;
+ svn_error_t * error =
+ svn_client_relocate (path.cstr (),
+ from_url.TOUTF8(),
+ to_url.TOUTF8(),
+ recurse,
+ *m_context,
+ pool);
+
+ if(error != NULL)
+ throw ClientException (error);
+ }
+
+}
+
+/* -----------------------------------------------------------------
+ * local variables:
+ * eval: (load-file "../../rapidsvn-dev.el")
+ * end:
+ */