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>
This commit is contained in:
Orgad Shaneh
2018-10-24 16:32:11 +03:00
committed by Orgad Shaneh
parent 9c5afd8e96
commit fe87339888
2 changed files with 15 additions and 13 deletions

View File

@@ -769,22 +769,24 @@ GitClient::GitClient() : VcsBase::VcsBaseClientImpl(new GitSettings),
.arg(QCoreApplication::applicationPid()); .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(); return QString();
QDir directory(dir);
// QFileInfo is outside loop, because it is faster this way // QFileInfo is outside loop, because it is faster this way
QFileInfo fileInfo; QFileInfo fileInfo;
do { FileName parent;
if (directory.exists(GIT_DIRECTORY)) { for (FileName dir = FileName::fromString(directory); !dir.isEmpty(); dir = dir.parentDir()) {
fileInfo.setFile(directory, GIT_DIRECTORY); FileName gitName = FileName(dir).appendPath(GIT_DIRECTORY);
if (!gitName.exists())
continue; // parent might exist
fileInfo.setFile(gitName.toString());
if (fileInfo.isFile()) if (fileInfo.isFile())
return directory.absolutePath(); return dir.toString();
else if (directory.exists(".git/config")) gitName.appendPath("config");
return directory.absolutePath(); if (gitName.exists())
return dir.toString();
} }
} while (!directory.isRoot() && directory.cdUp());
return QString(); return QString();
} }

View File

@@ -128,7 +128,7 @@ public:
const QStringList &arguments, const QStringList &arguments,
bool isRebase = false); bool isRebase = false);
QString findRepositoryForDirectory(const QString &dir) const; QString findRepositoryForDirectory(const QString &directory) const;
QString findGitDirForRepository(const QString &repositoryDir) const; QString findGitDirForRepository(const QString &repositoryDir) const;
bool managesFile(const QString &workingDirectory, const QString &fileName) const; bool managesFile(const QString &workingDirectory, const QString &fileName) const;