Example #1
0
        private async Task <string> ExtractLogParameter(GitBranch branch, int skip, int limit, GitLogOptions logOptions, string revisionRange, CancellationToken token)
        {
            StringBuilder arguments = new StringBuilder();

            arguments.Append($"{revisionRange} ");

            if (branch != null)
            {
                arguments.Append($"--branches={branch.FriendlyName} ");
            }

            if (skip > 0)
            {
                arguments.Append($" --skip={skip}");
            }

            if (limit > 0)
            {
                arguments.Append($" --max-count={limit}");
            }

            arguments.Append(" --full-history");

            if (logOptions.HasFlag(GitLogOptions.TopologicalOrder))
            {
                arguments.Append(" --topo-order");
            }

            if (!logOptions.HasFlag(GitLogOptions.IncludeMerges))
            {
                arguments.Append(" --no-merges --first-parent");
            }

            GenerateFormat(arguments);

            if (logOptions.HasFlag(GitLogOptions.BranchOnlyAndParent))
            {
                StringBuilder ignoreBranches = new StringBuilder("--not ");

                var branches = await this.GetLocalBranches(token);

                foreach (var testBranch in branches)
                {
                    if (testBranch != branch)
                    {
                        ignoreBranches.Append($"{testBranch.FriendlyName} ");
                    }
                }

                arguments.Append($" {ignoreBranches} -- ");
            }

            return(arguments.ToString());
        }
Example #2
0
        /// <inheritdoc />
        public async Task <IList <GitCommit> > GetCommitsForBranch(GitBranch branch, int skip, int limit, GitLogOptions logOptions, CancellationToken token)
        {
            string arguments = await this.ExtractLogParameter(branch, skip, limit, logOptions, "HEAD", token);

            var result = await this.gitProcessManager.RunGit("log " + arguments, token);

            if (result.Success == false)
            {
                return(new List <GitCommit>());
            }

            string[] lines = result.ProcessOutput.Trim('\r', '\n').Split(new[] { '\u001e' }, StringSplitOptions.RemoveEmptyEntries);

            IList <GitCommit> results = ConvertStringToGitCommits(lines).ToList();

            if (logOptions.HasFlag(GitLogOptions.BranchOnlyAndParent) && results.Last().Parents.Any())
            {
                await this.GetSingleCommitLog(token, results);
            }

            return(results);
        }
Example #3
0
        /// <inheritdoc />
        public async Task <GitBranch> GetRemoteBranch(GitBranch branch, CancellationToken token)
        {
            if (branch.IsRemote)
            {
                return(branch);
            }

            var result = await this.gitProcessManager.RunGit("branch -lvv", token);

            if (result.Success == false)
            {
                return(null);
            }

            string[] lines = result.ProcessOutput.ToArrayOfLines();

            foreach (string line in lines)
            {
                var matches = Regex.Matches(line, @"^[* ][* ]([a-ZA-Z0-9/]*)[ ]*[a-zA-Z0-9]+ \[([a-zA-Z0-9/]*)\]");

                if (matches.Count != 2)
                {
                    continue;
                }

                var branchName = matches[0].Value;

                if (branchName.Equals(branch.FriendlyName, StringComparison.InvariantCultureIgnoreCase) == false)
                {
                    continue;
                }

                return(new GitBranch(matches[1].Value, true));
            }

            return(null);
        }