summaryrefslogtreecommitdiff
path: root/src/plugins/subversion
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2010-05-20 16:24:39 +0200
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2010-05-20 16:24:56 +0200
commit7003b82e2ba68f24c9e5c27107aacd82898ba9cf (patch)
tree9b18d005e0b5f34089e82e9092ce852806d5a471 /src/plugins/subversion
parent58a5da63a8b698de6f7faae95afa9e783569353c (diff)
downloadqt-creator-7003b82e2ba68f24c9e5c27107aacd82898ba9cf.tar.gz
Version control: Improve detection.
Merge managesDirectory() and findTopLevelForDirectory() into one giving managesDirectory() an optional topLevel parameter. This removes the need to go up the directory hierarchy twice when checking for Merurial or git and also saves some checks for CVS/Subversion. VCSManager: Check cache in reverse order starting out with the full path first to improve handling of nested repositories. Rubber-stamped-by: con Acked-by: dt
Diffstat (limited to 'src/plugins/subversion')
-rw-r--r--src/plugins/subversion/subversioncontrol.cpp9
-rw-r--r--src/plugins/subversion/subversioncontrol.h3
-rw-r--r--src/plugins/subversion/subversionplugin.cpp67
-rw-r--r--src/plugins/subversion/subversionplugin.h6
4 files changed, 39 insertions, 46 deletions
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index f7b4648dcb..f25fc3ab6a 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -114,14 +114,9 @@ bool SubversionControl::vcsRemoveSnapshot(const QString &, const QString &)
return false;
}
-bool SubversionControl::managesDirectory(const QString &directory) const
+bool SubversionControl::managesDirectory(const QString &directory, QString *topLevel) const
{
- return m_plugin->managesDirectory(directory);
-}
-
-QString SubversionControl::findTopLevelForDirectory(const QString &directory) const
-{
- return m_plugin->findTopLevelForDirectory(directory);
+ return m_plugin->managesDirectory(directory, topLevel);
}
bool SubversionControl::vcsAnnotate(const QString &file, int line)
diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h
index 8389f82249..5610059d66 100644
--- a/src/plugins/subversion/subversioncontrol.h
+++ b/src/plugins/subversion/subversioncontrol.h
@@ -45,8 +45,7 @@ public:
explicit SubversionControl(SubversionPlugin *plugin);
virtual QString displayName() const;
- virtual bool managesDirectory(const QString &directory) const;
- virtual QString findTopLevelForDirectory(const QString &directory) const;
+ virtual bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
virtual bool supportsOperation(Operation operation) const;
virtual bool vcsOpen(const QString &fileName);
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 857bad4731..ff299b1912 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -940,8 +940,9 @@ void SubversionPlugin::describe(const QString &source, const QString &changeNr)
// To describe a complete change, find the top level and then do
//svn diff -r 472958:472959 <top level>
const QFileInfo fi(source);
- const QString topLevel = findTopLevelForDirectory(fi.isDir() ? source : fi.absolutePath());
- if (topLevel.isEmpty())
+ QString topLevel;
+ const bool manages = managesDirectory(fi.isDir() ? source : fi.absolutePath(), &topLevel);
+ if (!manages || topLevel.isEmpty())
return;
if (Subversion::Constants::debug)
qDebug() << Q_FUNC_INFO << source << topLevel << changeNr;
@@ -1184,7 +1185,7 @@ bool SubversionPlugin::vcsAdd14(const QString &workingDir, const QString &rawFil
if (!path.isEmpty())
path += slash;
path += relativePath.at(p);
- if (!managesDirectory(QDir(path))) {
+ if (!checkSVNSubDir(QDir(path))) {
QStringList addDirArgs;
addDirArgs << QLatin1String("add") << QLatin1String("--non-recursive") << QDir::toNativeSeparators(path);
const SubversionResponse addDirResponse = runSvn(workingDir, addDirArgs, m_settings.timeOutMS(), true);
@@ -1224,16 +1225,40 @@ bool SubversionPlugin::vcsMove(const QString &workingDir, const QString &from, c
/* Subversion has ".svn" directory in each directory
* it manages. The top level is the first directory
* under the directory that does not have a ".svn". */
-bool SubversionPlugin::managesDirectory(const QString &directory) const
+bool SubversionPlugin::managesDirectory(const QString &directory, QString *topLevel /* = 0 */) const
{
const QDir dir(directory);
- const bool rc = dir.exists() && managesDirectory(dir);
- if (Subversion::Constants::debug)
- qDebug() << "SubversionPlugin::managesDirectory" << directory << rc;
- return rc;
+ if (topLevel)
+ topLevel->clear();
+ bool manages = false;
+ do {
+ if (!dir.exists() || !checkSVNSubDir(dir))
+ break;
+ manages = true;
+ if (!topLevel)
+ break;
+ /* Recursing up, the top level is a child of the first directory that does
+ * not have a ".svn" directory. The starting directory must be a managed
+ * one. Go up and try to find the first unmanaged parent dir. */
+ QDir lastDirectory = dir;
+ for (QDir parentDir = lastDirectory; parentDir.cdUp() ; lastDirectory = parentDir) {
+ if (!checkSVNSubDir(parentDir)) {
+ *topLevel = lastDirectory.absolutePath();
+ break;
+ }
+ }
+ } while (false);
+ if (Subversion::Constants::debug) {
+ QDebug nsp = qDebug().nospace();
+ nsp << "SubversionPlugin::managesDirectory" << directory << manages;
+ if (topLevel)
+ nsp << *topLevel;
+ }
+ return manages;
}
-bool SubversionPlugin::managesDirectory(const QDir &directory) const
+// Check whether SVN management subdirs exist.
+bool SubversionPlugin::checkSVNSubDir(const QDir &directory) const
{
const int dirCount = m_svnDirectories.size();
for (int i = 0; i < dirCount; i++) {
@@ -1244,30 +1269,6 @@ bool SubversionPlugin::managesDirectory(const QDir &directory) const
return false;
}
-QString SubversionPlugin::findTopLevelForDirectory(const QString &directory) const
-{
- // Debug wrapper
- const QString rc = findTopLevelForDirectoryI(directory);
- if (Subversion::Constants::debug)
- qDebug() << "SubversionPlugin::findTopLevelForDirectory" << directory << rc;
- return rc;
-}
-
-QString SubversionPlugin::findTopLevelForDirectoryI(const QString &directory) const
-{
- /* Recursing up, the top level is a child of the first directory that does
- * not have a ".svn" directory. The starting directory must be a managed
- * one. Go up and try to find the first unmanaged parent dir. */
- QDir lastDirectory = QDir(directory);
- if (!lastDirectory.exists() || !managesDirectory(lastDirectory))
- return QString();
- for (QDir parentDir = lastDirectory; parentDir.cdUp() ; lastDirectory = parentDir) {
- if (!managesDirectory(parentDir))
- return lastDirectory.absolutePath();
- }
- return QString();
-}
-
SubversionControl *SubversionPlugin::subVersionControl() const
{
return static_cast<SubversionControl *>(versionControl());
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index a7bb187c56..278cb2d303 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -95,8 +95,7 @@ public:
bool vcsAdd15(const QString &workingDir, const QString &fileName);
bool vcsDelete(const QString &workingDir, const QString &fileName);
bool vcsMove(const QString &workingDir, const QString &from, const QString &to);
- bool managesDirectory(const QString &directory) const;
- QString findTopLevelForDirectory(const QString &directory) const;
+ bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
static SubversionPlugin *subversionPluginInstance();
@@ -145,8 +144,7 @@ private:
bool enableAnnotationContextMenu = false);
void svnStatus(const QString &workingDir, const QStringList &relativePath = QStringList());
void svnUpdate(const QString &workingDir, const QStringList &relativePaths = QStringList());
- bool managesDirectory(const QDir &directory) const;
- QString findTopLevelForDirectoryI(const QString &directory) const;
+ bool checkSVNSubDir(const QDir &directory) const;
void startCommit(const QString &workingDir, const QStringList &files = QStringList());
bool commit(const QString &messageFile, const QStringList &subVersionFileList);
void cleanCommitMessageFile();