From abaf2e9f210c778e79a77d50e37e9b11196b70fd Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 19 Aug 2010 16:26:47 +0200
Subject: [PATCH] VCS[hg]: Mercurial forgets working directory from commit #2
 on.

Do not clear variable containing submit repository. Fix potential
crash (closing diff editor before command termination),
use proper temp file name. Pass --non-interactive to "commit"
to suppress editors being launched (despite -l).

Reviewed-by: Marco Bubke <marco.bubke@nokia.com>
Task-number: QTCREATORBUG-1503
---
 src/plugins/mercurial/mercurialclient.cpp    |  5 ++++-
 src/plugins/mercurial/mercurialjobrunner.cpp |  7 ++++++-
 src/plugins/mercurial/mercurialjobrunner.h   | 11 ++++++-----
 src/plugins/mercurial/mercurialplugin.cpp    |  8 ++++++--
 4 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 3db6b7a7f85..51c92d6a2b5 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -61,6 +61,8 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
     return 0;
 }
 
+static const char nonInteractiveOptionC[] = "--noninteractive";
+
 namespace Mercurial {
 namespace Internal  {
 
@@ -533,7 +535,8 @@ void MercurialClient::commit(const QString &repositoryRoot, const QStringList &f
     // refuse to do "autoadd" on a commit with working directory only, as this will
     // add all the untracked stuff.
     QTC_ASSERT(!(autoAddRemove && files.isEmpty()), return)
-    QStringList args(QLatin1String("commit"));
+    QStringList args = QStringList(QLatin1String(nonInteractiveOptionC));
+    args.append(QLatin1String("commit"));
     if (!committerInfo.isEmpty())
         args << QLatin1String("-u") << committerInfo;
     args << QLatin1String("-l") << commitMessageFile;
diff --git a/src/plugins/mercurial/mercurialjobrunner.cpp b/src/plugins/mercurial/mercurialjobrunner.cpp
index 185856a16db..5651868282c 100644
--- a/src/plugins/mercurial/mercurialjobrunner.cpp
+++ b/src/plugins/mercurial/mercurialjobrunner.cpp
@@ -69,6 +69,11 @@ HgTask::HgTask(const QString &repositoryRoot,
 {
 }
 
+VCSBase::VCSBaseEditor* HgTask::displayEditor() const
+{
+    return editor;
+}
+
 void HgTask::emitSucceeded()
 {
     emit succeeded(m_cookie);
@@ -221,7 +226,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
           */
         if (stdOutput.isEmpty())
             stdOutput = stdErr;
-        emit output(stdOutput);
+        emit output(stdOutput); // This will clear the diff "Working..." text.
         taskData->emitSucceeded();
     } else {
         emit error(QString::fromLocal8Bit(stdErr));
diff --git a/src/plugins/mercurial/mercurialjobrunner.h b/src/plugins/mercurial/mercurialjobrunner.h
index ef9c7856c8f..77f332b9197 100644
--- a/src/plugins/mercurial/mercurialjobrunner.h
+++ b/src/plugins/mercurial/mercurialjobrunner.h
@@ -38,6 +38,7 @@
 #include <QtCore/QSharedPointer>
 #include <QtCore/QVariant>
 #include <QtCore/QString>
+#include <QtCore/QPointer>
 
 QT_BEGIN_NAMESPACE
 class QProcess;
@@ -64,10 +65,10 @@ public:
                     VCSBase::VCSBaseEditor *editor,
                     const QVariant &cookie = QVariant());
 
-    bool shouldEmit() { return emitRaw; }
-    VCSBase::VCSBaseEditor* displayEditor() { return editor; }
-    QStringList args() { return arguments; }
-    QString repositoryRoot() { return m_repositoryRoot; }
+    bool shouldEmit() const { return emitRaw; }
+    VCSBase::VCSBaseEditor* displayEditor() const;
+    QStringList args() const { return arguments; }
+    QString repositoryRoot() const { return m_repositoryRoot; }
 
 signals:
     void succeeded(const QVariant &cookie); // Use a queued connection
@@ -81,7 +82,7 @@ private:
     const QStringList arguments;
     const bool emitRaw;
     const QVariant m_cookie;
-    VCSBase::VCSBaseEditor *editor;
+    QPointer<VCSBase::VCSBaseEditor> editor; // User might close it.
 };
 
 /* A job queue running in a separate thread, executing commands
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 958e5ae058d..5a39e950710 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -581,7 +581,12 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st
 
     deleteCommitLog();
 
-    changeLog = new QTemporaryFile(this);
+    // Open commit log
+    QString changeLogPattern = QDir::tempPath();
+    if (!changeLogPattern.endsWith(QLatin1Char('/')))
+        changeLogPattern += QLatin1Char('/');
+    changeLogPattern += QLatin1String("qtcreator-hg-XXXXXX.msg");
+    changeLog = new QTemporaryFile(changeLogPattern,  this);
     if (!changeLog->open()) {
         outputWindow->appendError(tr("Unable to generate a temporary file for the commit editor."));
         return;
@@ -673,7 +678,6 @@ void MercurialPlugin::deleteCommitLog()
     if (changeLog) {
         delete changeLog;
         changeLog = 0;
-        m_submitRepository.clear();
     }
 }
 
-- 
GitLab