summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2018-10-24 16:32:11 +0300
committerOrgad Shaneh <orgads@gmail.com>2018-10-25 17:52:28 +0000
commitfe873398885673fea7df8adebd3f750f79b32459 (patch)
tree00a26ec7c5d053f1e5549c7ada7e13b29f0be842
parent9c5afd8e96306b36b02e6f225ea79abcf497f279 (diff)
downloadqt-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.cpp26
-rw-r--r--src/plugins/git/gitclient.h2
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;