diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index 00ca2d60c991327895593fadbf4b34a1fa0e29d3..b31bf73c2f146d3327c37e970de5efa1c574586e 100644 --- a/src/plugins/git/commitdata.h +++ b/src/plugins/git/commitdata.h @@ -85,6 +85,7 @@ public: QStringList unstagedFileNames(const QString &stateFilter = QString()) const; QString amendSHA1; + QString commitEncoding; GitSubmitEditorPanelInfo panelInfo; GitSubmitEditorPanelData panelData; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index ed79897f55bcb11ee463bdc402d6b05a556af99a..2e164c796e849c570cdab7c8d3b0720d641366cd 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1632,6 +1632,7 @@ bool GitClient::getCommitData(const QString &workingDirectory, commitData->panelData.author = readConfigValue(workingDirectory, QLatin1String("user.name")); commitData->panelData.email = readConfigValue(workingDirectory, QLatin1String("user.email")); + commitData->commitEncoding = readConfigValue(workingDirectory, QLatin1String("i18n.commitEncoding")); // Get the commit template or the last commit message if (amend) { diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index a3cb2c231a899f6cc49b726904cb727f56bd3fcf..34a96db285669c92fad9ffe81e97a2e416b6f835 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -39,6 +39,7 @@ #include <QtCore/QDebug> #include <QtCore/QStringList> +#include <QtCore/QTextCodec> namespace Git { namespace Internal { @@ -83,6 +84,8 @@ void GitSubmitEditor::setCommitData(const CommitData &d) submitEditorWidget()->setPanelData(d.panelData); submitEditorWidget()->setPanelInfo(d.panelInfo); + m_commitEncoding = d.commitEncoding; + m_model = new VCSBase::SubmitFileModel(this); addStateFileListToModel(d.stagedFiles, true, StagedFile, m_model); addStateFileListToModel(d.unstagedFiles, false, UnstagedFile, m_model); @@ -128,5 +131,21 @@ GitSubmitEditorPanelData GitSubmitEditor::panelData() const return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData(); } +QByteArray GitSubmitEditor::fileContents() const +{ + const QString& text = const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->descriptionText(); + + if (!m_commitEncoding.isEmpty()) { + // Do the encoding convert, When use user-defined encoding + // e.g. git config --global i18n.commitencoding utf-8 + QTextCodec *codec = QTextCodec::codecForName(m_commitEncoding.toLocal8Bit()); + if (codec) + return codec->fromUnicode(text); + } + + // Using utf-8 as the default encoding + return text.toUtf8(); +} + } // namespace Internal } // namespace Git diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h index f00e5abb2408939520b570c370be109593682ce2..859c01c91623cb1d8d97cc7f09a04b14770887e9 100644 --- a/src/plugins/git/gitsubmiteditor.h +++ b/src/plugins/git/gitsubmiteditor.h @@ -60,6 +60,9 @@ public: signals: void diff(const QStringList &unstagedFiles, const QStringList &stagedFiles); +protected: + virtual QByteArray fileContents() const; + private slots: void slotDiffSelected(const QStringList &); @@ -67,6 +70,7 @@ private: inline GitSubmitEditorWidget *submitEditorWidget(); VCSBase::SubmitFileModel *m_model; + QString m_commitEncoding; }; } // namespace Internal diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp index 591de249e2267a402f9af9c5aa1860153576871b..ff960a8c8b0701d5db842a1acaeb61635d0af65e 100644 --- a/src/plugins/perforce/perforcesubmiteditor.cpp +++ b/src/plugins/perforce/perforcesubmiteditor.cpp @@ -58,7 +58,7 @@ PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget() return static_cast<PerforceSubmitEditorWidget *>(widget()); } -QString PerforceSubmitEditor::fileContents() const +QByteArray PerforceSubmitEditor::fileContents() const { const_cast<PerforceSubmitEditor*>(this)->updateEntries(); QString text; @@ -70,7 +70,7 @@ QString PerforceSubmitEditor::fileContents() const } if (Perforce::Constants::debug) qDebug() << Q_FUNC_INFO << text; - return text; + return text.toLocal8Bit(); } bool PerforceSubmitEditor::setFileContents(const QString &contents) diff --git a/src/plugins/perforce/perforcesubmiteditor.h b/src/plugins/perforce/perforcesubmiteditor.h index 16032cf1b3dbd12a11bea1dcd77ddb5d71c43e52..94a0db2e54819d861b381c03bd133ae4982e2510 100644 --- a/src/plugins/perforce/perforcesubmiteditor.h +++ b/src/plugins/perforce/perforcesubmiteditor.h @@ -69,7 +69,7 @@ public: static QString fileFromChangeLine(const QString &line); protected: - virtual QString fileContents() const; + virtual QByteArray fileContents() const; virtual bool setFileContents(const QString &contents); private: diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index abed23a106586ce365a1b26dbf965394efaf4726..6d60ed038e113ec5cc4abb6c9ec4730c067c9c85 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -456,7 +456,7 @@ bool VCSBaseSubmitEditor::save(QString *errorString, const QString &fileName, bo { const QString fName = fileName.isEmpty() ? d->m_file->fileName() : fileName; Utils::FileSaver saver(fName, QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text); - saver.write(fileContents().toLocal8Bit()); + saver.write(fileContents()); if (!saver.finalize(errorString)) return false; if (autoSave) @@ -467,9 +467,9 @@ bool VCSBaseSubmitEditor::save(QString *errorString, const QString &fileName, bo return true; } -QString VCSBaseSubmitEditor::fileContents() const +QByteArray VCSBaseSubmitEditor::fileContents() const { - return d->m_widget->descriptionText(); + return d->m_widget->descriptionText().toLocal8Bit(); } bool VCSBaseSubmitEditor::setFileContents(const QString &contents) @@ -616,7 +616,7 @@ bool VCSBaseSubmitEditor::runSubmitMessageCheckScript(const QString &checkScript tempFilePattern += QDir::separator(); tempFilePattern += QLatin1String("msgXXXXXX.txt"); Utils::TempFileSaver saver(tempFilePattern); - saver.write(fileContents().toUtf8()); + saver.write(fileContents()); if (!saver.finalize(errorMessage)) return false; // Run check process diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h index 693b63642902750fa479af2443c690f82bd7a82e..1fa3438d1de0cfc71dab67584674c97157be32ec 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.h +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h @@ -170,7 +170,7 @@ protected: /* These hooks allow for modifying the contents that goes to * the file. The default implementation uses the text * of the description editor. */ - virtual QString fileContents() const; + virtual QByteArray fileContents() const; virtual bool setFileContents(const QString &contents); private: