From 3a5b6825a7d5090eebcaa345ebbc718a4580e0cd Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 9 Apr 2009 10:05:53 +0200
Subject: [PATCH] Report termination of git pull/push (which was missing
 feedback).

---
 src/plugins/git/gitclient.cpp  |  8 +++++---
 src/plugins/git/gitclient.h    |  4 +++-
 src/plugins/git/gitcommand.cpp | 37 +++++++++++++++++++++++++++++++++-
 src/plugins/git/gitcommand.h   | 10 +++++++++
 4 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index d563b95d8fe..2b93589317c 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -503,11 +503,13 @@ GitCommand *GitClient::createCommand(const QString &workingDirectory,
 void GitClient::executeGit(const QString &workingDirectory,
                            const QStringList &arguments,
                            VCSBase::VCSBaseEditor* editor,
-                           bool outputToWindow)
+                           bool outputToWindow,
+                           GitCommand::TerminationReportMode tm)
 {
     m_plugin->outputWindow()->append(formatCommand(QLatin1String(Constants::GIT_BINARY), arguments));
     GitCommand *command = createCommand(workingDirectory, editor, outputToWindow);
     command->addJob(arguments, m_settings.timeout);
+    command->setTerminationReportMode(tm);
     command->execute();
 }
 
@@ -926,12 +928,12 @@ void GitClient::revert(const QStringList &files)
 
 void GitClient::pull(const QString &workingDirectory)
 {
-    executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true);
+    executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true, GitCommand::ReportStderr);
 }
 
 void GitClient::push(const QString &workingDirectory)
 {
-    executeGit(workingDirectory, QStringList(QLatin1String("push")), 0, true);
+    executeGit(workingDirectory, QStringList(QLatin1String("push")), 0, true, GitCommand::ReportStderr);
 }
 
 QString GitClient::msgNoChangedFiles()
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 046e08bc239..8807218da30 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -31,6 +31,7 @@
 #define GITCLIENT_H
 
 #include "gitsettings.h"
+#include "gitcommand.h"
 
 #include <coreplugin/iversioncontrol.h>
 #include <coreplugin/editormanager/ieditor.h>
@@ -159,7 +160,8 @@ private:
     void executeGit(const QString &workingDirectory,
                     const QStringList &arguments,
                     VCSBase::VCSBaseEditor* editor = 0,
-                    bool outputToWindow = false);
+                    bool outputToWindow = false,
+                    GitCommand::TerminationReportMode tm = GitCommand::NoReport);
 
     bool synchronousGit(const QString &workingDirectory,
                         const QStringList &arguments,
diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp
index 47d792d53af..1e93c81a3bf 100644
--- a/src/plugins/git/gitcommand.cpp
+++ b/src/plugins/git/gitcommand.cpp
@@ -38,6 +38,8 @@
 #include <QtCore/QProcess>
 #include <QtCore/QFuture>
 #include <QtCore/QtConcurrentRun>
+#include <QtCore/QFileInfo>
+#include <QtCore/QCoreApplication>
 
 namespace Git {
 namespace Internal {
@@ -51,6 +53,18 @@ static inline QStringList environmentToList(const ProjectExplorer::Environment &
     return ProjectExplorer::Environment::systemEnvironment().toStringList();
 }
 
+static QString msgTermination(int exitCode, const QString &binaryPath, const QStringList &args)
+{
+    QString cmd = QFileInfo(binaryPath).baseName();
+    if (!args.empty()) {
+        cmd += QLatin1Char(' ');
+        cmd += args.front();
+    }
+    return exitCode ?
+            QCoreApplication::translate("GitCommand", "\n'%1' failed (exit code %2).\n").arg(cmd).arg(exitCode) :
+            QCoreApplication::translate("GitCommand", "\n'%1' completed (exit code %2).\n").arg(cmd).arg(exitCode);
+}
+
 GitCommand::Job::Job(const QStringList &a, int t) :
     arguments(a),
     timeout(t)
@@ -62,8 +76,19 @@ GitCommand::GitCommand(const QString &binaryPath,
                         ProjectExplorer::Environment &environment)  :
     m_binaryPath(binaryPath),
     m_workingDirectory(workingDirectory),
-    m_environment(environmentToList(environment))
+    m_environment(environmentToList(environment)),
+    m_reportTerminationMode(NoReport)
+{
+}
+
+GitCommand::TerminationReportMode GitCommand::reportTerminationMode() const
 {
+    return m_reportTerminationMode;
+}
+
+void GitCommand::setTerminationReportMode(TerminationReportMode m)
+{
+    m_reportTerminationMode = m;
 }
 
 void GitCommand::addJob(const QStringList &arguments, int timeout)
@@ -116,6 +141,16 @@ void GitCommand::run()
 
         output += process.readAllStandardOutput();
         error += QString::fromLocal8Bit(process.readAllStandardError());
+        switch (m_reportTerminationMode) {
+        case NoReport:            
+            break;
+        case ReportStdout:
+            output += msgTermination(process.exitCode(), m_binaryPath, m_jobs.at(j).arguments).toUtf8();
+            break;
+        case ReportStderr:
+            error += msgTermination(process.exitCode(), m_binaryPath, m_jobs.at(j).arguments);
+            break;
+        }
     }
 
     // Special hack: Always produce output for diff
diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h
index f4bdb34768a..e42ab098bd5 100644
--- a/src/plugins/git/gitcommand.h
+++ b/src/plugins/git/gitcommand.h
@@ -42,6 +42,11 @@ class GitCommand : public QObject
     Q_DISABLE_COPY(GitCommand)
     Q_OBJECT
 public:
+    // Where to report command termination with exit code if desired
+    enum TerminationReportMode { NoReport,
+                                 ReportStdout,  // This assumes UTF8
+                                 ReportStderr };
+
     explicit GitCommand(const QString &binaryPath,
                         const QString &workingDirectory,
                         ProjectExplorer::Environment &environment);
@@ -54,6 +59,10 @@ public:
     // Workaround until all relevant commands support "--no-color".
     static void removeColorCodes(QByteArray *data);
 
+    // Report command termination with exit code
+    TerminationReportMode reportTerminationMode() const;
+    void setTerminationReportMode(TerminationReportMode m);
+
 private:
     void run();
 
@@ -74,6 +83,7 @@ private:
     const QStringList m_environment;
 
     QList<Job> m_jobs;
+    TerminationReportMode m_reportTerminationMode;
 };
 
 } // namespace Internal
-- 
GitLab