diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2018-10-24 16:32:11 +0300 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2018-10-25 17:52:28 +0000 |
commit | fe873398885673fea7df8adebd3f750f79b32459 (patch) | |
tree | 00a26ec7c5d053f1e5549c7ada7e13b29f0be842 | |
parent | 9c5afd8e96306b36b02e6f225ea79abcf497f279 (diff) | |
download | qt-creator-fe873398885673fea7df8adebd3f750f79b32459.tar.gz |
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 <tobias.hunger@qt.io>
-rw-r--r-- | src/plugins/git/gitclient.cpp | 26 | ||||
-rw-r--r-- | 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 5c168cf1bb..ad7cd7ca17 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 59b64ae202..b60cb3dfe1 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; |