示例#1
0
        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);
        }
示例#2
0
        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;
        }