internal static void ParseSummary(IStringReader reader, ChangeSetDetail detail) { reader.SkipWhitespace(); while (!reader.Done) { string line = reader.ReadLine(); if (ParserHelpers.IsSingleNewLine(line)) { break; } else if (line.Contains('\t')) { // n n path string[] parts = line.Split('\t'); int insertions; Int32.TryParse(parts[0], out insertions); int deletions; Int32.TryParse(parts[1], out deletions); string path = parts[2].TrimEnd(); detail.Files[path] = new FileInfo { Insertions = insertions, Deletions = deletions, Binary = parts[0] == "-" && parts[1] == "-" }; } else { // n files changed, n insertions(+), n deletions(-) ParserHelpers.ParseSummaryFooter(line, detail); } } }
internal static ChangeSet ParseCommit(IStringReader reader) { // commit hash reader.ReadUntilWhitespace(); reader.SkipWhitespace(); string id = reader.ReadUntilWhitespace(); // Merges will have (from hash) so we're skipping that reader.ReadLine(); string author = null; string email = null; string date = null; while (!reader.Done) { string line = reader.ReadLine(); if (ParserHelpers.IsSingleNewLine(line)) { break; } var subReader = line.AsReader(); string key = subReader.ReadUntil(':'); // Skip : subReader.Skip(); subReader.SkipWhitespace(); string value = subReader.ReadToEnd().Trim(); if (key.Equals("Author", StringComparison.OrdinalIgnoreCase)) { // Author <email> var authorReader = value.AsReader(); author = authorReader.ReadUntil('<').Trim(); authorReader.Skip(); email = authorReader.ReadUntil('>'); } else if (key.Equals("Date", StringComparison.OrdinalIgnoreCase)) { date = value; } } var messageBuilder = new StringBuilder(); while (!reader.Done) { string line = reader.ReadLine(); if (ParserHelpers.IsSingleNewLine(line)) { break; } messageBuilder.Append(line); } string message = messageBuilder.ToString().Trim(); return(new ChangeSet(id, author, email, message, DateTimeOffset.ParseExact(date, "ddd MMM d HH:mm:ss yyyy zzz", CultureInfo.InvariantCulture))); }