From c18dc4d447e20652611b951b3013a73eefe1c94c Mon Sep 17 00:00:00 2001 From: Sami Tikka Date: Tue, 7 Dec 2010 12:26:42 +0100 Subject: [PATCH] VCS: Support nested repositories Find correct version control to use in a repo inside another repo (e.g. SVN checkout inside a git repo) Merge-request: 224 Reviewed-by: Tobias Hunger --- src/plugins/coreplugin/vcsmanager.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index da42a17bad..33470b43b8 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -86,6 +86,11 @@ void VCSManager::extensionsInitialized() } } +static bool longerThanPath(QPair &pair1, QPair &pair2) +{ + return pair1.first.size() > pair2.first.size(); +} + IVersionControl* VCSManager::findVersionControlForDirectory(const QString &directory, QString *topLevelDirectory) { @@ -143,18 +148,34 @@ IVersionControl* VCSManager::findVersionControlForDirectory(const QString &direc // Nothing: ask the IVersionControls directly, insert the toplevel into the cache. const VersionControlList versionControls = allVersionControls(); + QList > allThatCanManage; + foreach (IVersionControl * versionControl, versionControls) { QString topLevel; if (versionControl->managesDirectory(directory, &topLevel)) { - m_d->m_cachedMatches.insert(topLevel, versionControl); - if (topLevelDirectory) - *topLevelDirectory = topLevel; if (debug) - qDebug("displayName()), qPrintable(topLevel)); - return versionControl; + qDebug("displayName()), + qPrintable(topLevel)); + allThatCanManage.push_back(qMakePair(topLevel, versionControl)); } } + + // To properly find a nested repository (say, git checkout inside SVN), + // we need to select the version control with the longest toplevel pathname. + qSort(allThatCanManage.begin(), allThatCanManage.end(), longerThanPath); + + if (!allThatCanManage.isEmpty()) { + QString toplevel = allThatCanManage.first().first; + IVersionControl *versionControl = allThatCanManage.first().second; + m_d->m_cachedMatches.insert(toplevel, versionControl); + if (topLevelDirectory) + *topLevelDirectory = toplevel; + if (debug) + qDebug("displayName()), qPrintable(toplevel)); + return versionControl; + } if (debug) qDebug("