From 0865e9eb277c3cb743bc944f62f0ea188103ae52 Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Mon, 26 Aug 2013 21:57:38 +0300
Subject: [PATCH] Git: List branches on show
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: Ie69a58efc7068c699abf0e3d396216d9809346f4
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
---
 src/plugins/git/gitclient.cpp | 24 ++++++++++++++++++++----
 src/plugins/git/gitclient.h   |  2 ++
 src/plugins/git/giteditor.cpp | 16 +++++++++++++++-
 3 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index b1fc13a214f..dcd85653d80 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1800,6 +1800,22 @@ void GitClient::synchronousTagsForCommit(const QString &workingDirectory, const
     }
 }
 
+QStringList GitClient::synchronousBranchesForCommit(const QString &workingDirectory, const QString &revision)
+{
+    QString output;
+    QStringList arguments;
+    arguments << QLatin1String(noColorOption) << QLatin1String("-a")
+              << QLatin1String("--contains") << revision;
+    synchronousBranchCmd(workingDirectory, arguments, &output, 0);
+    QStringList res;
+    foreach (const QString &branch, output.split(QLatin1Char('\n'))) {
+        const QString b = branch.mid(2).trimmed();
+        if (!b.isEmpty())
+            res << b;
+    }
+    return res;
+}
+
 bool GitClient::isRemoteCommit(const QString &workingDirectory, const QString &commit)
 {
     QStringList arguments;
@@ -1958,11 +1974,11 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, branchArgs, &outputText, &errorText);
     *output = commandOutputFromLocal8Bit(outputText);
-    if (!rc) {
-        *errorMessage = msgCannotRun(QLatin1String("git branch"), workingDirectory, commandOutputFromLocal8Bit(errorText));
-        return false;
+    if (!rc && errorMessage) {
+        *errorMessage = msgCannotRun(QLatin1String("git branch"), workingDirectory,
+                                     commandOutputFromLocal8Bit(errorText));
     }
-    return true;
+    return rc;
 }
 
 bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, QString *output, QString *errorMessage)
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index aca978f7833..6df7e3b0df3 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -236,6 +236,8 @@ public:
     QString synchronousTopRevision(const QString &workingDirectory, QString *errorMessage = 0);
     void synchronousTagsForCommit(const QString &workingDirectory, const QString &revision,
                                   QString &precedes, QString &follows);
+    QStringList synchronousBranchesForCommit(const QString &workingDirectory,
+                                             const QString &revision);
     bool isRemoteCommit(const QString &workingDirectory, const QString &commit);
 
     bool cloneRepository(const QString &directory, const QByteArray &url);
diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp
index 2baf17ddefd..392ace9e719 100644
--- a/src/plugins/git/giteditor.cpp
+++ b/src/plugins/git/giteditor.cpp
@@ -190,11 +190,25 @@ void GitEditor::setPlainTextFiltered(const QString &text)
         QString precedes, follows;
         if (modText.startsWith(QLatin1String("commit "))) { // show
             int lastHeaderLine = modText.indexOf(QLatin1String("\n\n")) + 1;
-            plugin->gitClient()->synchronousTagsForCommit(workingDirectory, modText.mid(7, 8), precedes, follows);
+            const QString commit = modText.mid(7, 8);
+            plugin->gitClient()->synchronousTagsForCommit(workingDirectory, commit, precedes, follows);
             if (!precedes.isEmpty())
                 modText.insert(lastHeaderLine, QLatin1String("Precedes: ") + precedes + QLatin1Char('\n'));
             if (!follows.isEmpty())
                 modText.insert(lastHeaderLine, QLatin1String("Follows: ") + follows + QLatin1Char('\n'));
+            QString moreBranches;
+            QStringList branches = plugin->gitClient()->synchronousBranchesForCommit(
+                        workingDirectory, commit);
+            const int branchCount = branches.count();
+            // If there are more than 20 branches, list first 10 followed by a hint
+            if (branchCount > 20) {
+                const int leave = 10;
+                moreBranches = tr(" and %1 more").arg(branchCount - leave);
+                branches.erase(branches.begin() + leave, branches.end());
+            }
+            modText.insert(lastHeaderLine, QLatin1String("Branches: ")
+                           + branches.join(QLatin1String(", ")) + moreBranches
+                           + QLatin1Char('\n'));
         }
         break;
     }
-- 
GitLab