diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp index cf7f9fcfa4f..43c0a8356f1 100644 --- a/src/plugins/bazaar/bazaarcontrol.cpp +++ b/src/plugins/bazaar/bazaarcontrol.cpp @@ -33,6 +33,8 @@ #include "bazaarcontrol.h" #include "bazaarclient.h" +#include + #include #include #include @@ -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 deff2efe279..5d0182b2ae1 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 5b94e18c6df..2e264e337d6 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 2dfa2b95662..ce1801eb52f 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 @@ -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 12145a6aad0..a26366eb0f2 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 08a122dc92c..8687ec823f1 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 GitEditorFactory; typedef VCSBase::VCSSubmitEditorFactory 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 c53a49f62c6..9977fd8db25 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 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 71917ad36da..b4c62e535a1 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 e5cd67b840e..9b7af6a54aa 100644 --- a/src/plugins/mercurial/mercurialcontrol.cpp +++ b/src/plugins/mercurial/mercurialcontrol.cpp @@ -33,6 +33,8 @@ #include "mercurialcontrol.h" #include "mercurialclient.h" +#include + #include #include #include @@ -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 6ae14d3cd81..687c8d49082 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 7cf1bf75015..170cc91dc73 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 #include @@ -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 282277ff2a8..bc775555915 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 4be772918a1..08fab79557e 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 @@ -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 bdf6bd0b67f..1dd519328f2 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);