diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h index 913f34154098a59f36c4ee613b5c0c65f3e13553..42005bd1662217e830725e99082f018d9884e8db 100644 --- a/src/plugins/bazaar/bazaarclient.h +++ b/src/plugins/bazaar/bazaarclient.h @@ -38,6 +38,7 @@ namespace Bazaar { namespace Internal { class BazaarSettings; +class BazaarControl; class BazaarClient : public VcsBase::VcsBaseClient { @@ -70,6 +71,7 @@ protected: private: friend class CloneWizard; + friend class BazaarControl; }; } // namespace Internal diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp index e9a9be117dcde42f93e51cf0394d165b401aa632..5827a9cd603818b08260f408db629e46e58e34c1 100644 --- a/src/plugins/bazaar/bazaarcontrol.cpp +++ b/src/plugins/bazaar/bazaarcontrol.cpp @@ -29,8 +29,11 @@ ****************************************************************************/ #include "bazaarcontrol.h" #include "bazaarclient.h" +#include "bazaarplugin.h" +#include <vcsbase/vcsbaseclientsettings.h> #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcscommand.h> #include <utils/fileutils.h> @@ -88,6 +91,7 @@ bool BazaarControl::supportsOperation(Operation operation) const case Core::IVersionControl::MoveOperation: case Core::IVersionControl::CreateRepositoryOperation: case Core::IVersionControl::AnnotateOperation: + case Core::IVersionControl::InitialCheckoutOperation: break; case Core::IVersionControl::SnapshotOperations: supported = false; @@ -135,6 +139,21 @@ bool BazaarControl::vcsAnnotate(const QString &file, int line) return true; } +Core::ShellCommand *BazaarControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + QStringList args; + args << m_bazaarClient->vcsCommandString(BazaarClient::CloneCommand) + << extraArgs << url << localName; + + auto command = new VcsBase::VcsCommand(baseDirectory.toString(), + m_bazaarClient->processEnvironment()); + command->addJob(m_bazaarClient->vcsBinary(), args, -1); + return command; +} + void BazaarControl::changed(const QVariant &v) { switch (v.type()) { diff --git a/src/plugins/bazaar/bazaarcontrol.h b/src/plugins/bazaar/bazaarcontrol.h index bd74926d419f5f85eb4a9189bb9d11b1993e8b1c..f55ad73ca3970bab55e3169c5d39c4ed08aa898a 100644 --- a/src/plugins/bazaar/bazaarcontrol.h +++ b/src/plugins/bazaar/bazaarcontrol.h @@ -64,6 +64,11 @@ public: bool vcsCreateRepository(const QString &directory) override; bool vcsAnnotate(const QString &file, int line) override; + Core::ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) override; + public slots: // To be connected to the VCSTask's success signal to emit the repository/ // files changed signals according to the variant's type: diff --git a/src/plugins/clearcase/clearcasecontrol.cpp b/src/plugins/clearcase/clearcasecontrol.cpp index 686f782a92dd69a55e04faeea49f76c6008ecd10..472d79a81b747625579be2fcaad23c8ccfc27dee 100644 --- a/src/plugins/clearcase/clearcasecontrol.cpp +++ b/src/plugins/clearcase/clearcasecontrol.cpp @@ -80,6 +80,7 @@ bool ClearCaseControl::supportsOperation(Operation operation) const break; case CreateRepositoryOperation: case SnapshotOperations: + case Core::IVersionControl::InitialCheckoutOperation: rc = false; break; } diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp index f9cbf4a90d1a69d8274a9c189fe435ee98f2fffa..d7af51eabbd13dc0ae58b7489fb4241c7e9ccfe7 100644 --- a/src/plugins/coreplugin/iversioncontrol.cpp +++ b/src/plugins/coreplugin/iversioncontrol.cpp @@ -83,6 +83,18 @@ QStringList IVersionControl::additionalToolsPath() const return QStringList(); } +ShellCommand *IVersionControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + Q_UNUSED(url); + Q_UNUSED(baseDirectory); + Q_UNUSED(localName); + Q_UNUSED(extraArgs); + return 0; +} + QString IVersionControl::vcsTopic(const QString &topLevel) { return m_topicCache ? m_topicCache->topic(topLevel) : QString(); diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index f9a9d2b76e3f1eb88465f5a09d3068e97aa9759c..04c733cefd19deba7b4bfc6125b361e0fc0acee7 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -34,6 +34,8 @@ #include "core_global.h" #include "id.h" +#include <utils/fileutils.h> + #include <QDateTime> #include <QFlags> #include <QHash> @@ -42,6 +44,8 @@ namespace Core { +class ShellCommand; + class CORE_EXPORT IVersionControl : public QObject { Q_OBJECT @@ -56,7 +60,8 @@ public: AddOperation, DeleteOperation, MoveOperation, CreateRepositoryOperation, SnapshotOperations, - AnnotateOperation + AnnotateOperation, + InitialCheckoutOperation }; enum OpenSupportMode { @@ -194,6 +199,17 @@ public: */ virtual QStringList additionalToolsPath() const; + /*! + * Return a ShellCommand capable of checking out \a url into \a baseDirectory, where + * a new subdirectory with \a localName will be created. + * + * \a extraArgs are passed on to the command being run. + */ + virtual ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs); + signals: void repositoryChanged(const QString &repository); void filesChanged(const QStringList &files); diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index ceb1eeca664b7f078312f66aca81784a77a4ff55..82e09bc38aa1ab3fe2e1d61fa267ad1e7562cc51 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -35,8 +35,10 @@ #include "cvssettings.h" #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcscommand.h> #include <utils/fileutils.h> +#include <utils/qtcassert.h> #include <QFileInfo> @@ -74,6 +76,7 @@ bool CvsControl::supportsOperation(Operation operation) const case AddOperation: case DeleteOperation: case AnnotateOperation: + case InitialCheckoutOperation: break; case MoveOperation: case CreateRepositoryOperation: @@ -132,6 +135,24 @@ QString CvsControl::vcsOpenText() const return tr("&Edit"); } +Core::ShellCommand *CvsControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + QTC_ASSERT(localName == url, return 0); + + const CvsSettings settings = CvsPlugin::instance()->client()->settings(); + + QStringList args; + args << QLatin1String("checkout") << url << extraArgs; + + auto command = new VcsBase::VcsCommand(baseDirectory.toString(), + QProcessEnvironment::systemEnvironment()); + command->addJob(m_plugin->client()->vcsBinary(), settings.addOptions(args), -1); + return command; +} + bool CvsControl::managesDirectory(const QString &directory, QString *topLevel) const { return m_plugin->managesDirectory(directory, topLevel); diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h index 7d2425aaadf51119d6f86cc7e90be782b2ca3d8a..ec18756877ad71196fb0bb3381b90d65b3d93e36 100644 --- a/src/plugins/cvs/cvscontrol.h +++ b/src/plugins/cvs/cvscontrol.h @@ -63,6 +63,11 @@ public: QString vcsOpenText() const override; + Core::ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) override; + void emitRepositoryChanged(const QString &s); void emitFilesChanged(const QStringList &l); diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index ba9ec5589e22cda6e697c9ab0b4ef73b0831a2ba..bb5f7024e9c7aac11ba79ab972f608b96384dd34 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -33,8 +33,10 @@ #include "gitutils.h" #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcscommand.h> #include <QFileInfo> +#include <QProcessEnvironment> namespace Git { namespace Internal { @@ -44,8 +46,7 @@ class GitTopicCache : public Core::IVersionControl::TopicCache public: GitTopicCache(GitClient *client) : m_client(client) - { - } + { } protected: QString trackFile(const QString &repository) override @@ -66,8 +67,7 @@ private: GitVersionControl::GitVersionControl(GitClient *client) : Core::IVersionControl(new GitTopicCache(client)), m_client(client) -{ -} +{ } QString GitVersionControl::displayName() const { @@ -96,6 +96,7 @@ bool GitVersionControl::supportsOperation(Operation operation) const case CreateRepositoryOperation: case SnapshotOperations: case AnnotateOperation: + case InitialCheckoutOperation: return true; } return false; @@ -139,6 +140,19 @@ QString GitVersionControl::vcsTopic(const QString &directory) return topic; } +Core::ShellCommand *GitVersionControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + QStringList args; + args << QLatin1String("clone") << extraArgs << url << localName; + + auto command = new VcsBase::VcsCommand(baseDirectory.toString(), m_client->processEnvironment()); + command->addJob(m_client->vcsBinary(), args, -1); + return command; +} + QStringList GitVersionControl::additionalToolsPath() const { QStringList res = m_client->settings().searchPathList(); diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h index 2e528ab48736240d15fae84bb149c9295c5d997e..71dedb09ee3cf59f79f8050c34b9391dd37683b0 100644 --- a/src/plugins/git/gitversioncontrol.h +++ b/src/plugins/git/gitversioncontrol.h @@ -62,6 +62,11 @@ public: bool vcsAnnotate(const QString &file, int line) override; QString vcsTopic(const QString &directory) override; + Core::ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) override; + QStringList additionalToolsPath() const override; void emitFilesChanged(const QStringList &); diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp index 6f5ad95fb16ead5b271089353bdc595354e04930..827355601ffe0f02a0d0b2659a62a06a49deabd3 100644 --- a/src/plugins/mercurial/mercurialcontrol.cpp +++ b/src/plugins/mercurial/mercurialcontrol.cpp @@ -33,12 +33,14 @@ #include <vcsbase/vcsbaseclientsettings.h> #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcscommand.h> #include <coreplugin/vcsmanager.h> #include <utils/fileutils.h> #include <QFileInfo> +#include <QProcessEnvironment> #include <QVariant> #include <QStringList> #include <QDir> @@ -114,6 +116,7 @@ bool MercurialControl::supportsOperation(Operation operation) const case Core::IVersionControl::MoveOperation: case Core::IVersionControl::CreateRepositoryOperation: case Core::IVersionControl::AnnotateOperation: + case Core::IVersionControl::InitialCheckoutOperation: break; case Core::IVersionControl::SnapshotOperations: supported = false; @@ -161,6 +164,19 @@ bool MercurialControl::vcsAnnotate(const QString &file, int line) return true; } +Core::ShellCommand *MercurialControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + QStringList args; + args << QLatin1String("clone") << extraArgs << url << localName; + auto command = new VcsBase::VcsCommand(baseDirectory.toString(), + mercurialClient->processEnvironment()); + command->addJob(mercurialClient->vcsBinary(), args, -1); + return command; +} + bool MercurialControl::sccManaged(const QString &filename) { const QFileInfo fi(filename); diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h index 6807e57abab2b5c80076c209278e7e166b75d0ae..30b33c8de3aa1aca6fc1085ac04ffd9413a473b0 100644 --- a/src/plugins/mercurial/mercurialcontrol.h +++ b/src/plugins/mercurial/mercurialcontrol.h @@ -64,6 +64,11 @@ public: bool vcsCreateRepository(const QString &directory) override; bool vcsAnnotate(const QString &file, int line) override; + Core::ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) override; + bool sccManaged(const QString &filename); public slots: diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 8ae4b02c0697d0a28e954f9c4af6691e5f4a886a..5e7cb29bb054df32e7a906a43022f3b8afd05f70 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -76,6 +76,7 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const return supported; case CreateRepositoryOperation: case SnapshotOperations: + case InitialCheckoutOperation: break; } return false; diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index a6fe4d48d49ba79be20fc59ac570fb41e9f0371a..90175620215d45f0314a40e0e6b11f2454993cdc 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -31,10 +31,12 @@ #include "subversioncontrol.h" #include "subversionclient.h" +#include "subversionconstants.h" #include "subversionplugin.h" #include "subversionsettings.h" #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcsbaseclientsettings.h> #include <utils/fileutils.h> @@ -97,6 +99,7 @@ bool SubversionControl::supportsOperation(Operation operation) const case DeleteOperation: case MoveOperation: case AnnotateOperation: + case InitialCheckoutOperation: break; case CreateRepositoryOperation: case SnapshotOperations: @@ -153,6 +156,24 @@ bool SubversionControl::vcsAnnotate(const QString &file, int line) return true; } +Core::ShellCommand *SubversionControl::createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) +{ + SubversionClient *client = m_plugin->client(); + + QStringList args; + args << QLatin1String("checkout"); + args << SubversionClient::addAuthenticationOptions(client->settings()); + args << QLatin1String(Subversion::Constants::NON_INTERACTIVE_OPTION); + args << extraArgs << url << localName; + + auto command = new VcsBase::VcsCommand(baseDirectory.toString(), client->processEnvironment()); + command->addJob(client->vcsBinary(), args, -1); + return command; +} + void SubversionControl::emitRepositoryChanged(const QString &s) { emit repositoryChanged(s); diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h index 62d2ee902f628e50971aeabb2c8873d09ab8285b..f05185ac1ed216abdf67b7d1c7b0839599292025 100644 --- a/src/plugins/subversion/subversioncontrol.h +++ b/src/plugins/subversion/subversioncontrol.h @@ -60,6 +60,11 @@ public: bool vcsAnnotate(const QString &file, int line) override; + Core::ShellCommand *createInitialCheckoutCommand(const QString &url, + const Utils::FileName &baseDirectory, + const QString &localName, + const QStringList &extraArgs) override; + void emitRepositoryChanged(const QString &); void emitFilesChanged(const QStringList &);