forked from qt-creator/qt-creator
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:
committed by
Orgad Shaneh
parent
9c5afd8e96
commit
fe87339888
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user