From fe873398885673fea7df8adebd3f750f79b32459 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 24 Oct 2018 16:32:11 +0300 Subject: [PATCH] Git: Fix resolving top level for non-existent sub-sub-directory When a directory is renamed, and it has sub{sub-}*directories, executing git blame on a file in the subdirectory -> Blame Revision (or parent) for the file in the previous name -> Show failed because it couldn't determine the top level directory. You can test by opening qmakeprojectmanager/wizards/filespage.cpp and blaming one of the lines that had it as qt4projectmanager/... Change-Id: I7ac964c12f1f368c5ce92e9bedd972a2bc824935 Reviewed-by: Tobias Hunger --- src/plugins/git/gitclient.cpp | 26 ++++++++++++++------------ src/plugins/git/gitclient.h | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 5c168cf1bba..ad7cd7ca177 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -769,22 +769,24 @@ GitClient::GitClient() : VcsBase::VcsBaseClientImpl(new GitSettings), .arg(QCoreApplication::applicationPid()); } -QString GitClient::findRepositoryForDirectory(const QString &dir) const +QString GitClient::findRepositoryForDirectory(const QString &directory) const { - if (dir.isEmpty() || dir.endsWith("/.git") || dir.contains("/.git/")) + if (directory.isEmpty() || directory.endsWith("/.git") || directory.contains("/.git/")) return QString(); - QDir directory(dir); // QFileInfo is outside loop, because it is faster this way QFileInfo fileInfo; - do { - if (directory.exists(GIT_DIRECTORY)) { - fileInfo.setFile(directory, GIT_DIRECTORY); - if (fileInfo.isFile()) - return directory.absolutePath(); - else if (directory.exists(".git/config")) - return directory.absolutePath(); - } - } while (!directory.isRoot() && directory.cdUp()); + FileName parent; + for (FileName dir = FileName::fromString(directory); !dir.isEmpty(); dir = dir.parentDir()) { + FileName gitName = FileName(dir).appendPath(GIT_DIRECTORY); + if (!gitName.exists()) + continue; // parent might exist + fileInfo.setFile(gitName.toString()); + if (fileInfo.isFile()) + return dir.toString(); + gitName.appendPath("config"); + if (gitName.exists()) + return dir.toString(); + } return QString(); } diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 59b64ae2027..b60cb3dfe15 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -128,7 +128,7 @@ public: const QStringList &arguments, bool isRebase = false); - QString findRepositoryForDirectory(const QString &dir) const; + QString findRepositoryForDirectory(const QString &directory) const; QString findGitDirForRepository(const QString &repositoryDir) const; bool managesFile(const QString &workingDirectory, const QString &fileName) const;