diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp index cf7f9fcfa4f698b1b90685b36d379a0bc682795d..43c0a8356f13f12576500198790794e9ee8cca9e 100644 --- a/src/plugins/bazaar/bazaarcontrol.cpp +++ b/src/plugins/bazaar/bazaarcontrol.cpp @@ -33,6 +33,8 @@ #include "bazaarcontrol.h" #include "bazaarclient.h" +#include <vcsbase/vcsbaseclientsettings.h> + #include <QtCore/QFileInfo> #include <QtCore/QVariant> #include <QtCore/QStringList> @@ -59,9 +61,19 @@ bool BazaarControl::managesDirectory(const QString &directory, QString *topLevel return !topLevelFound.isEmpty(); } +bool BazaarControl::isConfigured() const +{ + const QString binary = m_bazaarClient->settings().binary(); + if (binary.isEmpty()) + return false; + QFileInfo fi(binary); + return fi.exists() && fi.isFile() && fi.isExecutable(); +} + bool BazaarControl::supportsOperation(Operation operation) const { - bool supported = true; + bool supported = isConfigured(); + switch (operation) { case Core::IVersionControl::AddOperation: case Core::IVersionControl::DeleteOperation: diff --git a/src/plugins/bazaar/bazaarcontrol.h b/src/plugins/bazaar/bazaarcontrol.h index deff2efe27951ed360768d22c4e285350774a3d4..5d0182b2ae1568e72b20ef784f2be4958158da3e 100644 --- a/src/plugins/bazaar/bazaarcontrol.h +++ b/src/plugins/bazaar/bazaarcontrol.h @@ -54,6 +54,7 @@ public: QString displayName() const; bool managesDirectory(const QString &filename, QString *topLevel = 0) const; + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); bool vcsAdd(const QString &filename); diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 5b94e18c6dfb8b029e8f98736e2f445d0e26628c..2e264e337d6b2a91596137f0744b9b84f4a9eac0 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -75,8 +75,14 @@ public: virtual bool managesDirectory(const QString &filename, QString *topLevel = 0) const = 0; + /*! + * Returns true is the VCS is configured to run. + */ + virtual bool isConfigured() const = 0; /*! * Called to query whether a VCS supports the respective operations. + * + * Return false if the VCS is not configured yet. */ virtual bool supportsOperation(Operation operation) const = 0; diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index 2dfa2b95662f5274566d3a9d73e079312cec7389..ce1801eb52f0e74630538ad4843442247058f573 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -32,6 +32,7 @@ #include "cvscontrol.h" #include "cvsplugin.h" +#include "cvssettings.h" #include <QtCore/QFileInfo> @@ -48,9 +49,18 @@ QString CVSControl::displayName() const return QLatin1String("cvs"); } +bool CVSControl::isConfigured() const +{ + const QString binary = m_plugin->settings().cvsCommand; + if (binary.isEmpty()) + return false; + QFileInfo fi(binary); + return fi.exists() && fi.isFile() && fi.isExecutable(); +} + bool CVSControl::supportsOperation(Operation operation) const { - bool rc = true; + bool rc = isConfigured(); switch (operation) { case AddOperation: case DeleteOperation: diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h index 12145a6aad0801a7da0f490527e0cce37543b33f..a26366eb0f2e10d4b416ed968db1f1c6402455ca 100644 --- a/src/plugins/cvs/cvscontrol.h +++ b/src/plugins/cvs/cvscontrol.h @@ -50,6 +50,7 @@ public: bool managesDirectory(const QString &directory, QString *topLevel = 0) const; + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); bool vcsAdd(const QString &fileName); diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 08a122dc92cd486a508103e75d67b2613cfe86c2..8687ec823f1faab4a04fc3b876d77737f9dcc869 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -277,13 +277,14 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) Q_UNUSED(arguments) Q_UNUSED(errorMessage) + m_core = Core::ICore::instance(); + m_gitClient = new GitClient(this); + typedef VCSBase::VCSEditorFactory<GitEditor> GitEditorFactory; typedef VCSBase::VCSSubmitEditorFactory<GitSubmitEditor> GitSubmitEditorFactory; VCSBase::VCSBasePlugin::initialize(new GitVersionControl(m_gitClient)); - m_core = Core::ICore::instance(); - m_gitClient = new GitClient(this); // Create the globalcontext list to register actions accordingly Core::Context globalcontext(Core::Constants::C_GLOBAL); diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index c53a49f62c6a9b51ba5e31b9c49f809b8657a35e..9977fd8db2524068f48f7941fd65adb75a2bf542 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -46,13 +46,7 @@ static const char stashRevisionIdC[] = "revision"; namespace Git { namespace Internal { -static inline GitClient *gitClient() -{ - return GitPlugin::instance()->gitClient(); -} - GitVersionControl::GitVersionControl(GitClient *client) : - m_enabled(true), m_client(client) { } @@ -62,18 +56,22 @@ QString GitVersionControl::displayName() const return QLatin1String("git"); } -// Add: Implement using "git add --intent-to-add" starting from 1.6.1 -static inline bool addOperationSupported() +bool GitVersionControl::isConfigured() const { - return gitClient()->gitVersion(true) >= version(1, 6, 1); + bool ok = false; + m_client->settings().gitBinaryPath(&ok); + return ok; } bool GitVersionControl::supportsOperation(Operation operation) const { + if (!isConfigured()) + return false; + bool rc = false; switch (operation) { case AddOperation: - rc = addOperationSupported(); + rc = m_client->gitVersion(true) >= version(1, 6, 1);; break; case DeleteOperation: rc = true; @@ -106,37 +104,37 @@ bool GitVersionControl::vcsOpen(const QString & /*fileName*/) bool GitVersionControl::vcsAdd(const QString & fileName) { // Implement in terms of using "--intent-to-add" - QTC_ASSERT(addOperationSupported(), return false); + QTC_ASSERT(m_client->gitVersion(true) >= version(1, 6, 1), return false); const QFileInfo fi(fileName); - return gitClient()->synchronousAdd(fi.absolutePath(), true, QStringList(fi.fileName())); + return m_client->synchronousAdd(fi.absolutePath(), true, QStringList(fi.fileName())); } bool GitVersionControl::vcsDelete(const QString & fileName) { const QFileInfo fi(fileName); - return gitClient()->synchronousDelete(fi.absolutePath(), true, QStringList(fi.fileName())); + return m_client->synchronousDelete(fi.absolutePath(), true, QStringList(fi.fileName())); } bool GitVersionControl::vcsMove(const QString &from, const QString &to) { const QFileInfo fromInfo(from); const QFileInfo toInfo(to); - return gitClient()->synchronousMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); + return m_client->synchronousMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } bool GitVersionControl::vcsCreateRepository(const QString &directory) { - return gitClient()->synchronousInit(directory); + return m_client->synchronousInit(directory); } bool GitVersionControl::vcsCheckout(const QString &directory, const QByteArray &url) { - return gitClient()->cloneRepository(directory,url); + return m_client->cloneRepository(directory,url); } QString GitVersionControl::vcsGetRepositoryURL(const QString &directory) { - return gitClient()->vcsGetRepositoryURL(directory); + return m_client->vcsGetRepositoryURL(directory); } /* Snapshots are implement using stashes, relying on stash messages for @@ -153,7 +151,7 @@ QString GitVersionControl::vcsCreateSnapshot(const QString &topLevel) static int n = 1; QString keyword = QLatin1String(stashMessageKeywordC) + QString::number(n++); const QString stashMessage = - gitClient()->synchronousStash(topLevel, keyword, + m_client->synchronousStash(topLevel, keyword, GitClient::StashImmediateRestore|GitClient::StashIgnoreUnchanged, &repositoryUnchanged); if (!stashMessage.isEmpty()) @@ -162,7 +160,7 @@ QString GitVersionControl::vcsCreateSnapshot(const QString &topLevel) // For unchanged repository state: return identifier + top revision QString topRevision; QString branch; - if (!gitClient()->synchronousTopRevision(topLevel, &topRevision, &branch)) + if (!m_client->synchronousTopRevision(topLevel, &topRevision, &branch)) return QString(); const QChar colon = QLatin1Char(':'); QString id = QLatin1String(stashRevisionIdC); @@ -178,7 +176,7 @@ QString GitVersionControl::vcsCreateSnapshot(const QString &topLevel) QStringList GitVersionControl::vcsSnapshots(const QString &topLevel) { QList<Stash> stashes; - if (!gitClient()->synchronousStashList(topLevel, &stashes)) + if (!m_client->synchronousStashList(topLevel, &stashes)) return QStringList(); // Return the git stash 'message' as identifier, ignoring empty ones QStringList rc; @@ -200,15 +198,15 @@ bool GitVersionControl::vcsRestoreSnapshot(const QString &topLevel, const QStrin break; const QString branch = tokens.at(1); const QString revision = tokens.at(2); - success = gitClient()->synchronousReset(topLevel) - && gitClient()->synchronousCheckoutBranch(topLevel, branch) - && gitClient()->synchronousCheckoutFiles(topLevel, QStringList(), revision); + success = m_client->synchronousReset(topLevel) + && m_client->synchronousCheckoutBranch(topLevel, branch) + && m_client->synchronousCheckoutFiles(topLevel, QStringList(), revision); } else { // Restore stash if it can be resolved. QString stashName; - success = gitClient()->stashNameFromMessage(topLevel, name, &stashName) - && gitClient()->synchronousReset(topLevel) - && gitClient()->synchronousStashRestore(topLevel, stashName); + success = m_client->stashNameFromMessage(topLevel, name, &stashName) + && m_client->synchronousReset(topLevel) + && m_client->synchronousStashRestore(topLevel, stashName); } } while (false); return success; @@ -220,8 +218,8 @@ bool GitVersionControl::vcsRemoveSnapshot(const QString &topLevel, const QString if (name.startsWith(QLatin1String(stashRevisionIdC))) return true; QString stashName; - return gitClient()->stashNameFromMessage(topLevel, name, &stashName) - && gitClient()->synchronousStashRemove(topLevel, stashName); + return m_client->stashNameFromMessage(topLevel, name, &stashName) + && m_client->synchronousStashRemove(topLevel, stashName); } bool GitVersionControl::managesDirectory(const QString &directory, QString *topLevel) const @@ -235,7 +233,7 @@ bool GitVersionControl::managesDirectory(const QString &directory, QString *topL bool GitVersionControl::vcsAnnotate(const QString &file, int line) { const QFileInfo fi(file); - gitClient()->blame(fi.absolutePath(), QStringList(), fi.fileName(), QString(), line); + m_client->blame(fi.absolutePath(), QStringList(), fi.fileName(), QString(), line); return true; } diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h index 71917ad36da52ede7fe391f774073f65f2cecd41..b4c62e535a10f8ea3b204f73b4f7bf92539f4441 100644 --- a/src/plugins/git/gitversioncontrol.h +++ b/src/plugins/git/gitversioncontrol.h @@ -51,6 +51,7 @@ public: bool managesDirectory(const QString &directory, QString *topLevel) const; + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); bool vcsAdd(const QString &fileName); @@ -70,7 +71,6 @@ public: void emitRepositoryChanged(const QString &); private: - bool m_enabled; GitClient *m_client; }; diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp index e5cd67b840e65f7b4df2dfd3a77a629ed72bc4a8..9b7af6a54aabc221feced1fa95da01b41f8ea65d 100644 --- a/src/plugins/mercurial/mercurialcontrol.cpp +++ b/src/plugins/mercurial/mercurialcontrol.cpp @@ -33,6 +33,8 @@ #include "mercurialcontrol.h" #include "mercurialclient.h" +#include <vcsbase/vcsbaseclientsettings.h> + #include <QtCore/QFileInfo> #include <QtCore/QVariant> #include <QtCore/QStringList> @@ -59,9 +61,18 @@ bool MercurialControl::managesDirectory(const QString &directory, QString *topLe return !topLevelFound.isEmpty(); } +bool MercurialControl::isConfigured() const +{ + const QString binary = mercurialClient->settings().binary(); + if (binary.isEmpty()) + return false; + QFileInfo fi(binary); + return fi.exists() && fi.isFile() && fi.isExecutable(); +} + bool MercurialControl::supportsOperation(Operation operation) const { - bool supported = true; + bool supported = isConfigured(); switch (operation) { case Core::IVersionControl::AddOperation: case Core::IVersionControl::DeleteOperation: diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h index 6ae14d3cd816ba2c46a02eb224dde258fe8c38e0..687c8d4908257762f8235dcdd588e758f7501845 100644 --- a/src/plugins/mercurial/mercurialcontrol.h +++ b/src/plugins/mercurial/mercurialcontrol.h @@ -54,6 +54,7 @@ public: QString displayName() const; bool managesDirectory(const QString &filename, QString *topLevel = 0) const; + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); bool vcsAdd(const QString &filename); diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 7cf1bf75015a203878e90aac54409662a1c0c0c0..170cc91dc73d0befa1dff6410603375ee8edae56 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -33,6 +33,7 @@ #include "perforceversioncontrol.h" #include "perforceplugin.h" #include "perforceconstants.h" +#include "perforcesettings.h" #include <QtCore/QFileInfo> #include <QtCore/QDebug> @@ -41,7 +42,6 @@ namespace Perforce { namespace Internal { PerforceVersionControl::PerforceVersionControl(PerforcePlugin *plugin) : - m_enabled(true), m_plugin(plugin) { } @@ -51,15 +51,25 @@ QString PerforceVersionControl::displayName() const return QLatin1String("perforce"); } +bool PerforceVersionControl::isConfigured() const +{ + const QString binary = m_plugin->settings().p4Command(); + if (binary.isEmpty()) + return false; + QFileInfo fi(binary); + return fi.exists() && fi.isFile() && fi.isExecutable(); +} + bool PerforceVersionControl::supportsOperation(Operation operation) const { + bool supported = isConfigured(); switch (operation) { case AddOperation: case DeleteOperation: case MoveOperation: case OpenOperation: case AnnotateOperation: - return true; + return supported; case CreateRepositoryOperation: case SnapshotOperations: case CheckoutOperation: diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h index 282277ff2a86f37aff130aa2e9fb6172af13c99e..bc775555915105ca44ec2191c649120bc82bfa02 100644 --- a/src/plugins/perforce/perforceversioncontrol.h +++ b/src/plugins/perforce/perforceversioncontrol.h @@ -50,7 +50,7 @@ public: bool managesDirectory(const QString &directory, QString *topLevel = 0) const; - + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); SettingsFlags settingsFlags() const; diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index 4be772918a10cfdbc2eb28699b5edb2591927509..08fab79557efc916c4846cf92ae6271b5ecce433 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -32,6 +32,7 @@ #include "subversioncontrol.h" #include "subversionplugin.h" +#include "subversionsettings.h" #include <QtCore/QFileInfo> @@ -48,9 +49,18 @@ QString SubversionControl::displayName() const return QLatin1String("subversion"); } +bool SubversionControl::isConfigured() const +{ + const QString binary = m_plugin->settings().svnCommand; + if (binary.isEmpty()) + return false; + QFileInfo fi(binary); + return fi.exists() && fi.isFile() && fi.isExecutable(); +} + bool SubversionControl::supportsOperation(Operation operation) const { - bool rc = true; + bool rc = isConfigured(); switch (operation) { case AddOperation: case DeleteOperation: diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h index bdf6bd0b67f99598a61029f8217cbd1751b4350a..1dd519328f290daf5ff27ca087cc25009401ad40 100644 --- a/src/plugins/subversion/subversioncontrol.h +++ b/src/plugins/subversion/subversioncontrol.h @@ -50,6 +50,7 @@ public: bool managesDirectory(const QString &directory, QString *topLevel = 0) const; + bool isConfigured() const; bool supportsOperation(Operation operation) const; bool vcsOpen(const QString &fileName); bool vcsAdd(const QString &fileName);