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());
|
.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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user