diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index dedef3247f3..c69f40d7c33 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -85,9 +85,13 @@ public: qDeleteAll(m_vcsInfoList); } - VcsInfo *findInCache(const QString &directory) + VcsInfo *findInCache(const QString &dir) { - const QMap::const_iterator it = m_cachedMatches.constFind(directory); + Q_ASSERT(QDir(dir).isAbsolute()); + Q_ASSERT(!dir.endsWith(QLatin1Char('/'))); + Q_ASSERT(QDir::fromNativeSeparators(dir) == dir); + + const QMap::const_iterator it = m_cachedMatches.constFind(dir); if (it != m_cachedMatches.constEnd()) return it.value(); return 0; @@ -108,9 +112,25 @@ public: return result; } - void cache(IVersionControl *vc, const QString topLevel, const QString directory) + void resetCache(const QString &dir) { - Q_ASSERT(directory.startsWith(topLevel)); + Q_ASSERT(QDir(dir).isAbsolute()); + Q_ASSERT(!dir.endsWith(QLatin1Char('/'))); + Q_ASSERT(QDir::fromNativeSeparators(dir) == dir); + + const QString dirSlash = dir + QLatin1Char('/'); + foreach (const QString &key, m_cachedMatches.keys()) { + if (key == dir || key.startsWith(dirSlash)) + m_cachedMatches.remove(key); + } + } + + void cache(IVersionControl *vc, const QString topLevel, const QString dir) + { + Q_ASSERT(QDir(dir).isAbsolute()); + Q_ASSERT(!dir.endsWith(QLatin1Char('/'))); + Q_ASSERT(QDir::fromNativeSeparators(dir) == dir); + Q_ASSERT(dir.startsWith(topLevel)); VcsInfo *newInfo = new VcsInfo(vc, topLevel); bool createdNewInfo(true); @@ -126,7 +146,7 @@ public: if (createdNewInfo) m_vcsInfoList.append(newInfo); - QString tmpDir = directory; + QString tmpDir = dir; while (tmpDir.count() >= topLevel.count() && tmpDir.count() > 0) { m_cachedMatches.insert(tmpDir, newInfo); int slashPos = tmpDir.lastIndexOf(SLASH); @@ -168,6 +188,17 @@ static bool longerThanPath(QPair &pair1, QPair pair2.first.size(); } +void VcsManager::resetVersionControlForDirectory(const QString &inputDirectory) +{ + if (inputDirectory.isEmpty()) + return; + + const QString directory = QDir(inputDirectory).absolutePath(); + + d->resetCache(directory); + emit repositoryChanged(directory); +} + IVersionControl* VcsManager::findVersionControlForDirectory(const QString &inputDirectory, QString *topLevelDirectory) { diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index ca47e77d1ac..492e417f7a1 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -65,6 +65,7 @@ public: void extensionsInitialized(); + void resetVersionControlForDirectory(const QString &inputDirectory); IVersionControl *findVersionControlForDirectory(const QString &directory, QString *topLevelDirectory = 0); IVersionControl *checkout(const QString &versionControlType, diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 5cd1f9bf480..cdb10286349 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -965,6 +966,11 @@ bool GitClient::synchronousInit(const QString &workingDirectory) outputWindow()->append(commandOutputFromLocal8Bit(outputText)); if (!rc) outputWindow()->appendError(commandOutputFromLocal8Bit(errorText)); + else { + // TODO: Turn this into a VCSBaseClient and use resetCachedVcsInfo(...) + Core::VcsManager *vcsManager = m_core->vcsManager(); + vcsManager->resetVersionControlForDirectory(workingDirectory); + } return rc; } @@ -2371,7 +2377,10 @@ bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) workingDirectory.cdUp(); const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(), arguments, flags); - return resp.result == Utils::SynchronousProcessResponse::Finished; + // TODO: Turn this into a VCSBaseClient and use resetCachedVcsInfo(...) + Core::VcsManager *vcsManager = m_core->vcsManager(); + vcsManager->resetVersionControlForDirectory(workingDirectory.absolutePath()); + return (resp.result == Utils::SynchronousProcessResponse::Finished); } } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 359bf250431..f63b13d288b 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -166,6 +167,9 @@ bool VCSBaseClient::synchronousCreateRepository(const QString &workingDirectory, QString output = QString::fromLocal8Bit(outputData); output.remove(QLatin1Char('\r')); VCSBase::VCSBaseOutputWindow::instance()->append(output); + + resetCachedVcsInfo(workingDirectory); + return true; } @@ -178,7 +182,9 @@ bool VCSBaseClient::synchronousClone(const QString &workingDir, args << vcsCommandString(CloneCommand) << extraOptions << srcLocation << dstLocation; QByteArray stdOut; - return vcsFullySynchronousExec(workingDir, args, &stdOut); + const bool cloneOk = vcsFullySynchronousExec(workingDir, args, &stdOut); + resetCachedVcsInfo(workingDir); + return cloneOk; } bool VCSBaseClient::synchronousAdd(const QString &workingDir, const QString &filename, @@ -567,6 +573,12 @@ VCSBase::VCSBaseEditorWidget *VCSBaseClient::createVCSEditor(const QString &kind return baseEditor; } +void VCSBaseClient::resetCachedVcsInfo(const QString &workingDir) +{ + Core::VcsManager *vcsManager = d->m_core->vcsManager(); + vcsManager->resetVersionControlForDirectory(workingDir); +} + void VCSBaseClient::enqueueJob(const QSharedPointer &job) { if (!d->m_jobManager) { diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index cdc11a376ae..2cf00b1de77 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -37,14 +37,11 @@ #include #include -#include #include #include -#include QT_BEGIN_NAMESPACE class QFileInfo; -class QVariant; QT_END_NAMESPACE namespace Utils { @@ -179,6 +176,8 @@ protected: const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; + void resetCachedVcsInfo(const QString &workingDir); + private: friend class VCSBaseClientPrivate; QScopedPointer d; diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index 01a2cbadf9f..a2207342653 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -209,6 +209,8 @@ StateListener::StateListener(QObject *parent) : this, SLOT(slotStateChanged())); connect(core->editorManager()->instance(), SIGNAL(currentEditorStateChanged(Core::IEditor*)), this, SLOT(slotStateChanged())); + connect(core->vcsManager(), SIGNAL(repositoryChanged(QString)), + this, SLOT(slotStateChanged())); if (ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance()) connect(pe, SIGNAL(currentProjectChanged(ProjectExplorer::Project*)),