diff --git a/src/plugins/git/gerrit/gerritparameters.cpp b/src/plugins/git/gerrit/gerritparameters.cpp index e5f8922511f..d4b2eaee4f3 100644 --- a/src/plugins/git/gerrit/gerritparameters.cpp +++ b/src/plugins/git/gerrit/gerritparameters.cpp @@ -73,14 +73,9 @@ static inline QString detectSsh() if (!ssh.isEmpty()) return ssh; if (Utils::HostOsInfo::isWindowsHost()) { // Windows: Use ssh.exe from git if it cannot be found. - const QString git = GerritPlugin::gitBinary(); - if (!git.isEmpty()) { - // Is 'git\cmd' in the path (folder containing .bats)? - QString path = QFileInfo(git).absolutePath(); - if (path.endsWith(QLatin1String("cmd"), Qt::CaseInsensitive)) - path.replace(path.size() - 3, 3, QLatin1String("bin")); - ssh = path + QLatin1Char('/') + QLatin1String(defaultSshC); - } + Utils::FileName path = GerritPlugin::gitBinDirectory(); + if (!path.isEmpty()) + ssh = path.appendPath(QLatin1String(defaultSshC)).toString(); } return ssh; } diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index e89c2242da8..16b1ff0cf65 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -399,6 +399,11 @@ QString GerritPlugin::gitBinary() return git; } +Utils::FileName GerritPlugin::gitBinDirectory() +{ + return gitClient()->gitBinDirectory(); +} + // Find the branch of a repository. QString GerritPlugin::branch(const QString &repository) { diff --git a/src/plugins/git/gerrit/gerritplugin.h b/src/plugins/git/gerrit/gerritplugin.h index cc5723c2f75..23ee4fe0871 100644 --- a/src/plugins/git/gerrit/gerritplugin.h +++ b/src/plugins/git/gerrit/gerritplugin.h @@ -30,6 +30,8 @@ #ifndef GERRIT_INTERNAL_GERRITPLUGIN_H #define GERRIT_INTERNAL_GERRITPLUGIN_H +#include + #include #include #include @@ -62,6 +64,7 @@ public: bool initialize(Core::ActionContainer *ac); static QString gitBinary(); + static Utils::FileName gitBinDirectory(); static QString branch(const QString &repository); void addToLocator(Core::CommandLocator *locator); void push(const QString &topLevel); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index da79d36bd7c..279124a12eb 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -2636,6 +2636,24 @@ bool GitClient::launchGitGui(const QString &workingDirectory) { return success; } +Utils::FileName GitClient::gitBinDirectory() +{ + const QString git = gitBinaryPath(); + if (git.isEmpty()) + return Utils::FileName(); + + // Is 'git\cmd' in the path (folder containing .bats)? + QString path = QFileInfo(git).absolutePath(); + // Git for Windows (msysGit) has git and gitk redirect executables in {setup dir}/cmd + // and the real binaries are in {setup dir}/bin. If cmd is configured in PATH + // or in Git settings, return bin instead. + if (Utils::HostOsInfo::isWindowsHost() + && path.endsWith(QLatin1String("/cmd"), Utils::HostOsInfo::fileNameCaseSensitivity())) { + path.replace(path.size() - 3, 3, QLatin1String("bin")); + } + return Utils::FileName::fromString(path); +} + QString GitClient::gitBinaryPath(bool *ok, QString *errorMessage) const { return settings()->gitBinaryPath(ok, errorMessage); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 9c54da4f941..c174f812987 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -35,6 +35,8 @@ #include +#include + #include #include #include @@ -315,6 +317,7 @@ public: void launchGitK(const QString &workingDirectory, const QString &fileName); void launchGitK(const QString &workingDirectory) { launchGitK(workingDirectory, QString()); } bool launchGitGui(const QString &workingDirectory); + Utils::FileName gitBinDirectory(); void launchRepositoryBrowser(const QString &workingDirectory);