From: Yuchen Deng Date: Fri, 21 Oct 2011 09:30:56 +0000 (+0000) Subject: Git: Support encoding convert of commit messages X-Git-Url: http://git.osdn.net/view?p=qt-creator-jp%2Fqt-creator-jp.git;a=commitdiff_plain;h=08f97b50d71a2b16b76659b82062a3d438195990 Git: Support encoding convert of commit messages We need read i18n.commitEncoding value, to write correct encoding of the commit file. In Windows OS, the default encoding is GBK, So we need convert to correct encoding of the commit messages. Change-Id: Id5f35745dba15da2c9ceb1266e0ea537cba7da73 Merge-request: 382 Reviewed-by: Tobias Hunger --- diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index 00ca2d60c9..b31bf73c2f 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 ed79897f55..2e164c796e 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 a3cb2c231a..34a96db285 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -39,6 +39,7 @@ #include #include +#include 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(this)->submitEditorWidget()->panelData(); } +QByteArray GitSubmitEditor::fileContents() const +{ + const QString& text = const_cast(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 f00e5abb24..859c01c916 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 591de249e2..ff960a8c8b 100644 --- a/src/plugins/perforce/perforcesubmiteditor.cpp +++ b/src/plugins/perforce/perforcesubmiteditor.cpp @@ -58,7 +58,7 @@ PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget() return static_cast(widget()); } -QString PerforceSubmitEditor::fileContents() const +QByteArray PerforceSubmitEditor::fileContents() const { const_cast(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 16032cf1b3..94a0db2e54 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 abed23a106..6d60ed038e 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 693b636429..1fa3438d1d 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: