public GitRevision GetRevision(string commit, bool shortFormat = false)
{
const string formatString =
/* Hash */ "%H%n" +
/* Tree */ "%T%n" +
/* Parents */ "%P%n" +
/* Author Name */ "%aN%n" +
/* Author EMail */ "%aE%n" +
/* Author Date */ "%at%n" +
/* Committer Name */ "%cN%n" +
/* Committer EMail*/ "%cE%n" +
/* Committer Date */ "%ct%n";
const string messageFormat = "%e%n%B%nNotes:%n%-N";
string cmd = "log -n1 --format=format:" + formatString + (shortFormat ? "%e%n%s" : messageFormat) + " " + commit;
var revInfo = RunCacheableCmd(AppSettings.GitCommand, cmd, LosslessEncoding);
string[] lines = revInfo.Split('\n');
var revision = new GitRevision(this, lines[0])
{
TreeGuid = lines[1],
ParentGuids = lines[2].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries),
Author = ReEncodeStringFromLossless(lines[3]),
AuthorEmail = ReEncodeStringFromLossless(lines[4]),
Committer = ReEncodeStringFromLossless(lines[6]),
CommitterEmail = ReEncodeStringFromLossless(lines[7])
};
revision.AuthorDate = DateTimeUtils.ParseUnixTime(lines[5]);
revision.CommitDate = DateTimeUtils.ParseUnixTime(lines[8]);
revision.MessageEncoding = lines[9];
if (shortFormat)
{
revision.Subject = ReEncodeCommitMessage(lines[10], revision.MessageEncoding);
}
else
{
string message = ProccessDiffNotes(10, lines);
//commit message is not reencoded by git when format is given
revision.Body = ReEncodeCommitMessage(message, revision.MessageEncoding);
revision.Subject = revision.Body.Substring(0, revision.Body.IndexOfAny(new[] { '\r', '\n' }));
}
return revision;
}