aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorTuomas Puranen <[email protected]>2010-09-29 12:16:35 +0200
committerTobias Hunger <[email protected]>2010-09-29 12:29:12 +0200
commit65e95c3aba69123bf3286ea0c8ff60da0eece479 (patch)
treea64e9a63df0a076c8697b9411bffc14e0018f1bc /src/plugins
parent32fff3f6cd41a67703a6e3525d82a852a3393be4 (diff)
Added few new functions to IVersionControl, VCSManager and GeneratedFile to support the funcationality needed by the trac plugin.
All the version control plugins updated to have implementations according to the interface changes. Merge-request: 2178 Reviewed-by: Tobias Hunger <[email protected]> Merge-request: 2178 Reviewed-by: Tobias Hunger <[email protected]>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/coreplugin/basefilewizard.cpp12
-rw-r--r--src/plugins/coreplugin/basefilewizard.h1
-rw-r--r--src/plugins/coreplugin/iversioncontrol.h14
-rw-r--r--src/plugins/coreplugin/vcsmanager.cpp36
-rw-r--r--src/plugins/coreplugin/vcsmanager.h5
-rw-r--r--src/plugins/cvs/cvscontrol.cpp12
-rw-r--r--src/plugins/cvs/cvscontrol.h2
-rw-r--r--src/plugins/git/gitclient.cpp56
-rw-r--r--src/plugins/git/gitclient.h2
-rw-r--r--src/plugins/git/gitversioncontrol.cpp15
-rw-r--r--src/plugins/git/gitversioncontrol.h2
-rw-r--r--src/plugins/mercurial/mercurialclient.cpp57
-rw-r--r--src/plugins/mercurial/mercurialclient.h2
-rw-r--r--src/plugins/mercurial/mercurialcontrol.cpp12
-rw-r--r--src/plugins/mercurial/mercurialcontrol.h2
-rw-r--r--src/plugins/perforce/perforceversioncontrol.cpp12
-rw-r--r--src/plugins/perforce/perforceversioncontrol.h2
-rw-r--r--src/plugins/subversion/subversioncontrol.cpp12
-rw-r--r--src/plugins/subversion/subversioncontrol.h2
-rw-r--r--src/plugins/subversion/subversionplugin.cpp71
-rw-r--r--src/plugins/subversion/subversionplugin.h2
21 files changed, 328 insertions, 3 deletions
diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp
index 054e560bd8a..e30f27168e0 100644
--- a/src/plugins/coreplugin/basefilewizard.cpp
+++ b/src/plugins/coreplugin/basefilewizard.cpp
@@ -69,12 +69,14 @@ public:
QString editorId;
bool binary;
GeneratedFile::Attributes attributes;
+ bool writeAccess;
};
GeneratedFilePrivate::GeneratedFilePrivate(const QString &p) :
path(p),
binary(false),
- attributes(0)
+ attributes(0),
+ writeAccess(true)
{
}
@@ -104,6 +106,11 @@ GeneratedFile::~GeneratedFile()
{
}
+void GeneratedFile::writeAccess(bool access)
+{
+ m_d->writeAccess = access;
+}
+
QString GeneratedFile::path() const
{
return m_d->path;
@@ -156,6 +163,9 @@ void GeneratedFile::setEditorId(const QString &k)
bool GeneratedFile::write(QString *errorMessage) const
{
+ if (!m_d->writeAccess)
+ return true;
+
// Ensure the directory
const QFileInfo info(m_d->path);
const QDir dir = info.absoluteDir();
diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h
index 614cabebbd0..2fcab7e6d2b 100644
--- a/src/plugins/coreplugin/basefilewizard.h
+++ b/src/plugins/coreplugin/basefilewizard.h
@@ -101,6 +101,7 @@ public:
void setEditorId(const QString &k);
bool write(QString *errorMessage) const;
+ void writeAccess(bool access = true);
Attributes attributes() const;
void setAttributes(Attributes a);
diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h
index c402c1fb77c..e00be8f69db 100644
--- a/src/plugins/coreplugin/iversioncontrol.h
+++ b/src/plugins/coreplugin/iversioncontrol.h
@@ -52,7 +52,9 @@ public:
AddOperation, DeleteOperation, OpenOperation, MoveOperation,
CreateRepositoryOperation,
SnapshotOperations,
- AnnotateOperation
+ AnnotateOperation,
+ CheckoutOperation,
+ GetRepositoryRootOperation
};
explicit IVersionControl(QObject *parent = 0) : QObject(parent) {}
@@ -117,6 +119,16 @@ public:
virtual bool vcsCreateRepository(const QString &directory) = 0;
/*!
+ * Called to clone/checkout the version control system in a directory.
+ */
+ virtual bool vcsCheckout(const QString &directory,const QByteArray &url) = 0;
+
+ /*!
+ * Called to get the version control repository root.
+ */
+ virtual QString vcsGetRepositoryURL(const QString &director) = 0;
+
+ /*!
* Create a snapshot of the current state and return an identifier or
* an empty string in case of failure.
*/
diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp
index 0221e29c9fa..ac7e18fb3af 100644
--- a/src/plugins/coreplugin/vcsmanager.cpp
+++ b/src/plugins/coreplugin/vcsmanager.cpp
@@ -167,6 +167,42 @@ bool VCSManager::promptToDelete(const QString &fileName)
return true;
}
+IVersionControl* VCSManager::checkout(const QString &versionControlType,
+ const QString &directory,
+ const QByteArray &url)
+{
+ foreach (IVersionControl * versionControl, allVersionControls()) {
+ if (versionControl->displayName() == versionControlType &&
+ versionControl->supportsOperation(Core::IVersionControl::CheckoutOperation)) {
+ if (versionControl->vcsCheckout(directory,url)) {
+ m_d->m_cachedMatches.insert(directory, versionControl);
+ return versionControl;
+ }
+ return 0;
+ }
+ }
+ return 0;
+}
+
+bool VCSManager::findVersionControl(const QString &versionControlType)
+{
+ foreach (IVersionControl * versionControl, allVersionControls()) {
+ if (versionControl->displayName() == versionControlType) {
+ return true;
+ }
+ }
+ return false;
+}
+
+QString VCSManager::getRepositoryURL(const QString &directory)
+{
+ IVersionControl *vc = findVersionControlForDirectory(directory);
+
+ if (vc && vc->supportsOperation(Core::IVersionControl::GetRepositoryRootOperation))
+ return vc->vcsGetRepositoryURL(directory);
+ return QString();
+}
+
bool VCSManager::promptToDelete(IVersionControl *vc, const QString &fileName)
{
QTC_ASSERT(vc, return true)
diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h
index 71e9b3e9c34..6b2e374a883 100644
--- a/src/plugins/coreplugin/vcsmanager.h
+++ b/src/plugins/coreplugin/vcsmanager.h
@@ -68,6 +68,11 @@ public:
IVersionControl *findVersionControlForDirectory(const QString &directory,
QString *topLevelDirectory = 0);
+ IVersionControl *checkout(const QString &versionControlType,
+ const QString &directory,
+ const QByteArray &url);
+ bool findVersionControl(const QString &versionControl);
+ QString getRepositoryURL(const QString &directory);
// Shows a confirmation dialog, whether the file should also be deleted
// from revision control Calls sccDelete on the file. Returns false
diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp
index 41268e79f07..7fd757a4f82 100644
--- a/src/plugins/cvs/cvscontrol.cpp
+++ b/src/plugins/cvs/cvscontrol.cpp
@@ -58,6 +58,8 @@ bool CVSControl::supportsOperation(Operation operation) const
case MoveOperation:
case CreateRepositoryOperation:
case SnapshotOperations:
+ case CheckoutOperation:
+ case GetRepositoryRootOperation:
rc = false;
break;
}
@@ -94,6 +96,16 @@ bool CVSControl::vcsCreateRepository(const QString &)
return false;
}
+QString CVSControl::vcsGetRepositoryURL(const QString &)
+{
+ return QString();
+}
+
+bool CVSControl::vcsCheckout(const QString &/*directory*/, const QByteArray &/*url*/)
+{
+ return false;
+}
+
QString CVSControl::vcsCreateSnapshot(const QString &)
{
return QString();
diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h
index 4fd06c2de72..b5b882d4425 100644
--- a/src/plugins/cvs/cvscontrol.h
+++ b/src/plugins/cvs/cvscontrol.h
@@ -53,6 +53,8 @@ public:
virtual bool vcsDelete(const QString &filename);
virtual bool vcsMove(const QString &from, const QString &to);
virtual bool vcsCreateRepository(const QString &directory);
+ virtual bool vcsCheckout(const QString &directory, const QByteArray &url);
+ virtual QString vcsGetRepositoryURL(const QString &directory);
virtual QString vcsCreateSnapshot(const QString &topLevel);
virtual QStringList vcsSnapshots(const QString &topLevel);
virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name);
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 48f5c5a893d..47b74c8e4a3 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -50,6 +50,7 @@
#include <texteditor/itexteditor.h>
#include <utils/qtcassert.h>
#include <utils/synchronousprocess.h>
+#include <utils/environment.h>
#include <vcsbase/vcsbaseeditor.h>
#include <vcsbase/vcsbaseoutputwindow.h>
#include <vcsbase/vcsbaseplugin.h>
@@ -1922,6 +1923,61 @@ QString GitClient::readConfigValue(const QString &workingDirectory, const QStrin
return readConfig(workingDirectory, QStringList(configVar)).remove(QLatin1Char('\n'));
}
+bool GitClient::cloneRepository(const QString &directory,const QByteArray &url)
+{
+ QDir workingDirectory(directory);
+ const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt
+ |VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+ |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+
+ if (workingDirectory.exists()) {
+ if (!synchronousInit(workingDirectory.path()))
+ return false;
+
+ QStringList arguments(QLatin1String("remote"));
+ arguments << QLatin1String("add") << QLatin1String("origin") << url;
+ if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true))
+ return false;
+
+ arguments.clear();
+ arguments << QLatin1String("fetch");
+ const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags);
+ if (resp.result != Utils::SynchronousProcessResponse::Finished)
+ return false;
+
+ arguments.clear();
+ arguments << QLatin1String("config") << QLatin1String("branch.master.remote") << QLatin1String("origin");
+ if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true))
+ return false;
+
+ arguments.clear();
+ arguments << QLatin1String("config") << QLatin1String("branch.master.merge") << QLatin1String("refs/heads/master");
+ if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true))
+ return false;
+
+ return true;
+ } else {
+ QStringList arguments(QLatin1String("clone"));
+ arguments << url << workingDirectory.dirName();
+ workingDirectory.cdUp();
+ const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags);
+ return resp.result == Utils::SynchronousProcessResponse::Finished;
+ }
+}
+
+QString GitClient::vcsGetRepositoryURL(const QString &directory)
+{
+ QStringList arguments(QLatin1String("config"));
+ QByteArray outputText;
+
+ arguments << QLatin1String("remote.origin.url");
+
+ if (fullySynchronousGit(directory,arguments,&outputText,0,false)) {
+ return commandOutputFromLocal8Bit(outputText);
+ }
+ return QString();
+}
+
GitSettings GitClient::settings() const
{
return m_settings;
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 9de98447889..5ece27c9394 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -158,6 +158,8 @@ public:
unsigned gitVersion(bool silent, QString *errorMessage = 0);
QString gitVersionString(bool silent, QString *errorMessage = 0);
+ bool cloneRepository(const QString &directory,const QByteArray &url);
+ QString vcsGetRepositoryURL(const QString &directory);
bool synchronousFetch(const QString &workingDirectory);
bool synchronousPull(const QString &workingDirectory);
bool synchronousPush(const QString &workingDirectory);
diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp
index 370e20bb270..862bd04dd01 100644
--- a/src/plugins/git/gitversioncontrol.cpp
+++ b/src/plugins/git/gitversioncontrol.cpp
@@ -87,6 +87,10 @@ bool GitVersionControl::supportsOperation(Operation operation) const
case AnnotateOperation:
rc = true;
break;
+ case CheckoutOperation:
+ case GetRepositoryRootOperation:
+ rc = true;
+ break;
}
return rc;
}
@@ -121,6 +125,17 @@ bool GitVersionControl::vcsCreateRepository(const QString &directory)
{
return gitClient()->synchronousInit(directory);
}
+
+bool GitVersionControl::vcsCheckout(const QString &directory,const QByteArray &url)
+{
+ return gitClient()->cloneRepository(directory,url);
+}
+
+QString GitVersionControl::vcsGetRepositoryURL(const QString &directory)
+{
+ return gitClient()->vcsGetRepositoryURL(directory);
+}
+
/* Snapshots are implement using stashes, relying on stash messages for
* naming as the actual stash names (stash{n}) are rotated as one adds stashes.
* Note that the snapshot interface does not care whether we have an unmodified
diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h
index 35504747a7c..0d7276a392d 100644
--- a/src/plugins/git/gitversioncontrol.h
+++ b/src/plugins/git/gitversioncontrol.h
@@ -54,6 +54,8 @@ public:
virtual bool vcsDelete(const QString &filename);
virtual bool vcsMove(const QString &from, const QString &to);
virtual bool vcsCreateRepository(const QString &directory);
+ virtual bool vcsCheckout(const QString &directory, const QByteArray &url);
+ virtual QString vcsGetRepositoryURL(const QString &directory);
virtual QString vcsCreateSnapshot(const QString &topLevel);
virtual QStringList vcsSnapshots(const QString &topLevel);
virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name);
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 3cc71ca7aa0..8f06d4d5531 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -497,6 +497,63 @@ bool MercurialClient::pushSync(const QString &repositoryRoot, const QString &rep
return resp.result == Utils::SynchronousProcessResponse::Finished;
}
+bool MercurialClient::clone(const QString &directory, const QString &url)
+{
+ QDir workingDirectory(directory);
+ QByteArray output;
+ const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+ |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+
+ if (workingDirectory.exists()) {
+ // Let's make first init
+ QStringList arguments(QLatin1String("init"));
+ if (!executeHgFullySynchronously(workingDirectory.path(), arguments, &output)) {
+ return false;
+ }
+
+ // Then pull remote repository
+ arguments.clear();
+ arguments << QLatin1String("pull") << url;
+ const Utils::SynchronousProcessResponse resp1 =
+ executeHgSynchronously(workingDirectory.path(), arguments, flags);
+ if (resp1.result != Utils::SynchronousProcessResponse::Finished) {
+ return false;
+ }
+
+ // By now, there is no hgrc file -> create it
+ QFile hgrc(workingDirectory.path()+"/.hg/hgrc");
+ hgrc.open(QIODevice::WriteOnly);
+ hgrc.write(QString("[paths]\ndefault = %1\n").arg(QString(url)).toUtf8());
+ hgrc.close();
+
+ // And last update repository
+ arguments.clear();
+ arguments << QLatin1String("update");
+ const Utils::SynchronousProcessResponse resp2 =
+ executeHgSynchronously(workingDirectory.path(), arguments, flags);
+ return resp2.result == Utils::SynchronousProcessResponse::Finished;
+ } else {
+ QStringList arguments(QLatin1String("clone"));
+ arguments << url << workingDirectory.dirName();
+ workingDirectory.cdUp();
+ const Utils::SynchronousProcessResponse resp =
+ executeHgSynchronously(workingDirectory.path(), arguments, flags);
+ return resp.result == Utils::SynchronousProcessResponse::Finished;
+ }
+}
+
+QString MercurialClient::vcsGetRepositoryURL(const QString &directory)
+{
+ QByteArray output;
+
+ QStringList arguments(QLatin1String("showconfig"));
+ arguments << QLatin1String("paths.default");
+
+ if (executeHgFullySynchronously(directory, arguments, &output))
+ return QString::fromLocal8Bit(output);;
+ return QString();
+}
+
void MercurialClient::incoming(const QString &repositoryRoot, const QString &repository)
{
QStringList args;
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index f6ea3a3d28b..8750d0fbb23 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -100,6 +100,8 @@ public:
const QString &commiterInfo,
const QString &commitMessageFile,
bool autoAddRemove = false);
+ bool clone(const QString &directory, const QString &url);
+ QString vcsGetRepositoryURL(const QString &directory);
static QString findTopLevelForFile(const QFileInfo &file);
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index 61342dc3507..dc84b9919b4 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -65,6 +65,8 @@ bool MercurialControl::supportsOperation(Operation operation) const
case Core::IVersionControl::MoveOperation:
case Core::IVersionControl::CreateRepositoryOperation:
case Core::IVersionControl::AnnotateOperation:
+ case Core::IVersionControl::CheckoutOperation:
+ case Core::IVersionControl::GetRepositoryRootOperation:
break;
case Core::IVersionControl::OpenOperation:
case Core::IVersionControl::SnapshotOperations:
@@ -142,6 +144,16 @@ bool MercurialControl::sccManaged(const QString &filename)
return mercurialClient->manifestSync(topLevel, topLevelDir.relativeFilePath(filename));
}
+bool MercurialControl::vcsCheckout(const QString &directory, const QByteArray &url)
+{
+ return mercurialClient->clone(directory,url);
+}
+
+QString MercurialControl::vcsGetRepositoryURL(const QString &directory)
+{
+ return mercurialClient->vcsGetRepositoryURL(directory);
+}
+
void MercurialControl::changed(const QVariant &v)
{
switch (v.type()) {
diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h
index b74fce99ff8..3f0465d380c 100644
--- a/src/plugins/mercurial/mercurialcontrol.h
+++ b/src/plugins/mercurial/mercurialcontrol.h
@@ -57,6 +57,8 @@ public:
bool vcsDelete(const QString &filename);
bool vcsMove(const QString &from, const QString &to);
bool vcsCreateRepository(const QString &directory);
+ bool vcsCheckout(const QString &directory, const QByteArray &url);
+ QString vcsGetRepositoryURL(const QString &directory);
QString vcsCreateSnapshot(const QString &topLevel);
QStringList vcsSnapshots(const QString &topLevel);
bool vcsRestoreSnapshot(const QString &topLevel, const QString &name);
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index 0f0a5e81905..6ea6fb63466 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -59,6 +59,8 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const
return true;
case CreateRepositoryOperation:
case SnapshotOperations:
+ case CheckoutOperation:
+ case GetRepositoryRootOperation:
break;
}
return false;
@@ -128,6 +130,16 @@ bool PerforceVersionControl::vcsAnnotate(const QString &file, int line)
return true;
}
+bool PerforceVersionControl::vcsCheckout(const QString &/*directory*/,const QByteArray&/*url*/)
+{
+ return false;
+}
+
+QString PerforceVersionControl::vcsGetRepositoryURL(const QString &/*directory*/)
+{
+ return QString();
+}
+
bool PerforceVersionControl::managesDirectory(const QString &directory, QString *topLevel) const
{
const bool rc = m_plugin->managesDirectory(directory, topLevel);
diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h
index b3a01f7a6c0..ed688d68503 100644
--- a/src/plugins/perforce/perforceversioncontrol.h
+++ b/src/plugins/perforce/perforceversioncontrol.h
@@ -55,6 +55,8 @@ public:
virtual bool vcsDelete(const QString &filename);
virtual bool vcsMove(const QString &from, const QString &to);
virtual bool vcsCreateRepository(const QString &directory);
+ virtual bool vcsCheckout(const QString &directory, const QByteArray &url);
+ virtual QString vcsGetRepositoryURL(const QString &directory);
virtual QString vcsCreateSnapshot(const QString &topLevel);
virtual QStringList vcsSnapshots(const QString &topLevel);
virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name);
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index f25fc3ab6a2..e4e1256f9eb 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -54,6 +54,8 @@ bool SubversionControl::supportsOperation(Operation operation) const
case DeleteOperation:
case MoveOperation:
case AnnotateOperation:
+ case CheckoutOperation:
+ case GetRepositoryRootOperation:
break;
case OpenOperation:
case CreateRepositoryOperation:
@@ -89,6 +91,16 @@ bool SubversionControl::vcsMove(const QString &from, const QString &to)
return m_plugin->vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath());
}
+bool SubversionControl::vcsCheckout(const QString &directory,const QByteArray &url)
+{
+ return m_plugin->vcsCheckout(directory,url);
+}
+
+QString SubversionControl::vcsGetRepositoryURL(const QString &directory)
+{
+ return m_plugin->vcsGetRepositoryURL(directory);
+}
+
bool SubversionControl::vcsCreateRepository(const QString &)
{
return false;
diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h
index 5610059d661..071773b8600 100644
--- a/src/plugins/subversion/subversioncontrol.h
+++ b/src/plugins/subversion/subversioncontrol.h
@@ -53,6 +53,8 @@ public:
virtual bool vcsDelete(const QString &filename);
virtual bool vcsMove(const QString &from, const QString &to);
virtual bool vcsCreateRepository(const QString &directory);
+ virtual bool vcsCheckout(const QString &directory, const QByteArray &url);
+ virtual QString vcsGetRepositoryURL(const QString &directory);
virtual QString vcsCreateSnapshot(const QString &topLevel);
virtual QStringList vcsSnapshots(const QString &topLevel);
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 332ca5f3724..e22933b25eb 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -65,13 +65,14 @@
#include <QtCore/QTextCodec>
#include <QtCore/QtPlugin>
#include <QtCore/QProcessEnvironment>
+#include <QtCore/QUrl>
#include <QtGui/QAction>
#include <QtGui/QFileDialog>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMessageBox>
#include <QtGui/QInputDialog>
-
+#include <QtXml/QXmlStreamReader>
#include <limits.h>
using namespace Subversion::Internal;
@@ -1224,6 +1225,74 @@ bool SubversionPlugin::vcsMove(const QString &workingDir, const QString &from, c
return !response.error;
}
+bool SubversionPlugin::vcsCheckout(const QString &directory, const QByteArray &url)
+{
+ QUrl tempUrl;
+ tempUrl.setEncodedUrl(url);
+ QString username = tempUrl.userName();
+ QString password = tempUrl.password();
+ QStringList args = QStringList(QLatin1String("checkout"));
+ args << QLatin1String(nonInteractiveOptionC) ;
+
+ if(!username.isEmpty() && !password.isEmpty())
+ {
+ // If url contains username and password we have to use separate username and password
+ // arguments instead of passing those in the url. Otherwise the subversion 'non-interactive'
+ // authentication will always fail (if the username and password data are not stored locally),
+ // if for example we are logging into a new host for the first time using svn. There seems to
+ // be a bug in subversion, so this might get fixed in the future.
+ tempUrl.setUserInfo("");
+ args << tempUrl.toEncoded() << directory;
+ const SubversionResponse response = runSvn(directory, username, password, args, m_settings.longTimeOutMS(),
+ VCSBase::VCSBasePlugin::SshPasswordPrompt);
+ return !response.error;
+ } else {
+ args << url << directory;
+ const SubversionResponse response = runSvn(directory, args, m_settings.longTimeOutMS(),
+ VCSBase::VCSBasePlugin::SshPasswordPrompt);
+ return !response.error;
+ }
+}
+
+QString SubversionPlugin::vcsGetRepositoryURL(const QString &directory)
+{
+ QXmlStreamReader xml;
+ QStringList args = QStringList(QLatin1String("info"));
+ args << QLatin1String("--xml");
+
+ const SubversionResponse response = runSvn(directory, args, m_settings.longTimeOutMS(), SuppressCommandLogging);
+ xml.addData(response.stdOut);
+
+ bool repo = false;
+ bool root = false;
+
+ while(!xml.atEnd() && !xml.hasError()) {
+ switch(xml.readNext()) {
+ case QXmlStreamReader::StartDocument:
+ break;
+ case QXmlStreamReader::StartElement:
+ if(xml.name() == QLatin1String("repository"))
+ repo = true;
+ else if(repo && xml.name() == QLatin1String("root"))
+ root = true;
+ break;
+ case QXmlStreamReader::EndElement:
+ if(xml.name() == QLatin1String("repository"))
+ repo = false;
+ else if(repo && xml.name() == QLatin1String("root"))
+ root = false;
+ break;
+ case QXmlStreamReader::Characters:
+ if (repo && root)
+ return xml.text().toString();
+ break;
+ default:
+ break;
+ }
+ }
+ return QString();
+}
+
/* Subversion has ".svn" directory in each directory
* it manages. The top level is the first directory
* under the directory that does not have a ".svn". */
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index 584a196671c..d79ae144e10 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -96,6 +96,8 @@ public:
bool vcsDelete(const QString &workingDir, const QString &fileName);
bool vcsMove(const QString &workingDir, const QString &from, const QString &to);
bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+ virtual bool vcsCheckout(const QString &directory, const QByteArray &url);
+ virtual QString vcsGetRepositoryURL(const QString &directory);
static SubversionPlugin *subversionPluginInstance();