From d6da30d77aadf53366a28b6cb10c554762a24766 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 30 Jun 2015 20:14:36 -0700 Subject: [PATCH] Fix the getting of the Git author name when user.name isn't set The config variable is not required, as Git will get the user's name from other system settings, like the gecos field in /etc/passwd. So adapt Qt Creator to use the same mechanism that Git does. Change-Id: I255870833a024a36adf6ffff13ecb43cc0c45bbf Reviewed-by: Orgad Shaneh Reviewed-by: Tobias Hunger --- src/plugins/git/gitclient.cpp | 31 +++++++++++++++++++++++++++---- src/plugins/git/gitclient.h | 3 +++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 2730fa108ad..4eb97fa4ff4 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -2484,8 +2484,19 @@ bool GitClient::getCommitData(const QString &workingDirectory, commitData.amendSHA1.clear(); } if (!authorFromCherryPick) { - commitData.panelData.author = readConfigValue(workingDirectory, QLatin1String("user.name")); - commitData.panelData.email = readConfigValue(workingDirectory, QLatin1String("user.email")); + // the format is: + // Joe Developer unixtimestamp +HHMM + QString author_info = readGitVar(workingDirectory, QLatin1String("GIT_AUTHOR_IDENT")); + int lt = author_info.lastIndexOf(QLatin1Char('<')); + int gt = author_info.lastIndexOf(QLatin1Char('>')); + if (gt == -1 || uint(lt) > uint(gt)) { + // shouldn't happen! + commitData.panelData.author.clear(); + commitData.panelData.email.clear(); + } else { + commitData.panelData.author = author_info.left(lt - 1); + commitData.panelData.email = author_info.mid(lt + 1, gt - lt - 1); + } } // Commit: Get the commit template QString templateFilename = gitDirectory.absoluteFilePath(QLatin1String("MERGE_MSG")); @@ -3083,14 +3094,26 @@ bool GitClient::synchronousStashList(const QString &workingDirectory, // Read a single-line config value, return trimmed QString GitClient::readConfigValue(const QString &workingDirectory, const QString &configVar) const +{ + QStringList arguments; + arguments << QLatin1String("config") << configVar; + return readOneLine(workingDirectory, arguments); +} + +QString GitClient::readGitVar(const QString &workingDirectory, const QString &configVar) const +{ + QStringList arguments; + arguments << QLatin1String("var") << configVar; + return readOneLine(workingDirectory, arguments); +} + +QString GitClient::readOneLine(const QString &workingDirectory, const QStringList &arguments) const { // msysGit always uses UTF-8 for configuration: // https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files static QTextCodec *codec = HostOsInfo::isWindowsHost() ? QTextCodec::codecForName("UTF-8") : QTextCodec::codecForLocale(); - QStringList arguments; - arguments << QLatin1String("config") << configVar; QByteArray outputText; if (!vcsFullySynchronousExec(workingDirectory, arguments, &outputText, 0, silentFlags)) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 80b237aa899..d226c686d54 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -293,6 +293,7 @@ public: const QString &messge, QString *name, QString *errorMessage = 0) const; + QString readGitVar(const QString &workingDirectory, const QString &configVar) const; QString readConfigValue(const QString &workingDirectory, const QString &configVar) const; QTextCodec *encoding(const QString &workingDirectory, const QByteArray &configVar) const; @@ -370,6 +371,8 @@ private: // determine version as '(major << 16) + (minor << 8) + patch' or 0. unsigned synchronousGitVersion(QString *errorMessage = 0) const; + QString readOneLine(const QString &workingDirectory, const QStringList &arguments) const; + enum RevertResult { RevertOk, RevertUnchanged, RevertCanceled, RevertFailed }; RevertResult revertI(QStringList files, bool *isDirectory,