From 7bfaf7a946b9e1e512463c3a93c65bb396e40c2c Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Wed, 22 May 2013 21:31:46 +0300
Subject: [PATCH] Git: Provide a commit editor for files opened externally

Change-Id: I52fccf36cca032dda36102d4be2654eb7461de64
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/git/Git.mimetypes.xml   |  9 +++++++++
 src/plugins/git/git.pro             |  2 ++
 src/plugins/git/git.qbs             |  1 +
 src/plugins/git/git.qrc             |  1 +
 src/plugins/git/gitconstants.h      |  4 ++++
 src/plugins/git/giteditor.cpp       | 10 ++++++++++
 src/plugins/git/giteditor.h         |  1 +
 src/plugins/git/gitplugin.cpp       | 13 +++++++++++--
 src/plugins/vcsbase/vcsbaseeditor.h |  2 +-
 9 files changed, 40 insertions(+), 3 deletions(-)
 create mode 100644 src/plugins/git/Git.mimetypes.xml

diff --git a/src/plugins/git/Git.mimetypes.xml b/src/plugins/git/Git.mimetypes.xml
new file mode 100644
index 00000000000..c40c30181a9
--- /dev/null
+++ b/src/plugins/git/Git.mimetypes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+    <mime-type type="text/vnd.qtcreator.git.commit">
+        <sub-class-of type="text/plain"/>
+        <comment>Git Commit File</comment>
+        <glob pattern="COMMIT_MSG"/>
+        <glob pattern="COMMIT_EDITMSG"/>
+    </mime-type>
+</mime-info>
diff --git a/src/plugins/git/git.pro b/src/plugins/git/git.pro
index 06634276437..0366c953e11 100644
--- a/src/plugins/git/git.pro
+++ b/src/plugins/git/git.pro
@@ -62,4 +62,6 @@ include(gitorious/gitorious.pri)
 RESOURCES += \
     git.qrc
 
+OTHER_FILES += Git.mimetypes.xml
+
 include(gerrit/gerrit.pri)
diff --git a/src/plugins/git/git.qbs b/src/plugins/git/git.qbs
index 80acf97b6ed..2f8110f8f28 100644
--- a/src/plugins/git/git.qbs
+++ b/src/plugins/git/git.qbs
@@ -14,6 +14,7 @@ QtcPlugin {
     Depends { name: "Locator" }
 
     files: [
+        "Git.mimetypes.xml",
         "annotationhighlighter.cpp",
         "annotationhighlighter.h",
         "branchadddialog.cpp",
diff --git a/src/plugins/git/git.qrc b/src/plugins/git/git.qrc
index ae2b2b64707..3371b45cd8f 100644
--- a/src/plugins/git/git.qrc
+++ b/src/plugins/git/git.qrc
@@ -2,5 +2,6 @@
     <qresource prefix="/git">
         <file>images/git.png</file>
         <file>images/gitorious.png</file>
+        <file>Git.mimetypes.xml</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/git/gitconstants.h b/src/plugins/git/gitconstants.h
index 872bf3022ce..35cf9619562 100644
--- a/src/plugins/git/gitconstants.h
+++ b/src/plugins/git/gitconstants.h
@@ -47,6 +47,9 @@ const char C_GIT_BLAME_EDITOR[] = "Git Annotation Editor";
 const char GIT_DIFF_EDITOR_ID[] = "Git Diff Editor";
 const char GIT_DIFF_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "Git Diff Editor");
 const char C_GIT_DIFF_EDITOR[] = "Git Diff Editor";
+const char GIT_COMMIT_TEXT_EDITOR_ID[] = "Git Commit Editor";
+const char GIT_COMMIT_TEXT_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "Git Commit Editor");
+const char C_GIT_COMMIT_TEXT_EDITOR[] = "Git Commit Editor";
 
 const char C_GITSUBMITEDITOR[]  = "Git Submit Editor";
 const char GITSUBMITEDITOR_ID[] = "Git Submit Editor";
@@ -54,6 +57,7 @@ const char GITSUBMITEDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "Git Submit
 const char SUBMIT_CURRENT[] = "Git.SubmitCurrentLog";
 const char DIFF_SELECTED[] = "Git.DiffSelectedFilesInLog";
 const char SUBMIT_MIMETYPE[] = "text/vnd.qtcreator.git.submit";
+const char C_GITEDITORID[]  = "Git Editor";
 
 } // namespace Constants
 } // namespace Git
diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp
index fb6bea95f9a..2c6062799bf 100644
--- a/src/plugins/git/giteditor.cpp
+++ b/src/plugins/git/giteditor.cpp
@@ -33,9 +33,12 @@
 #include "gitplugin.h"
 #include "gitclient.h"
 #include "gitsettings.h"
+#include "gitsubmiteditorwidget.h"
+#include "gitconstants.h"
 
 #include <utils/qtcassert.h>
 #include <vcsbase/vcsbaseoutputwindow.h>
+#include <texteditor/basetextdocument.h>
 #include <QDebug>
 #include <QFileInfo>
 #include <QRegExp>
@@ -225,6 +228,13 @@ void GitEditor::revertChange()
     GitPlugin::instance()->gitClient()->synchronousRevert(workingDirectory, m_currentChange);
 }
 
+void GitEditor::init()
+{
+    VcsBase::VcsBaseEditorWidget::init();
+    if (editor()->id() == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID)
+        new GitSubmitHighlighter(baseTextDocument().data());
+}
+
 QString GitEditor::decorateVersion(const QString &revision) const
 {
     const QFileInfo fi(source());
diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h
index 6af13790506..5010fd81937 100644
--- a/src/plugins/git/giteditor.h
+++ b/src/plugins/git/giteditor.h
@@ -59,6 +59,7 @@ private slots:
     void revertChange();
 
 private:
+    void init();
     QSet<QString> annotationChanges() const;
     QString changeUnderCursor(const QTextCursor &) const;
     VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes, const QColor &bg) const;
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 610a060a7b5..ea8ca19f4cb 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -58,6 +58,7 @@
 #include <coreplugin/infobar.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/editormanager/ieditor.h>
+#include <coreplugin/mimedatabase.h>
 
 #include <utils/qtcassert.h>
 #include <utils/parameteraction.h>
@@ -81,6 +82,7 @@
 #include <QScopedPointer>
 
 static const unsigned minimumRequiredVersion = 0x010702;
+static const char RC_GIT_MIME_XML[] = ":/git/Git.mimetypes.xml";
 
 static const VcsBase::VcsBaseEditorParameters editorParameters[] = {
 {
@@ -103,7 +105,12 @@ static const VcsBase::VcsBaseEditorParameters editorParameters[] = {
     Git::Constants::GIT_DIFF_EDITOR_ID,
     Git::Constants::GIT_DIFF_EDITOR_DISPLAY_NAME,
     Git::Constants::C_GIT_DIFF_EDITOR,
-    "text/x-patch"}
+    "text/x-patch"},
+{   VcsBase::DiffOutput,
+    Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID,
+    Git::Constants::GIT_COMMIT_TEXT_EDITOR_DISPLAY_NAME,
+    Git::Constants::C_GIT_COMMIT_TEXT_EDITOR,
+    "text/vnd.qtcreator.git.commit"},
 };
 
 // Utility to find a parameter set by type
@@ -263,7 +270,6 @@ ActionCommandPair
 bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
 {
     Q_UNUSED(arguments)
-    Q_UNUSED(errorMessage)
 
     m_settings.readSettings(Core::ICore::settings());
 
@@ -656,6 +662,9 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
     command = Core::ActionManager::registerAction(m_redoAction, Core::Constants::REDO, submitContext);
 
 
+    if (!Core::ICore::mimeDatabase()->addMimeTypes(QLatin1String(RC_GIT_MIME_XML), errorMessage))
+        return false;
+
     /* "Gerrit" */
     m_gerritPlugin = new Gerrit::Internal::GerritPlugin(this);
     const bool ok = m_gerritPlugin->initialize(remoteRepositoryMenu);
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index 5228d16846c..955c194d901 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -105,7 +105,7 @@ protected:
     void setLogEntryPattern(const QRegExp &pattern);
 
 public:
-    void init();
+    virtual void init();
 
     ~VcsBaseEditorWidget();
 
-- 
GitLab