From c49fe8350d38e66067b62c10e7626d05919fdba2 Mon Sep 17 00:00:00 2001
From: Petar Perisin <petar.perisin@gmail.com>
Date: Mon, 8 Apr 2013 13:02:25 +0300
Subject: [PATCH] Git: Add a function for getting current local branch

Change-Id: Ibda70cb896633cc7afa3a845b99aac523246c558
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/git/gerrit/gerritplugin.cpp | 10 +------
 src/plugins/git/gitclient.cpp           | 38 ++++++++++++-------------
 src/plugins/git/gitclient.h             |  5 +++-
 src/plugins/git/gitplugin.cpp           | 11 ++++---
 4 files changed, 29 insertions(+), 35 deletions(-)

diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp
index a86da546c95..556af275ec4 100644
--- a/src/plugins/git/gerrit/gerritplugin.cpp
+++ b/src/plugins/git/gerrit/gerritplugin.cpp
@@ -432,15 +432,7 @@ QString GerritPlugin::gitBinary()
 QString GerritPlugin::branch(const QString &repository)
 {
     Git::Internal::GitClient *client = Git::Internal::GitPlugin::instance()->gitClient();
-    QString errorMessage;
-    QString output;
-    if (client->synchronousBranchCmd(repository, QStringList(), &output, &errorMessage)) {
-        output.remove(QLatin1Char('\r'));
-        foreach (const QString &line, output.split(QLatin1Char('\n')))
-            if (line.startsWith(QLatin1String("* ")))
-                return line.right(line.size() - 2);
-    }
-    return QString();
+    return client->synchronousCurrentLocalBranch(repository);
 }
 
 void GerritPlugin::fetchDisplay(const QSharedPointer<Gerrit::Internal::GerritChange> &change)
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 1d2020e3932..2db128d4168 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1190,6 +1190,22 @@ QString GitClient::synchronousShortDescription(const QString &workingDirectory,
     return output;
 }
 
+QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory)
+{
+    QByteArray outputTextData;
+    QStringList arguments;
+    arguments << QLatin1String("symbolic-ref") << QLatin1String("HEAD");
+    if (fullySynchronousGit(workingDirectory, arguments, &outputTextData, 0, false)) {
+        QString branch = commandOutputFromLocal8Bit(outputTextData.trimmed());
+        const QString refsHeadsPrefix = QLatin1String("refs/heads/");
+        if (branch.startsWith(refsHeadsPrefix)) {
+            branch.remove(0, refsHeadsPrefix.count());
+            return branch;
+        }
+    }
+    return QString();
+}
+
 static inline QString msgCannotDetermineBranch(const QString &workingDirectory, const QString &why)
 {
     return GitClient::tr("Cannot retrieve branch of \"%1\": %2").arg(QDir::toNativeSeparators(workingDirectory), why);
@@ -1250,22 +1266,10 @@ QString GitClient::synchronousTopic(const QString &workingDirectory)
     if (lastModified == data.timeStamp)
         return data.topic;
     data.timeStamp = lastModified;
-    QByteArray outputTextData;
-    QStringList arguments;
-    arguments << QLatin1String("symbolic-ref") << QLatin1String("HEAD");
     // First try to find branch
-    if (fullySynchronousGit(workingDirectory, arguments, &outputTextData, 0, false)) {
-        QString branch = commandOutputFromLocal8Bit(outputTextData.trimmed());
-
-        // Must strip the "refs/heads/" prefix manually since the --short switch
-        // of git symbolic-ref only got introduced with git 1.7.10, which is not
-        // available for all popular Linux distributions yet.
-        const QString refsHeadsPrefix = QLatin1String("refs/heads/");
-        if (branch.startsWith(refsHeadsPrefix))
-            branch.remove(0, refsHeadsPrefix.count());
-
+    QString branch = synchronousCurrentLocalBranch(workingDirectory);
+    if (!branch.isEmpty())
         return data.topic = branch;
-    }
 
     // Detached HEAD, try a tag or remote branch
     QStringList references;
@@ -1939,10 +1943,8 @@ void GitClient::continuePreviousGitCommand(const QString &workingDirectory,
 // Quietly retrieve branch list of remote repository URL
 //
 // The branch HEAD is pointing to is always returned first.
-QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryURL, bool *isDetached)
+QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryURL)
 {
-    if (isDetached)
-        *isDetached = true;
     QStringList arguments(QLatin1String("ls-remote"));
     arguments << repositoryURL << QLatin1String("HEAD") << QLatin1String("refs/heads/*");
     const unsigned flags =
@@ -1969,8 +1971,6 @@ QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryUR
             if (!headFound && line.startsWith(headSha)) {
                 branches[0] = branchName;
                 headFound = true;
-                if (isDetached)
-                    *isDetached = false;
             } else {
                 branches.push_back(branchName);
             }
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 04292fca76b..cd0df0a60c2 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -201,6 +201,9 @@ public:
     QString synchronousShortDescription(const QString &workingDirectory, const QString &revision);
     QString synchronousShortDescription(const QString &workingDirectory, const QString &revision,
                                      const QString &format);
+
+    QString synchronousCurrentLocalBranch(const QString &workingDirectory);
+
     bool synchronousHeadRefs(const QString &workingDirectory, QStringList *output,
                              QString *errorMessage = 0);
     QString synchronousTopic(const QString &workingDirectory);
@@ -273,7 +276,7 @@ public:
 
     void launchRepositoryBrowser(const QString &workingDirectory);
 
-    QStringList synchronousRepositoryBranches(const QString &repositoryURL, bool *isDetached = 0);
+    QStringList synchronousRepositoryBranches(const QString &repositoryURL);
 
     GitSettings *settings() const;
 
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 22498c69d0c..57967439018 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -1001,12 +1001,11 @@ void GitPlugin::pull()
     bool rebase = m_gitClient->settings()->boolValue(GitSettings::pullRebaseKey);
 
     if (!rebase) {
-        bool isDetached;
-        QString branchRebaseConfig = m_gitClient->synchronousRepositoryBranches(topLevel, &isDetached).at(0);
-        if (!isDetached) {
-            branchRebaseConfig.prepend(QLatin1String("branch."));
-            branchRebaseConfig.append(QLatin1String(".rebase"));
-            rebase = (m_gitClient->readConfigValue(topLevel, branchRebaseConfig) == QLatin1String("true"));
+        QString currentBranch = m_gitClient->synchronousCurrentLocalBranch(topLevel);
+        if (!currentBranch.isEmpty()) {
+            currentBranch.prepend(QLatin1String("branch."));
+            currentBranch.append(QLatin1String(".rebase"));
+            rebase = (m_gitClient->readConfigValue(topLevel, currentBranch) == QLatin1String("true"));
         }
     }
 
-- 
GitLab