Git: Fix author encoding on amend commit on Windows...

... when i18n.commitEncoding is not UTF-8 and the author has non-ASCII
characters.

Change-Id: Ieec0a78f4d31b18f9ebda9c4a1fce4a0d5ecbb9b
Reviewed-by: Peter Kümmel <syntheticpp@gmx.net>
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Orgad Shaneh
2014-04-22 09:22:47 +03:00
committed by Orgad Shaneh
parent 575259c3c1
commit 954245c645

View File

@@ -3011,6 +3011,15 @@ QTextCodec *GitClient::encoding(const QString &workingDirectory, const QByteArra
return QTextCodec::codecForName(codecName); return QTextCodec::codecForName(codecName);
} }
// returns first line from log and removes it
static QByteArray shiftLogLine(QByteArray &logText)
{
const int index = logText.indexOf('\n');
const QByteArray res = logText.left(index);
logText.remove(0, index + 1);
return res;
}
bool GitClient::getCommitData(const QString &workingDirectory, bool GitClient::getCommitData(const QString &workingDirectory,
QString *commitTemplate, QString *commitTemplate,
CommitData &commitData, CommitData &commitData,
@@ -3097,19 +3106,20 @@ bool GitClient::getCommitData(const QString &workingDirectory,
case AmendCommit: { case AmendCommit: {
// Amend: get last commit data as "SHA1<tab>author<tab>email<tab>message". // Amend: get last commit data as "SHA1<tab>author<tab>email<tab>message".
QStringList args(QLatin1String("log")); QStringList args(QLatin1String("log"));
args << QLatin1String("--max-count=1") << QLatin1String("--pretty=format:%h\t%an\t%ae\t%B"); args << QLatin1String("--max-count=1") << QLatin1String("--pretty=format:%h\n%an\n%ae\n%B");
const Utils::SynchronousProcessResponse sp = synchronousGit(repoDirectory, args, 0, QByteArray outputText;
commitData.commitEncoding); if (!fullySynchronousGit(repoDirectory, args, &outputText, 0,
if (sp.result != Utils::SynchronousProcessResponse::Finished) { VcsBasePlugin::SuppressCommandLogging)) {
*errorMessage = tr("Cannot retrieve last commit data of repository \"%1\".").arg(repoDirectory); *errorMessage = tr("Cannot retrieve last commit data of repository \"%1\".").arg(repoDirectory);
return false; return false;
} }
QStringList values = sp.stdOut.split(QLatin1Char('\t')); QTextCodec *authorCodec = Utils::HostOsInfo::isWindowsHost()
QTC_ASSERT(values.size() >= 4, return false); ? QTextCodec::codecForName("UTF-8")
commitData.amendSHA1 = values.takeFirst(); : commitData.commitEncoding;
commitData.panelData.author = values.takeFirst(); commitData.amendSHA1 = QString::fromLatin1(shiftLogLine(outputText));
commitData.panelData.email = values.takeFirst(); commitData.panelData.author = authorCodec->toUnicode(shiftLogLine(outputText));
*commitTemplate = values.join(QLatin1String("\t")); commitData.panelData.email = authorCodec->toUnicode(shiftLogLine(outputText));
*commitTemplate = commitData.commitEncoding->toUnicode(outputText);
break; break;
} }
case SimpleCommit: { case SimpleCommit: {