public async Task <IList <BlamePorcelainEntry>?> Blame(string filePath, List <string>?gitArguments, List <string>?blameArguments, string?workingDirectory = null) { if (String.IsNullOrEmpty(filePath)) { throw new ArgumentException("must not be null or empty", nameof(filePath)); } var runner = CreateGitRunner(workingDirectory, gitArguments); SetCommandArguments(runner, "blame", blameArguments); runner.AddArgument("-p"); runner.AddQuotedArgument(filePath); var parserState = new BlameParserState(); Log.StatusLine(GetLogMessage(runner), CommandMessageColor); bool success = await RunTool( () => { using (var outputSink = (OutputSink)SetupOutputSink(runner)) { outputSink.LineCallback = (string line) => ParseBlameLine(line, parserState); runner.WorkingDirectory = DetermineRunnerWorkingDirectory(workingDirectory); return(runner.Run()); } } ); if (!success) { return(null); } return(parserState.Entries); }
void ParseBlameLine(string line, BlameParserState state) { if (state.CurrentEntry == null) { state.CurrentEntry = new BlamePorcelainEntry(); } if (!state.CurrentEntry.ProcessLine(line)) { return; } state.Entries.Add(state.CurrentEntry); state.CurrentEntry = null; }