From 27ce04bb5b21dc07671addcf954f3efcf3bf95e8 Mon Sep 17 00:00:00 2001
From: Petar Perisin <petar.perisin@gmail.com>
Date: Mon, 2 Dec 2013 21:15:39 +0100
Subject: [PATCH] Git: search for gitk in path if all else fails

Change-Id: I4799791b2baffa61092c01699a4128f01151b53c
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
---
 src/plugins/git/gitclient.cpp | 37 +++++++++++++++++++++++------------
 src/plugins/git/gitclient.h   |  3 +--
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 4636c673615..3f73eaf1e76 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -2880,12 +2880,31 @@ void GitClient::launchGitK(const QString &workingDirectory, const QString &fileN
     QDir foundBinDir(binaryInfo.dir());
     const bool foundBinDirIsCmdDir = foundBinDir.dirName() == QLatin1String("cmd");
     QProcessEnvironment env = processEnvironment();
-    if (tryLauchingGitK(env, workingDirectory, fileName, foundBinDir.path(), foundBinDirIsCmdDir))
+    if (tryLauchingGitK(env, workingDirectory, fileName, foundBinDir.path()))
         return;
-    if (!foundBinDirIsCmdDir)
+
+    QString gitkPath = foundBinDir.path() + QLatin1String("/gitk");
+    VcsBase::VcsBaseOutputWindow::instance()->appendSilently(msgCannotLaunch(gitkPath));
+
+    if (foundBinDirIsCmdDir) {
+        foundBinDir.cdUp();
+        if (tryLauchingGitK(env, workingDirectory, fileName,
+                            foundBinDir.path() + QLatin1String("/bin"))) {
+            return;
+        }
+        gitkPath = foundBinDir.path() + QLatin1String("/gitk");
+        VcsBase::VcsBaseOutputWindow::instance()->appendSilently(msgCannotLaunch(gitkPath));
+    }
+
+    Utils::Environment sysEnv = Utils::Environment::systemEnvironment();
+    const QString exec = sysEnv.searchInPath(QLatin1String("gitk"));
+
+    if (!exec.isEmpty() && tryLauchingGitK(env, workingDirectory, fileName,
+                                           QFileInfo(exec).absolutePath())) {
         return;
-    foundBinDir.cdUp();
-    tryLauchingGitK(env, workingDirectory, fileName, foundBinDir.path() + QLatin1String("/bin"), false);
+    }
+
+    VcsBase::VcsBaseOutputWindow::instance()->appendError(msgCannotLaunch(QLatin1String("gitk")));
 }
 
 void GitClient::launchRepositoryBrowser(const QString &workingDirectory)
@@ -2898,8 +2917,7 @@ void GitClient::launchRepositoryBrowser(const QString &workingDirectory)
 bool GitClient::tryLauchingGitK(const QProcessEnvironment &env,
                                 const QString &workingDirectory,
                                 const QString &fileName,
-                                const QString &gitBinDirectory,
-                                bool silent)
+                                const QString &gitBinDirectory)
 {
     QString binary = gitBinDirectory + QLatin1String("/gitk");
     QStringList arguments;
@@ -2934,12 +2952,7 @@ bool GitClient::tryLauchingGitK(const QProcessEnvironment &env,
     } else {
         success = QProcess::startDetached(binary, arguments, workingDirectory);
     }
-    if (!success) {
-        if (silent)
-            outwin->appendSilently(msgCannotLaunch(binary));
-        else
-            outwin->appendError(msgCannotLaunch(binary));
-    }
+
     return success;
 }
 
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 6d5593df4c4..5e8131925b1 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -410,8 +410,7 @@ private:
     bool tryLauchingGitK(const QProcessEnvironment &env,
                          const QString &workingDirectory,
                          const QString &fileName,
-                         const QString &gitBinDirectory,
-                         bool silent);
+                         const QString &gitBinDirectory);
     bool cleanList(const QString &workingDirectory, const QString &flag, QStringList *files, QString *errorMessage);
 
     mutable QString m_gitVersionForBinary;
-- 
GitLab