aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
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();