This class holds utility methods for parsing the output from the Mercurial commands.
        /// <summary>
        /// This method should parse and store the appropriate execution result output
        /// according to the type of data the command line client would return for
        /// the command.
        /// </summary>
        /// <param name="exitCode">
        /// The exit code from executing the command line client.
        /// </param>
        /// <param name="standardOutput">
        /// The standard output from executing the command line client.
        /// </param>
        /// <exception cref="MercurialResultParsingException">
        /// Unable to parse one or more of the lines of output from the 'hg resolve --list' command
        /// </exception>
        protected override void ParseStandardOutputForResults(int exitCode, string standardOutput)
        {
            if (exitCode != 0 || Action != ResolveAction.List)
            {
                return;
            }

            var resolutionRegex = new Regex(@"^(?<state>[UR])\s(?<file>.*)$", RegexOptions.IgnoreCase);

            string[] lines  = OutputParsingUtilities.SplitIntoLines(standardOutput);
            var      result = new List <MergeConflict>();

            foreach (Match resolutionMatch in lines.Select(line => resolutionRegex.Match(line)))
            {
                if (!resolutionMatch.Success)
                {
                    throw new MercurialResultParsingException(exitCode, "Unable to parse one or more of the lines of output from the 'hg resolve --list' command", standardOutput);
                }

                result.Add(new MergeConflict(
                               resolutionMatch.Groups["file"].Value,
                               resolutionMatch.Groups["state"].Value == "R" ? MergeConflictState.Resolved : MergeConflictState.Unresolved));
            }
            Result = result;
        }
Beispiel #2
0
        /// <summary>
        /// Parses the standard output from executing a 'hg summary' command
        /// and returns a <see cref="RepositorySummary"/>.
        /// </summary>
        /// <param name="standardOutput">
        /// The standard output from a 'hg summary' command that is to be parsed.
        /// </param>
        /// <returns>
        /// The resulting <see cref="RepositorySummary"/> from parsing <paramref name="standardOutput"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <para><paramref name="standardOutput"/> is <c>null</c>.</para>
        /// </exception>
        public static RepositorySummary Parse(string standardOutput)
        {
            if (standardOutput == null)
            {
                throw new ArgumentNullException("standardOutput");
            }

            var parsers = new List <KeyValuePair <Regex, Action <RepositorySummary, string, Match> > >
            {
                new KeyValuePair <Regex, Action <RepositorySummary, string, Match> >(
                    new Regex(@"^parent:\s(?<revnum>-?\d+):[a-f0-9]+\s+.*$", RegexOptions.IgnoreCase),
                    ParseParents),
                new KeyValuePair <Regex, Action <RepositorySummary, string, Match> >(
                    new Regex(@"^branch:\s(?<name>.*)$", RegexOptions.IgnoreCase),
                    ParseBranch),
                new KeyValuePair <Regex, Action <RepositorySummary, string, Match> >(
                    new Regex(@"^update:\s((?<new>\d+)\snew changesets? \(update\))$", RegexOptions.IgnoreCase),
                    ParseUpdate),
                new KeyValuePair <Regex, Action <RepositorySummary, string, Match> >(
                    new Regex(@"^commit:\s((?<modified>\d+) modified(, )?)?((?<unknown>\d+) unknown(, )?)?((?<unresolved>\d+) unresolved(, )?)?(?<inmerge> \(merge\))?( ?\(clean\))?$", RegexOptions.IgnoreCase),
                    ParseCommit)
            };

            var summary = new RepositorySummary {
                RawOutput = standardOutput
            };

            foreach (string line in OutputParsingUtilities.SplitIntoLines(standardOutput))
            {
                foreach (var parser in parsers)
                {
                    Match ma = parser.Key.Match(line);
                    if (!ma.Success)
                    {
                        continue;
                    }

                    parser.Value(summary, line, ma);
                }
            }
            return(summary);
        }
Beispiel #3
0
        /// <summary>
        /// This method should parse and store the appropriate execution result output
        /// according to the type of data the command line client would return for
        /// the command.
        /// </summary>
        /// <param name="exitCode">
        /// The exit code from executing the command line client.
        /// </param>
        /// <param name="standardOutput">
        /// The standard output from executing the command line client.
        /// </param>
        /// <exception cref="MercurialResultParsingException">
        /// <para><paramref name="standardOutput"/> contains output with invalid/unknown format.</para>
        /// </exception>
        protected override void ParseStandardOutputForResults(int exitCode, string standardOutput)
        {
            string[] lines = OutputParsingUtilities.SplitIntoLines(standardOutput);

            var re          = new Regex(@"^(?<name>.*)\s+(?<revno>-?\d+):[a-f0-9]+(\s+\(inactive\))?$", RegexOptions.IgnoreCase);
            var branchHeads = new List <BranchHead>();

            foreach (Match ma in lines.Where(l => !StringEx.IsNullOrWhiteSpace(l)).Select(line => re.Match(line)))
            {
                if (!ma.Success)
                {
                    throw new MercurialResultParsingException(exitCode, "Unable to parse output from the branches command", standardOutput);
                }

                branchHeads.Add(new BranchHead(
                                    int.Parse(ma.Groups["revno"].Value, CultureInfo.InvariantCulture),
                                    ma.Groups["name"].Value.Trim()));
            }

            Result = branchHeads.OrderBy(b => b.Name).ToArray();
        }
Beispiel #4
0
        /// <summary>
        /// This method should parse and store the appropriate execution result output
        /// according to the type of data the command line client would return for
        /// the command.
        /// </summary>
        /// <param name="exitCode">
        /// The exit code from executing the command line client.
        /// </param>
        /// <param name="standardOutput">
        /// The standard output from executing the command line client.
        /// </param>
        protected override void ParseStandardOutputForResults(int exitCode, string standardOutput)
        {
            base.ParseStandardOutputForResults(exitCode, standardOutput);

            Result = OutputParsingUtilities.SplitIntoLines(standardOutput);
        }