diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index eccf134364968c548c839e77f533ad93a1144e1e..3165f1de1f60ed0770e34722ef1f87a0df08faec 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1370,7 +1370,22 @@ bool SubversionPlugin::managesDirectory(const QString &directory, QString *topLe if (topLevel) topLevel->clear(); bool manages = false; + // Subversion >= 1.7: Check for furthest parent containing + // ".svn/wc.db". Need to check for furthest parent as closer + // parents may be svn:externals. + if (dir.exists()) { + QDir parentDir = dir; + while (parentDir.cdUp()) { + if (checkSVNSubDir(parentDir, QLatin1String("wc.db"))) { + manages = true; + if (topLevel) + *topLevel = parentDir.absolutePath(); + } + } + } do { + if (manages) + break; if (!dir.exists() || !checkSVNSubDir(dir)) break; manages = true; @@ -1387,18 +1402,6 @@ bool SubversionPlugin::managesDirectory(const QString &directory, QString *topLe } } } while (false); - // Subversion >= 1.7: Check for first parent containing ".svn" - if (!manages) { - QDir parentDir = dir; - while (parentDir.cdUp()) { - if (checkSVNSubDir(parentDir)) { - manages = true; - if (topLevel) - *topLevel = parentDir.absolutePath(); - break; - } - } - } if (Subversion::Constants::debug) { QDebug nsp = qDebug().nospace(); nsp << "SubversionPlugin::managesDirectory" << directory << manages; @@ -1409,13 +1412,16 @@ bool SubversionPlugin::managesDirectory(const QString &directory, QString *topLe } // Check whether SVN management subdirs exist. -bool SubversionPlugin::checkSVNSubDir(const QDir &directory) const +bool SubversionPlugin::checkSVNSubDir(const QDir &directory, const QString &fileName) const { const int dirCount = m_svnDirectories.size(); for (int i = 0; i < dirCount; i++) { const QString svnDir = directory.absoluteFilePath(m_svnDirectories.at(i)); - if (QFileInfo(svnDir).isDir()) - return true; + if (!QFileInfo(svnDir).isDir()) + continue; + if (!fileName.isEmpty() && !QDir(svnDir).exists(fileName)) + continue; + return true; } return false; } diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h index ddadc78597d8f54af198236bdce70fbc38fc1bed..14d582d6c3d50b3d908e5fff8339d4becf75e6ad 100644 --- a/src/plugins/subversion/subversionplugin.h +++ b/src/plugins/subversion/subversionplugin.h @@ -163,7 +163,7 @@ private: bool enableAnnotationContextMenu = false); void svnStatus(const QString &workingDir, const QStringList &relativePath = QStringList()); void svnUpdate(const QString &workingDir, const QStringList &relativePaths = QStringList()); - bool checkSVNSubDir(const QDir &directory) const; + bool checkSVNSubDir(const QDir &directory, const QString &fileName = QString()) const; void startCommit(const QString &workingDir, const QStringList &files = QStringList()); bool commit(const QString &messageFile, const QStringList &subVersionFileList); void cleanCommitMessageFile();