Beispiel #1
0
        private void ReturnRemote()
        {
            var modes = currentModes.Select(s => s.ToLowerInvariant()).ToArray();

            var isFetch = modes.Contains("fetch");
            var isPush  = modes.Contains("push");

            GitRemoteFunction remoteFunction;

            if (isFetch && isPush)
            {
                remoteFunction = GitRemoteFunction.Both;
            }
            else if (isFetch)
            {
                remoteFunction = GitRemoteFunction.Fetch;
            }
            else if (isPush)
            {
                remoteFunction = GitRemoteFunction.Push;
            }
            else
            {
                remoteFunction = GitRemoteFunction.Unknown;
            }

            string host;
            string user = null;
            var    proc = new LineParser(currentUrl);

            if (proc.Matches("http") || proc.Matches("https"))
            {
                proc.MoveToAfter(':');
                proc.MoveNext();
                proc.MoveNext();
                host = proc.ReadUntil('/');
            }
            else
            {
                //Assuming SSH here
                user = proc.ReadUntil('@');
                proc.MoveNext();
                host = proc.ReadUntil(':');

                currentUrl = currentUrl.Substring(user.Length + 1);
            }

            RaiseOnEntry(new GitRemote
            {
                Name     = currentName,
                Host     = host,
                Url      = currentUrl,
                User     = user,
                Function = remoteFunction
            });

            Reset();
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            var proc = new LineParser(line);

            if (proc.IsAtEnd)
            {
                return;
            }

            try
            {
                string name;
                string trackingName = null;

                if (proc.Matches('*'))
                {
                    proc.MoveNext();
                }
                proc.SkipWhitespace();
                if (proc.Matches("(HEAD "))
                {
                    name = "detached";
                    proc.MoveToAfter(')');
                }
                else
                {
                    name = proc.ReadUntilWhitespace();
                }

                proc.ReadUntilWhitespaceTrim();
                if (proc.Matches(trackingBranchRegex))
                {
                    trackingName = proc.ReadChunk('[', ']');
                    var indexOf = trackingName.IndexOf(':');
                    if (indexOf != -1)
                    {
                        trackingName = trackingName.Substring(0, indexOf);
                    }
                }

                var branch = new GitBranch(name, trackingName);
                RaiseOnEntry(branch);
            }
            catch (Exception ex)
            {
                Logger.Warning(ex, "Unexpected input when listing branches");
            }
        }
Beispiel #3
0
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            int kb;
            var proc = new LineParser(line);

            if (int.TryParse(proc.ReadUntilWhitespace(), out kb))
            {
                RaiseOnEntry(kb);
            }
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            var proc = new LineParser(line);

            if (proc.IsAtEnd)
            {
                return;
            }

            try
            {
                proc.Matches('*');
                proc.SkipWhitespace();
                var detached = proc.Matches("(HEAD ");
                var name     = "detached";
                if (detached)
                {
                    proc.MoveToAfter(')');
                }
                else
                {
                    name = proc.ReadUntilWhitespace();
                }
                proc.SkipWhitespace();
                proc.ReadUntilWhitespace();
                var tracking     = proc.Matches(trackingBranchRegex);
                var trackingName = "";
                if (tracking)
                {
                    trackingName = proc.ReadChunk('[', ']');
                }

                var branch = new GitBranch(name, trackingName);

                RaiseOnEntry(branch);
            }
            catch (Exception ex)
            {
                Logger.Warning(ex, "Unexpected input when listing branches");
            }
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            var proc = new LineParser(line);

            if (proc.IsAtEnd)
            {
                return;
            }

            var active = proc.Matches('*');

            proc.SkipWhitespace();
            var detached = proc.Matches("(HEAD ");
            var name     = "detached";

            if (detached)
            {
                proc.MoveToAfter(')');
            }
            else
            {
                name = proc.ReadUntilWhitespace();
            }
            proc.SkipWhitespace();
            proc.ReadUntilWhitespace();
            var tracking     = proc.Matches(trackingBranchRegex);
            var trackingName = "";

            if (tracking)
            {
                trackingName = proc.ReadChunk('[', ']');
            }

            var branch = new GitBranch(name, trackingName, active);

            RaiseOnEntry(branch);
        }
Beispiel #6
0
        public override void LineReceived(string line)
        {
            //origin https://github.com/github/VisualStudio.git (fetch)

            if (line == null)
            {
                ReturnRemote();
                return;
            }

            var proc = new LineParser(line);
            var name = proc.ReadUntilWhitespace();

            proc.SkipWhitespace();

            var url = proc.ReadUntilWhitespace();

            proc.SkipWhitespace();

            proc.MoveNext();
            var mode = proc.ReadUntil(')');

            if (currentName == null)
            {
                currentName = name;
                currentUrl  = url;
                currentModes.Add(mode);
            }
            else if (currentName == name)
            {
                currentModes.Add(mode);
            }
            else
            {
                ReturnRemote();

                currentName = name;
                currentUrl  = url;
                currentModes.Add(mode);
            }
        }
Beispiel #7
0
        public override void LineReceived(string line)
        {
            if (string.IsNullOrEmpty(line))
            {
                //Do Nothing
                return;
            }

            var proc = new LineParser(line);

            if (proc.Matches(locksSummaryLineRegex))
            {
                return;
            }
            Logger.Debug(line);
            var path = proc.ReadUntil('\t').Trim();
            var user = proc.ReadUntilLast("ID:").Trim();

            proc.MoveToAfter("ID:");
            var id = int.Parse(proc.ReadToEnd().Trim());

            RaiseOnEntry(gitObjectFactory.CreateGitLock(path, user, id));
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                ReturnStatus();
            }
            else
            {
                Prepare();

                var proc = new LineParser(line);
                if (gitStatus.LocalBranch == null)
                {
                    if (proc.Matches("##"))
                    {
                        proc.MoveToAfter('#');
                        proc.SkipWhitespace();

                        string branchesString;
                        if (proc.Matches(branchTrackedAndDelta))
                        {
                            //master...origin/master [ahead 1]
                            //master...origin/master [behind 1]
                            //master...origin/master [ahead 1, behind 1]

                            branchesString = proc.ReadUntilWhitespace();

                            proc.MoveToAfter('[');

                            var deltaString = proc.ReadUntil(']');
                            var deltas      = deltaString.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries);
                            foreach (var delta in deltas)
                            {
                                var deltaComponents = delta.Split(' ');
                                if (deltaComponents[0] == "ahead")
                                {
                                    gitStatus.Ahead = Int32.Parse(deltaComponents[1]);
                                }
                                else if (deltaComponents[0] == "behind")
                                {
                                    gitStatus.Behind = Int32.Parse(deltaComponents[1]);
                                }
                                else if (deltaComponents[0] == "gone")
                                {
                                }
                                else
                                {
                                    throw new InvalidOperationException("Unexpected deltaComponent in o");
                                }
                            }
                        }
                        else
                        {
                            branchesString = proc.ReadToEnd();
                        }

                        var branches = branchesString.Split(new[] { "..." }, StringSplitOptions.RemoveEmptyEntries);
                        gitStatus.LocalBranch = branches[0];
                        if (branches.Length == 2)
                        {
                            gitStatus.RemoteBranch = branches[1];
                        }
                    }
                    else
                    {
                        HandleUnexpected(line);
                    }
                }
                else
                {
                    // M GitHubVS.sln
                    //R  README.md -> README2.md
                    // D deploy.cmd
                    //A  something added.txt
                    //?? something.txt

                    string originalPath = null;
                    string path         = null;
                    var    status       = GitFileStatus.Added;
                    var    staged       = false;

                    if (proc.Matches('?'))
                    {
                        //?? something.txt
                        proc.MoveToAfter('?');
                        proc.SkipWhitespace();

                        path   = proc.ReadToEnd().Trim('"');
                        status = GitFileStatus.Untracked;
                    }
                    else if (proc.Matches('!'))
                    {
                        //?? something.txt
                        proc.MoveToAfter('!');
                        proc.SkipWhitespace();

                        path   = proc.ReadToEnd().Trim('"');
                        status = GitFileStatus.Ignored;
                    }
                    else
                    {
                        if (proc.IsAtWhitespace)
                        {
                            proc.SkipWhitespace();
                        }
                        else
                        {
                            staged = true;
                        }

                        if (proc.Matches('M'))
                        {
                            //M  GitHubVS.sln
                            proc.MoveNext();
                            proc.SkipWhitespace();

                            path   = proc.ReadToEnd().Trim('"');
                            status = GitFileStatus.Modified;
                        }
                        else if (proc.Matches('D'))
                        {
                            //D  deploy.cmd
                            proc.MoveNext();
                            proc.SkipWhitespace();

                            path   = proc.ReadToEnd().Trim('"');
                            status = GitFileStatus.Deleted;
                        }
                        else if (proc.Matches('R'))
                        {
                            //R  README.md -> README2.md
                            proc.MoveNext();
                            proc.SkipWhitespace();

                            var files =
                                proc.ReadToEnd()
                                .Split(new[] { "->" }, StringSplitOptions.RemoveEmptyEntries)
                                .Select(s => s.Trim())
                                .Select(s => s.Trim('"'))
                                .ToArray();

                            originalPath = files[0];
                            path         = files[1];
                            status       = GitFileStatus.Renamed;
                        }
                        else if (proc.Matches('A'))
                        {
                            //A  something added.txt
                            proc.MoveNext();
                            proc.SkipWhitespace();

                            path   = proc.ReadToEnd().Trim('"');
                            status = GitFileStatus.Added;
                        }
                        else
                        {
                            HandleUnexpected(line);
                        }
                    }

                    var gitStatusEntry = gitObjectFactory.CreateGitStatusEntry(path, status, originalPath, staged);
                    gitStatus.Entries.Add(gitStatusEntry);
                }
            }
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                ReturnGitLogEntry();
                return;
            }
            sb.AppendLine(line);

            if (phase == ProcessingPhase.Files && seenBodyEnd)
            {
                seenBodyEnd = false;
                var proc = new LineParser(line);
                if (proc.Matches(hashRegex))
                {
                    // there's no files on this commit, it's a new one!
                    ReturnGitLogEntry();
                }
            }

            switch (phase)
            {
            case ProcessingPhase.CommitHash:
                commitId = line;
                phase++;
                break;

            case ProcessingPhase.ParentHash:
                var parentHashes = line.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                if (parentHashes.Length > 1)
                {
                    mergeA = parentHashes[0];
                    mergeB = parentHashes[1];
                }

                phase++;
                break;

            case ProcessingPhase.AuthorName:
                authorName = line;
                phase++;
                break;

            case ProcessingPhase.AuthorEmail:
                authorEmail = line;
                phase++;
                break;

            case ProcessingPhase.AuthorDate:
                DateTimeOffset t;
                if (DateTimeOffset.TryParse(line, out t))
                {
                    time = t;
                }
                else
                {
                    Logger.Error("ERROR {0}", sb.ToString());
                    throw new FormatException("Invalid line");
                }
                phase++;
                break;

            case ProcessingPhase.CommitterName:
                committerName = line;
                phase++;
                break;

            case ProcessingPhase.CommitterEmail:
                committerEmail = line;
                phase++;
                break;

            case ProcessingPhase.CommitterDate:
                committerTime = DateTimeOffset.Parse(line);
                phase++;
                break;

            case ProcessingPhase.Summary:
            {
                var idx      = line.IndexOf("---GHUBODYEND---", StringComparison.InvariantCulture);
                var oneliner = idx >= 0;
                if (oneliner)
                {
                    line = line.Substring(0, idx);
                }

                summary = line;
                descriptionLines.Add(line);
                phase++;
                // there's no description so skip it
                if (oneliner)
                {
                    phase++;
                    seenBodyEnd = true;
                }
            }
            break;

            case ProcessingPhase.Description:
                var indexOf = line.IndexOf("---GHUBODYEND---", StringComparison.InvariantCulture);
                if (indexOf == -1)
                {
                    descriptionLines.Add(line);
                }
                else if (indexOf == 0)
                {
                    phase++;
                    seenBodyEnd = true;
                }
                else
                {
                    var substring = line.Substring(0, indexOf);
                    descriptionLines.Add(substring);
                    phase++;
                    seenBodyEnd = true;
                }
                break;

            case ProcessingPhase.Files:
                if (line == string.Empty)
                {
                    ReturnGitLogEntry();
                    return;
                }

                if (line.IndexOf("---GHUBODYEND---", StringComparison.InvariantCulture) >= 0)
                {
                    seenBodyEnd = true;
                    return;
                }

                var proc = new LineParser(line);

                string        file = null;
                GitFileStatus status;
                string        originalPath = null;

                if (proc.Matches('M'))
                {
                    status = GitFileStatus.Modified;
                }
                else if (proc.Matches('A'))
                {
                    status = GitFileStatus.Added;
                }
                else if (proc.Matches('D'))
                {
                    status = GitFileStatus.Deleted;
                }
                else if (proc.Matches('R'))
                {
                    status = GitFileStatus.Renamed;
                }
                else if (proc.Matches('C'))
                {
                    status = GitFileStatus.Copied;
                }
                else if (proc.Matches('T'))
                {
                    status = GitFileStatus.TypeChange;
                }
                else if (proc.Matches('U'))
                {
                    status = GitFileStatus.Unmerged;
                }
                else if (proc.Matches('X'))
                {
                    status = GitFileStatus.Unknown;
                }
                else if (proc.Matches('B'))
                {
                    status = GitFileStatus.Broken;
                }
                else if (String.IsNullOrEmpty(line))
                {
                    // there's no files on this commit, it's a new one!
                    ReturnGitLogEntry();
                    return;
                }
                else
                {
                    HandleUnexpected(line);
                    return;
                }

                switch (status)
                {
                case GitFileStatus.Modified:
                case GitFileStatus.Added:
                case GitFileStatus.Deleted:
                    proc.SkipWhitespace();

                    file = proc.Matches('"')
                                ? proc.ReadUntil('"')
                                : proc.ReadToEnd();

                    break;

                case GitFileStatus.Renamed:

                    proc.SkipWhitespace();

                    originalPath =
                        proc.Matches('"')
                                ? proc.ReadUntil('"')
                                : proc.ReadUntilWhitespace();

                    proc.SkipWhitespace();

                    file = proc.Matches('"')
                                ? proc.ReadUntil('"')
                                : proc.ReadToEnd();

                    break;

                default:
                    proc.SkipWhitespace();

                    file = proc.Matches('"')
                                ? proc.ReadUntil('"')
                                : proc.ReadUntilWhitespace();
                    if (file == null)
                    {
                        file = proc.ReadToEnd();
                    }

                    break;
                }

                changes.Add(gitObjectFactory.CreateGitStatusEntry(file, status, originalPath));

                break;

            default:
                HandleUnexpected(line);
                break;
            }
        }
        public override void LineReceived(string line)
        {
            if (line == null)
            {
                ReturnStatus();
            }
            else
            {
                Prepare();

                var proc = new LineParser(line);
                if (gitStatus.LocalBranch == null)
                {
                    if (proc.Matches("##"))
                    {
                        proc.MoveToAfter('#');
                        proc.SkipWhitespace();

                        string branchesString;
                        if (proc.Matches(branchTrackedAndDelta))
                        {
                            //master...origin/master [ahead 1]
                            //master...origin/master [behind 1]
                            //master...origin/master [ahead 1, behind 1]

                            branchesString = proc.ReadUntilWhitespace();

                            proc.MoveToAfter('[');

                            var deltaString = proc.ReadUntil(']');
                            var deltas      = deltaString.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries);
                            foreach (var delta in deltas)
                            {
                                var deltaComponents = delta.Split(' ');
                                if (deltaComponents[0] == "ahead")
                                {
                                    gitStatus.Ahead = Int32.Parse(deltaComponents[1]);
                                }
                                else if (deltaComponents[0] == "behind")
                                {
                                    gitStatus.Behind = Int32.Parse(deltaComponents[1]);
                                }
                                else if (deltaComponents[0] == "gone")
                                {
                                }
                                else
                                {
                                    throw new InvalidOperationException("Unexpected deltaComponent in o");
                                }
                            }
                        }
                        else
                        {
                            branchesString = proc.ReadToEnd();
                        }

                        var branches = branchesString.Split(new[] { "..." }, StringSplitOptions.RemoveEmptyEntries);
                        gitStatus.LocalBranch = branches[0];
                        if (branches.Length == 2)
                        {
                            gitStatus.RemoteBranch = branches[1];
                        }
                    }
                    else
                    {
                        HandleUnexpected(line);
                    }
                }
                else
                {
                    var gitStatusMarker = proc.Read(2);
                    if (gitStatusMarker == null)
                    {
                        HandleUnexpected(line);
                        return;
                    }


                    /*
                     * X          Y     Meaning
                     * -------------------------------------------------
                     *           [AMD]   not updated
                     * M        [ MD]   updated in index
                     * A        [ MD]   added to index
                     * D                deleted from index
                     * R        [ MD]   renamed in index
                     * C        [ MD]   copied in index
                     * [MARC]           index and work tree matches
                     * [ MARC]     M    work tree changed since index
                     * [ MARC]     D    deleted in work tree
                     * [ D]        R    renamed in work tree
                     * [ D]        C    copied in work tree
                     * -------------------------------------------------
                     * D           D    unmerged, both deleted
                     * A           A    unmerged, both added
                     * A           U    unmerged, added by us
                     * D           U    unmerged, deleted by us
                     * U           A    unmerged, added by them
                     * U           D    unmerged, deleted by them
                     * U           U    unmerged, both modified
                     * -------------------------------------------------
                     * ?           ?    untracked
                     * !           !    ignored
                     * -------------------------------------------------
                     */

                    string originalPath = null;
                    string path         = null;

                    var indexStatusMarker    = gitStatusMarker[0];
                    var workTreeStatusMarker = gitStatusMarker[1];

                    GitFileStatus indexStatus    = GitStatusEntry.ParseStatusMarker(indexStatusMarker);
                    GitFileStatus workTreeStatus = GitStatusEntry.ParseStatusMarker(workTreeStatusMarker);
                    GitFileStatus status         = workTreeStatus != GitFileStatus.None ? workTreeStatus : indexStatus;

                    if (status == GitFileStatus.None)
                    {
                        HandleUnexpected(line);
                        return;
                    }

                    if (status == GitFileStatus.Copied || status == GitFileStatus.Renamed)
                    {
                        var files =
                            proc.ReadToEnd()
                            .Split(new[] { "->" }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(s => s.Trim())
                            .Select(s => s.Trim('"'))
                            .ToArray();

                        originalPath = files[0];
                        path         = files[1];
                    }
                    else
                    {
                        path = proc.ReadToEnd().Trim().Trim('"');
                    }

                    var gitStatusEntry = gitObjectFactory.CreateGitStatusEntry(path, indexStatus, workTreeStatus, originalPath);
                    gitStatus.Entries.Add(gitStatusEntry);
                }
            }
        }