Ejemplo n.º 1
0
 public void Reset(ReadStep Step, int BytesNeed)
 {
     Step_      = Step;
     BytesRead_ = 0;
     BytesNeed_ = BytesNeed;
     Buffer_    = new byte[BytesNeed_];
 }
Ejemplo n.º 2
0
 void finishRevision()
 {
     if (revision != null)
     {
         if (revision.Name == null)
         {
             revision.Name = previousFileName;
         }
         else
         {
             previousFileName = revision.Name;
         }
     }
     if (revision == null || revision.Guid.Trim(hexChars).Length == 0)
     {
         if ((revision == null) || (InMemFilter == null) || InMemFilter.PassThru(revision))
         {
             if (revision != null)
             {
                 RevisionCount++;
             }
             if (Updated != null)
             {
                 Updated(this, new RevisionGraphUpdatedEventArgs(revision));
             }
         }
     }
     nextStep = ReadStep.Commit;
 }
Ejemplo n.º 3
0
        void FinishRevision()
        {
            if (_revision != null && _revision.Guid == null)
            {
                _revision = null;
            }
            if (_revision != null)
            {
                if (_revision.Name == null)
                {
                    _revision.Name = _previousFileName;
                }
                else
                {
                    _previousFileName = _revision.Name;
                }

                if (_revision.Guid.Trim(_hexChars).Length == 0 &&
                    (InMemFilter == null || InMemFilter.PassThru(_revision)))
                {
                    RevisionCount++;
                    if (Updated != null)
                    {
                        Updated(this, new RevisionGraphUpdatedEventArgs(_revision));
                    }
                }
            }
            _nextStep = ReadStep.Commit;
        }
Ejemplo n.º 4
0
        void dataReceived(string line)
        {
            if (line == null)
                return;

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
                case ReadStep.Commit:
                    // Sanity check
                    if (line == COMMIT_BEGIN)
                    {
                        revision = new GitRevision(null);
                    }
                    else
                    {
                        // Bail out until we see what we expect
                        return;
                    }
                    break;

                case ReadStep.Hash:
                    revision.Guid = line;
                    for (int i = heads.Count - 1; i >= 0; i--)
                    {
                        if (heads[i].Guid == revision.Guid)
                        {
                            revision.Heads.Add(heads[i]);

                            //Only search for a head once, remove it from list
                            heads.Remove(heads[i]);
                        }
                    }
                    break;

                case ReadStep.Parents:
                    revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                    break;

                case ReadStep.Tree:
                    revision.TreeGuid = line;
                    break;

                case ReadStep.AuthorName:
                    revision.Author = line;
                    break;

                case ReadStep.AuthorEmail:
                    revision.AuthorEmail = line;
                    break;

                case ReadStep.AuthorDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.AuthorDate = dateTime;
                    }
                    break;

                case ReadStep.CommitterName:
                    revision.Committer = line;
                    break;

                case ReadStep.CommitterDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.CommitDate = dateTime;
                    }
                    break;

                case ReadStep.CommitMessageEncoding:
                    revision.MessageEncoding = line;
                    break;

                case ReadStep.CommitMessage:
                    revision.Message = GitCommandHelpers.ReEncodeCommitMessage(line, revision.MessageEncoding);

                    break;

                case ReadStep.FileName:
                    revision.Name = line;
                    break;
            }

            nextStep++;
        }
Ejemplo n.º 5
0
 void finishRevision()
 {
     lock (revisions)
     {
         if (revision == null || revision.Guid.Trim(hexChars).Length == 0)
         {
             revisions.Add(revision);
             Updated(this, new RevisionGraphUpdatedEvent(revision));
         }
         nextStep = ReadStep.Commit;
     }
 }
Ejemplo n.º 6
0
        void dataReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
                case ReadStep.Commit:
                    // Sanity check
                    if (line == COMMIT_BEGIN)
                    {
                        revision = new GitRevision();
                    }
                    else
                    {
                        // Bail out until we see what we expect
                        return;
                    }
                    break;

                case ReadStep.Hash:
                    revision.Guid = line;
                    for (int i = heads.Count-1; i >=0; i--)
                    {
                        if (heads[i].Guid == revision.Guid)
                        {
                            revision.Heads.Add(heads[i]);

                            //Only search for a head once, remove it from list
                            heads.Remove(heads[i]);
                        }
                    }
                    break;

                case ReadStep.Parents:
                    revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                    break;

                case ReadStep.Tree:
                    revision.TreeGuid = line;
                    break;

                case ReadStep.AuthorName:
                    revision.Author = line;
                    break;

                case ReadStep.AuthorDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.AuthorDate = dateTime;
                    }
                    break;

                case ReadStep.CommitterName:
                    revision.Committer = line;
                    break;

                case ReadStep.CommitterDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.CommitDate = dateTime;
                    }
                    break;

                case ReadStep.CommitMessage:
                    //We need to recode the commit message because of a bug in Git.
                    //We cannot let git recode the message to Settings.Encoding which is
                    //needed to allow the "git log" to print the filename in Settings.Encoding
                    if (logoutputEncoding == null)
                        logoutputEncoding = GitCommands.GetLogoutputEncoding();

                    if (logoutputEncoding != Settings.Encoding)
                        revision.Message = logoutputEncoding.GetString(Settings.Encoding.GetBytes(line));
                    else
                        revision.Message = line;
                    break;

                case ReadStep.FileName:
                    revision.Name = line;
                    break;
            }

            nextStep++;
        }
Ejemplo n.º 7
0
 void FinishRevision()
 {
     if (_revision != null && _revision.Guid == null)
         _revision = null;
     if (_revision != null)
     {
         if (_revision.Name == null)
             _revision.Name = _previousFileName;
         else
             _previousFileName = _revision.Name;
     }
     if (_revision == null || _revision.Guid.Trim(_hexChars).Length == 0)
     {
         if (_revision == null || InMemFilter == null || InMemFilter.PassThru(_revision))
         {
             if (_revision != null)
                 RevisionCount++;
             if (Updated != null)
                 Updated(this, new RevisionGraphUpdatedEventArgs(_revision));
         }
     }
     _nextStep = ReadStep.Commit;
 }
Ejemplo n.º 8
0
        void DataReceived(string data)
        {
            if (data.StartsWith(CommitBegin))
            {
                // a new commit finalizes the last revision
                FinishRevision();
                _nextStep = ReadStep.Commit;
            }

            switch (_nextStep)
            {
                case ReadStep.Commit:
                    data = GitModule.ReEncodeString(data, GitModule.LosslessEncoding, _module.LogOutputEncoding);

                    string[] lines = data.Split(new char[] { '\n' });
                    Debug.Assert(lines.Length == 11);
                    Debug.Assert(lines[0] == CommitBegin);

                    _revision = new GitRevision(_module, null);

                    _revision.Guid = lines[1];
                    {
                        List<GitRef> gitRefs;
                        if (_refs.TryGetValue(_revision.Guid, out gitRefs))
                            _revision.Refs.AddRange(gitRefs);
                    }

                    // RemoveEmptyEntries is required for root commits. They should have empty list of parents.
                    _revision.ParentGuids = lines[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    _revision.TreeGuid = lines[3];

                    _revision.Author = lines[4];
                    _revision.AuthorEmail = lines[5];
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(lines[6], out dateTime))
                            _revision.AuthorDate = dateTime;
                    }

                    _revision.Committer = lines[7];
                    _revision.CommitterEmail = lines[8];
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(lines[9], out dateTime))
                            _revision.CommitDate = dateTime;
                    }

                    _revision.MessageEncoding = lines[10];
                    break;

                case ReadStep.CommitSubject:
                    _revision.Subject = _module.ReEncodeCommitMessage(data, _revision.MessageEncoding);
                    break;

                case ReadStep.CommitBody:
                    _revision.Body = _module.ReEncodeCommitMessage(data, _revision.MessageEncoding);
                    break;

                case ReadStep.FileName:
                    if (!string.IsNullOrEmpty(data))
                    {
                        // Git adds \n between the format string (ends with \0 in our case)
                        // and the first file name. So, we need to remove it from the file name.
                        _revision.Name = data.TrimStart(new char[] { '\n' });
                    }
                    break;
            }

            _nextStep++;
        }
Ejemplo n.º 9
0
        void dataReceived(string line)
        {
            if (line == null)
                return;

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
                case ReadStep.Commit:
                    // Sanity check
                    if (line == COMMIT_BEGIN)
                    {
                        revision = new GitRevision(Module, null);
                    }
                    else
                    {
                        // Bail out until we see what we expect
                        return;
                    }
                    break;

                case ReadStep.Hash:
                    revision.Guid = line;

                    List<GitHead> headList;
                    if (heads.TryGetValue(revision.Guid, out headList))
                        revision.Heads.AddRange(headList);

                    break;

                case ReadStep.Parents:
                    revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                    break;

                case ReadStep.Tree:
                    revision.TreeGuid = line;
                    break;

                case ReadStep.AuthorName:
                    revision.Author = line;
                    break;

                case ReadStep.AuthorEmail:
                    revision.AuthorEmail = line;
                    break;

                case ReadStep.AuthorDate:
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                            revision.AuthorDate = dateTime;
                    }
                    break;

                case ReadStep.CommitterName:
                    revision.Committer = line;
                    break;

                case ReadStep.CommitterDate:
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                            revision.CommitDate = dateTime;
                    }
                    break;

                case ReadStep.CommitMessageEncoding:
                    revision.MessageEncoding = line;
                    break;

                case ReadStep.CommitMessage:
                    revision.Message = Module.ReEncodeCommitMessage(line, revision.MessageEncoding);

                    break;

                case ReadStep.FileName:
                    revision.Name = line;
                    break;
            }

            nextStep++;
        }
Ejemplo n.º 10
0
        void dataReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
            case ReadStep.Commit:
                // Sanity check
                if (line == COMMIT_BEGIN)
                {
                    revision = new GitRevision(null);
                }
                else
                {
                    // Bail out until we see what we expect
                    return;
                }
                break;

            case ReadStep.Hash:
                revision.Guid = line;
                for (int i = heads.Count - 1; i >= 0; i--)
                {
                    if (heads[i].Guid == revision.Guid)
                    {
                        revision.Heads.Add(heads[i]);

                        //Only search for a head once, remove it from list
                        heads.Remove(heads[i]);
                    }
                }
                break;

            case ReadStep.Parents:
                revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                break;

            case ReadStep.Tree:
                revision.TreeGuid = line;
                break;

            case ReadStep.AuthorName:
                revision.Author = line;
                break;

            case ReadStep.AuthorEmail:
                revision.AuthorEmail = line;
                break;

            case ReadStep.AuthorDate:
            {
                DateTime dateTime;
                DateTime.TryParse(line, out dateTime);
                revision.AuthorDate = dateTime;
            }
            break;

            case ReadStep.CommitterName:
                revision.Committer = line;
                break;

            case ReadStep.CommitterDate:
            {
                DateTime dateTime;
                DateTime.TryParse(line, out dateTime);
                revision.CommitDate = dateTime;
            }
            break;

            case ReadStep.CommitMessage:
                //We need to recode the commit message because of a bug in Git.
                //We cannot let git recode the message to Settings.Encoding which is
                //needed to allow the "git log" to print the filename in Settings.Encoding
                if (logoutputEncoding == null)
                {
                    logoutputEncoding = Settings.Module.GetLogoutputEncoding();
                }

                if (!logoutputEncoding.Equals(Settings.Encoding))
                {
                    revision.Message = logoutputEncoding.GetString(Settings.Encoding.GetBytes(line));
                }
                else
                {
                    revision.Message = line;
                }
                break;

            case ReadStep.FileName:
                revision.Name = line;
                break;
            }

            nextStep++;
        }
Ejemplo n.º 11
0
 void finishRevision()
 {
     lock (revisions)
     {
         if (revision == null || revision.Guid.Trim(hexChars).Length == 0)
         {
             if ((revision == null) || (InMemFilter == null) || InMemFilter.PassThru(revision))
             {
                 if (revision != null)
                     revisions.Add(revision);
                 Updated(this, new RevisionGraphUpdatedEventArgs(revision));
             }
         }
         nextStep = ReadStep.Commit;
     }
 }
Ejemplo n.º 12
0
        void DataReceived(string line)
        {
            if (line == null)
                return;

            if (line == CommitBegin)
            {
                // a new commit finalizes the last revision
                FinishRevision();

                _nextStep = ReadStep.Commit;
            }

            switch (_nextStep)
            {
                case ReadStep.Commit:
                    // Sanity check
                    if (line == CommitBegin)
                    {
                        _revision = new GitRevision(_module, null);
                    }
                    else
                    {
                        // Bail out until we see what we expect
                        return;
                    }
                    break;

                case ReadStep.Hash:
                    _revision.Guid = line;

                    List<GitRef> gitRefs;
                    if (_refs.TryGetValue(_revision.Guid, out gitRefs))
                        _revision.Refs.AddRange(gitRefs);

                    break;

                case ReadStep.Parents:
                    _revision.ParentGuids = line.Split(_splitChars, StringSplitOptions.RemoveEmptyEntries);
                    break;

                case ReadStep.Tree:
                    _revision.TreeGuid = line;
                    break;

                case ReadStep.AuthorName:
                    _revision.Author = line;
                    break;

                case ReadStep.AuthorEmail:
                    _revision.AuthorEmail = line;
                    break;

                case ReadStep.AuthorDate:
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                            _revision.AuthorDate = dateTime;
                    }
                    break;

                case ReadStep.CommitterName:
                    _revision.Committer = line;
                    break;

                case ReadStep.CommitterEmail:
                    _revision.CommitterEmail = line;
                    break;

                case ReadStep.CommitterDate:
                    {
                        DateTime dateTime;
                        if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                            _revision.CommitDate = dateTime;
                    }
                    break;

                case ReadStep.CommitMessageEncoding:
                    _revision.MessageEncoding = line;
                    break;

                case ReadStep.CommitMessage:
                    _revision.Message = _module.ReEncodeCommitMessage(line, _revision.MessageEncoding);

                    break;

                case ReadStep.FileName:
                    _revision.Name = line;
                    break;
            }

            _nextStep++;
        }
Ejemplo n.º 13
0
        void dataReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
            case ReadStep.Commit:
                // Sanity check
                if (line == COMMIT_BEGIN)
                {
                    revision = new GitRevision(null);
                }
                else
                {
                    // Bail out until we see what we expect
                    return;
                }
                break;

            case ReadStep.Hash:
                revision.Guid = line;
                for (int i = heads.Count - 1; i >= 0; i--)
                {
                    if (heads[i].Guid == revision.Guid)
                    {
                        revision.Heads.Add(heads[i]);

                        //Only search for a head once, remove it from list
                        heads.Remove(heads[i]);
                    }
                }
                break;

            case ReadStep.Parents:
                revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                break;

            case ReadStep.Tree:
                revision.TreeGuid = line;
                break;

            case ReadStep.AuthorName:
                revision.Author = line;
                break;

            case ReadStep.AuthorEmail:
                revision.AuthorEmail = line;
                break;

            case ReadStep.AuthorDate:
            {
                DateTime dateTime;
                DateTime.TryParse(line, out dateTime);
                revision.AuthorDate = dateTime;
            }
            break;

            case ReadStep.CommitterName:
                revision.Committer = line;
                break;

            case ReadStep.CommitterDate:
            {
                DateTime dateTime;
                DateTime.TryParse(line, out dateTime);
                revision.CommitDate = dateTime;
            }
            break;

            case ReadStep.CommitMessageEncoding:
                revision.MessageEncoding = line;
                break;

            case ReadStep.CommitMessage:
                revision.Message = GitCommandHelpers.ReEncodeCommitMessage(line, revision.MessageEncoding);

                break;

            case ReadStep.FileName:
                revision.Name = line;
                break;
            }

            nextStep++;
        }
Ejemplo n.º 14
0
        private void ProccessGitLog(CancellationToken taskState)
        {
            RevisionCount = 0;
            if (Updated != null)
                Updated(this, new RevisionGraphUpdatedEventArgs(null));
            _refs = GetRefs().ToDictionaryOfList(head => head.Guid);

            string formatString =
                /* <COMMIT>       */ CommitBegin + "%n" +
                /* Hash           */ "%H%n" +
                /* Parents        */ "%P%n";
            if (!ShaOnly)
            {
                formatString +=
                    /* Tree                    */ "%T%n" +
                    /* Author Name             */ "%aN%n" +
                    /* Author Email            */ "%aE%n" +
                    /* Author Date             */ "%at%n" +
                    /* Committer Name          */ "%cN%n" +
                    /* Committer Email         */ "%cE%n" +
                    /* Committer Date          */ "%ct%n" +
                    /* Commit message encoding */ "%e%x00" + //there is a bug: git does not recode commit message when format is given
                    /* Commit Subject          */ "%s%x00" +
                    /* Commit Body             */ "%B%x00";
            }

            // NOTE:
            // when called from FileHistory and FollowRenamesInFileHistory is enabled the "--name-only" argument is set.
            // the filename is the next line after the commit-format defined above.

            string logParam;
            if (AppSettings.OrderRevisionByDate)
            {
                logParam = " --date-order";
            }
            else
            {
                logParam = " --topo-order";
            }

            if ((RefsOptions & RefsFiltringOptions.All) == RefsFiltringOptions.All)
                logParam += " --all";
            else
            {
                if ((RefsOptions & RefsFiltringOptions.Branches) == RefsFiltringOptions.Branches)
                    logParam = " --branches";
                if ((RefsOptions & RefsFiltringOptions.Remotes) == RefsFiltringOptions.Remotes)
                    logParam += " --remotes";
                if ((RefsOptions & RefsFiltringOptions.Tags) == RefsFiltringOptions.Tags)
                    logParam += " --tags";
            }
            if ((RefsOptions & RefsFiltringOptions.Boundary) == RefsFiltringOptions.Boundary)
                logParam += " --boundary";
            if ((RefsOptions & RefsFiltringOptions.ShowGitNotes) == RefsFiltringOptions.ShowGitNotes)
                logParam += " --not --glob=notes --not";

            if ((RefsOptions & RefsFiltringOptions.NoMerges) == RefsFiltringOptions.NoMerges)
                logParam += " --no-merges";

            string branchFilter = BranchFilter;
            if ((!string.IsNullOrWhiteSpace(BranchFilter)) &&
                (BranchFilter.IndexOfAny(ShellGlobCharacters) >= 0))
                branchFilter = "--branches=" + BranchFilter;

            string arguments = String.Format(CultureInfo.InvariantCulture,
                "log -z {2} --pretty=format:\"{1}\" {0} {3} -- {4}",
                logParam,
                formatString,
                branchFilter,
                RevisionFilter,
                PathFilter);

            Process p = _module.RunGitCmdDetached(arguments, GitModule.LosslessEncoding);

            if (taskState.IsCancellationRequested)
                return;

            _previousFileName = null;
            if (BeginUpdate != null)
                BeginUpdate(this, EventArgs.Empty);

            _nextStep = ReadStep.Commit;
            foreach (string data in ReadDataBlocks(p.StandardOutput))
            {
                if (taskState.IsCancellationRequested)
                    break;

                DataReceived(data);
            }
        }
Ejemplo n.º 15
0
        void dataReceived(string line)
        {
            if (line == null)
            {
                return;
            }
            switch (nextStep)
            {
                case ReadStep.Commit:
                    // Sanity check
                    if (line == COMMIT_BEGIN)
                    {
                        revision = new GitRevision();
                    }
                    else
                    {
                        // Bail out until we see what we expect
                        return;
                    }
                    break;

                case ReadStep.Hash:
                    revision.Guid = line;
                    for (int i = heads.Count-1; i >=0; i--)
                    {
                        if (heads[i].Guid == revision.Guid)
                        {
                            revision.Heads.Add(heads[i]);

                            //Only search for a head once, remove it from list
                            heads.Remove(heads[i]);
                        }
                    }
                    break;

                case ReadStep.Parents:
                    revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                    break;

                case ReadStep.Tree:
                    revision.TreeGuid = line;
                    break;

                case ReadStep.AuthorName:
                    revision.Author = line;
                    break;

                case ReadStep.AuthorDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.AuthorDate = dateTime;
                    }
                    break;

                case ReadStep.CommitterName:
                    revision.Committer = line;
                    break;

                case ReadStep.CommitterDate:
                    {
                        DateTime dateTime;
                        DateTime.TryParse(line, out dateTime);
                        revision.CommitDate = dateTime;
                    }
                    break;

                case ReadStep.CommitMessage:
                    revision.Message = line;
                    break;
            }

            nextStep++;
            if (ShaOnly && nextStep == ReadStep.Tree)
            {
                nextStep = ReadStep.Done;
            }

            if (nextStep == ReadStep.Done)
            {
                lock (revisions)
                {
                    if (revision == null || revision.Guid.Trim(hexChars).Length == 0)
                    {
                        revisions.Add(revision);
                        Updated(this, new RevisionGraphUpdatedEvent(revision));
                    }
                    nextStep = ReadStep.Commit;
                }
            }
        }
Ejemplo n.º 16
0
        void DataReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            if (line == CommitBegin)
            {
                // a new commit finalizes the last revision
                FinishRevision();

                _nextStep = ReadStep.Commit;
            }

            switch (_nextStep)
            {
            case ReadStep.Commit:
                // Sanity check
                if (line == CommitBegin)
                {
                    _revision = new GitRevision(_module, null);
                }
                else
                {
                    // Bail out until we see what we expect
                    return;
                }
                break;

            case ReadStep.Hash:
                _revision.Guid = line;

                List <GitRef> gitRefs;
                if (_refs.TryGetValue(_revision.Guid, out gitRefs))
                {
                    _revision.Refs.AddRange(gitRefs);
                }

                break;

            case ReadStep.Parents:
                _revision.ParentGuids = line.Split(_splitChars, StringSplitOptions.RemoveEmptyEntries);
                break;

            case ReadStep.Tree:
                _revision.TreeGuid = line;
                break;

            case ReadStep.AuthorName:
                _revision.Author = line;
                break;

            case ReadStep.AuthorEmail:
                _revision.AuthorEmail = line;
                break;

            case ReadStep.AuthorDate:
            {
                DateTime dateTime;
                if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                {
                    _revision.AuthorDate = dateTime;
                }
            }
            break;

            case ReadStep.CommitterName:
                _revision.Committer = line;
                break;

            case ReadStep.CommitterEmail:
                _revision.CommitterEmail = line;
                break;

            case ReadStep.CommitterDate:
            {
                DateTime dateTime;
                if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                {
                    _revision.CommitDate = dateTime;
                }
            }
            break;

            case ReadStep.CommitMessageEncoding:
                _revision.MessageEncoding = line;
                break;

            case ReadStep.CommitMessage:
                _revision.Message = _module.ReEncodeCommitMessage(line, _revision.MessageEncoding);

                break;

            case ReadStep.FileName:
                _revision.Name = line;
                break;
            }

            _nextStep++;
        }
Ejemplo n.º 17
0
        private void ProccessGitLog(CancellationToken taskState)
        {
            RevisionCount = 0;
            if (Updated != null)
            {
                Updated(this, new RevisionGraphUpdatedEventArgs(null));
            }
            _refs = GetRefs().ToDictionaryOfList(head => head.Guid);

            string formatString =
                /* <COMMIT>       */ CommitBegin + "%n" +
                /* Hash           */ "%H%n" +
                /* Parents        */ "%P%n";

            if (!ShaOnly)
            {
                formatString +=
                    /* Tree                    */ "%T%n" +
                    /* Author Name             */ "%aN%n" +
                    /* Author Email            */ "%aE%n" +
                    /* Author Date             */ "%at%n" +
                    /* Committer Name          */ "%cN%n" +
                    /* Committer Email         */ "%cE%n" +
                    /* Committer Date          */ "%ct%n" +
                    /* Commit message encoding */ "%e%x00" + //there is a bug: git does not recode commit message when format is given
                    /* Commit Subject          */ "%s%x00" +
                    /* Commit Body             */ "%B%x00";
            }

            // NOTE:
            // when called from FileHistory and FollowRenamesInFileHistory is enabled the "--name-only" argument is set.
            // the filename is the next line after the commit-format defined above.

            string logParam;

            if (AppSettings.OrderRevisionByDate)
            {
                logParam = " --date-order";
            }
            else
            {
                logParam = " --topo-order";
            }

            if ((RefsOptions & RefsFiltringOptions.All) == RefsFiltringOptions.All)
            {
                logParam += " --all";
            }
            else
            {
                if ((RefsOptions & RefsFiltringOptions.Branches) == RefsFiltringOptions.Branches)
                {
                    logParam = " --branches";
                }
                if ((RefsOptions & RefsFiltringOptions.Remotes) == RefsFiltringOptions.Remotes)
                {
                    logParam += " --remotes";
                }
                if ((RefsOptions & RefsFiltringOptions.Tags) == RefsFiltringOptions.Tags)
                {
                    logParam += " --tags";
                }
            }
            if ((RefsOptions & RefsFiltringOptions.Boundary) == RefsFiltringOptions.Boundary)
            {
                logParam += " --boundary";
            }
            if ((RefsOptions & RefsFiltringOptions.ShowGitNotes) == RefsFiltringOptions.ShowGitNotes)
            {
                logParam += " --not --glob=notes --not";
            }

            if ((RefsOptions & RefsFiltringOptions.NoMerges) == RefsFiltringOptions.NoMerges)
            {
                logParam += " --no-merges";
            }

            if ((RefsOptions & RefsFiltringOptions.FirstParent) == RefsFiltringOptions.FirstParent)
            {
                logParam += " --first-parent";
            }

            if ((RefsOptions & RefsFiltringOptions.SimplifyByDecoration) == RefsFiltringOptions.SimplifyByDecoration)
            {
                logParam += " --simplify-by-decoration";
            }

            string branchFilter = BranchFilter;

            if ((!string.IsNullOrWhiteSpace(BranchFilter)) &&
                (BranchFilter.IndexOfAny(ShellGlobCharacters) >= 0))
            {
                branchFilter = "--branches=" + BranchFilter;
            }

            string arguments = String.Format(CultureInfo.InvariantCulture,
                                             "log -z {2} --pretty=format:\"{1}\" {0} {3} -- {4}",
                                             logParam,
                                             formatString,
                                             branchFilter,
                                             RevisionFilter,
                                             PathFilter);

            Process p = _module.RunGitCmdDetached(arguments, GitModule.LosslessEncoding);

            if (taskState.IsCancellationRequested)
            {
                return;
            }

            _previousFileName = null;
            if (BeginUpdate != null)
            {
                BeginUpdate(this, EventArgs.Empty);
            }

            _nextStep = ReadStep.Commit;
            foreach (string data in ReadDataBlocks(p.StandardOutput))
            {
                if (taskState.IsCancellationRequested)
                {
                    break;
                }

                DataReceived(data);
            }
        }
Ejemplo n.º 18
0
        void dataReceived(string line)
        {
            if (line == null)
            {
                return;
            }

            if (line == COMMIT_BEGIN)
            {
                // a new commit finalizes the last revision
                finishRevision();

                nextStep = ReadStep.Commit;
            }

            switch (nextStep)
            {
            case ReadStep.Commit:
                // Sanity check
                if (line == COMMIT_BEGIN)
                {
                    revision = new GitRevision(null);
                }
                else
                {
                    // Bail out until we see what we expect
                    return;
                }
                break;

            case ReadStep.Hash:
                revision.Guid = line;

                List <GitHead> headList;
                if (heads.TryGetValue(revision.Guid, out headList))
                {
                    revision.Heads.AddRange(headList);
                }

                break;

            case ReadStep.Parents:
                revision.ParentGuids = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                break;

            case ReadStep.Tree:
                revision.TreeGuid = line;
                break;

            case ReadStep.AuthorName:
                revision.Author = line;
                break;

            case ReadStep.AuthorEmail:
                revision.AuthorEmail = line;
                break;

            case ReadStep.AuthorDate:
            {
                DateTime dateTime;
                if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                {
                    revision.AuthorDate = dateTime;
                }
            }
            break;

            case ReadStep.CommitterName:
                revision.Committer = line;
                break;

            case ReadStep.CommitterDate:
            {
                DateTime dateTime;
                if (DateTimeUtils.TryParseUnixTime(line, out dateTime))
                {
                    revision.CommitDate = dateTime;
                }
            }
            break;

            case ReadStep.CommitMessageEncoding:
                revision.MessageEncoding = line;
                break;

            case ReadStep.CommitMessage:
                revision.Message = GitCommandHelpers.ReEncodeCommitMessage(line, revision.MessageEncoding);

                break;

            case ReadStep.FileName:
                revision.Name = line;
                break;
            }

            nextStep++;
        }
Ejemplo n.º 19
0
        void DataReceived(string data)
        {
            if (data.StartsWith(CommitBegin))
            {
                // a new commit finalizes the last revision
                FinishRevision();
                _nextStep = ReadStep.Commit;
            }

            switch (_nextStep)
            {
            case ReadStep.Commit:
                data = GitModule.ReEncodeString(data, GitModule.LosslessEncoding, _module.LogOutputEncoding);

                string[] lines = data.Split(new char[] { '\n' });
                Debug.Assert(lines.Length == 11);
                Debug.Assert(lines[0] == CommitBegin);

                _revision = new GitRevision(_module, null);

                _revision.Guid = lines[1];
                {
                    List <GitRef> gitRefs;
                    if (_refs.TryGetValue(_revision.Guid, out gitRefs))
                    {
                        _revision.Refs.AddRange(gitRefs);
                    }
                }

                // RemoveEmptyEntries is required for root commits. They should have empty list of parents.
                _revision.ParentGuids = lines[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                _revision.TreeGuid    = lines[3];

                _revision.Author      = lines[4];
                _revision.AuthorEmail = lines[5];
                {
                    DateTime dateTime;
                    if (DateTimeUtils.TryParseUnixTime(lines[6], out dateTime))
                    {
                        _revision.AuthorDate = dateTime;
                    }
                }

                _revision.Committer      = lines[7];
                _revision.CommitterEmail = lines[8];
                {
                    DateTime dateTime;
                    if (DateTimeUtils.TryParseUnixTime(lines[9], out dateTime))
                    {
                        _revision.CommitDate = dateTime;
                    }
                }

                _revision.MessageEncoding = lines[10];
                break;

            case ReadStep.CommitSubject:
                _revision.Subject = _module.ReEncodeCommitMessage(data, _revision.MessageEncoding);
                break;

            case ReadStep.CommitBody:
                _revision.Body = _module.ReEncodeCommitMessage(data, _revision.MessageEncoding);
                break;

            case ReadStep.FileName:
                if (!string.IsNullOrEmpty(data))
                {
                    // Git adds \n between the format string (ends with \0 in our case)
                    // and the first file name. So, we need to remove it from the file name.
                    _revision.Name = data.TrimStart(new char[] { '\n' });
                }
                break;
            }

            _nextStep++;
        }
Ejemplo n.º 20
0
 void finishRevision()
 {
     if (revision != null)
     {
         if (revision.Name == null)
             revision.Name = previousFileName;
         else
             previousFileName = revision.Name;
     }
     if (revision == null || revision.Guid.Trim(hexChars).Length == 0)
     {
         if ((revision == null) || (InMemFilter == null) || InMemFilter.PassThru(revision))
         {
             if (revision != null)
                 RevisionCount++;
             if (Updated != null)
                 Updated(this, new RevisionGraphUpdatedEventArgs(revision));
         }
     }
     nextStep = ReadStep.Commit;
 }
Ejemplo n.º 21
0
        private void ProccessGitLog(CancellationToken taskState)
        {
            RevisionCount = 0;
            if (Updated != null)
            {
                Updated(this, new RevisionGraphUpdatedEventArgs(null));
            }
            _refs = GetRefs().ToDictionaryOfList(head => head.Guid);

            const string shaOnlyFormat =
                /* <COMMIT>       */ CommitBegin + "%n" +
                /* Hash           */ "%H%n" +
                /* Parents        */ "%P%n";

            const string fullFormat =
                shaOnlyFormat +
                /* Tree                    */ "%T%n" +
                /* Author Name             */ "%aN%n" +
                /* Author Email            */ "%aE%n" +
                /* Author Date             */ "%at%n" +
                /* Committer Name          */ "%cN%n" +
                /* Committer Email         */ "%cE%n" +
                /* Committer Date          */ "%ct%n" +
                /* Commit message encoding */ "%e%x00" + //there is a bug: git does not recode commit message when format is given
                /* Commit Subject          */ "%s%x00" +
                /* Commit Body             */ "%B%x00";

            // NOTE:
            // when called from FileHistory and FollowRenamesInFileHistory is enabled the "--name-only" argument is set.
            // the filename is the next line after the commit-format defined above.

            var arguments = new StringBuilder("log -z ");

            arguments.AppendFormat(" --pretty=format:\"{0}\"", ShaOnly ? shaOnlyFormat : fullFormat);

            arguments.Append(AppSettings.OrderRevisionByDate ? " --date-order" : " --topo-order");

            if (AppSettings.ShowReflogReferences)
            {
                arguments.Append(" --reflog");
            }

            if (RefsOptions.HasFlag(RefsFiltringOptions.All))
            {
                arguments.Append(" --all");
            }
            else
            {
                if (RefsOptions.HasFlag(RefsFiltringOptions.Branches))
                {
                    if (!string.IsNullOrWhiteSpace(BranchFilter) && BranchFilter.IndexOfAny(ShellGlobCharacters) != -1)
                    {
                        arguments.Append(" --branches=" + BranchFilter);
                    }
                }
                if (RefsOptions.HasFlag(RefsFiltringOptions.Remotes))
                {
                    arguments.Append(" --remotes");
                }
                if (RefsOptions.HasFlag(RefsFiltringOptions.Tags))
                {
                    arguments.Append(" --tags");
                }
            }

            if (RefsOptions.HasFlag(RefsFiltringOptions.Boundary))
            {
                arguments.Append(" --boundary");
            }
            if (RefsOptions.HasFlag(RefsFiltringOptions.ShowGitNotes))
            {
                arguments.Append(" --not --glob=notes --not");
            }
            if (RefsOptions.HasFlag(RefsFiltringOptions.NoMerges))
            {
                arguments.Append(" --no-merges");
            }
            if (RefsOptions.HasFlag(RefsFiltringOptions.FirstParent))
            {
                arguments.Append(" --first-parent");
            }
            if (RefsOptions.HasFlag(RefsFiltringOptions.SimplifyByDecoration))
            {
                arguments.Append(" --simplify-by-decoration");
            }

            arguments.AppendFormat(" {0} -- {1}", RevisionFilter, PathFilter);

            Process p = _module.RunGitCmdDetached(arguments.ToString(), GitModule.LosslessEncoding);

            if (taskState.IsCancellationRequested)
            {
                return;
            }

            _previousFileName = null;
            if (BeginUpdate != null)
            {
                BeginUpdate(this, EventArgs.Empty);
            }

            _nextStep = ReadStep.Commit;
            foreach (string data in ReadDataBlocks(p.StandardOutput))
            {
                if (taskState.IsCancellationRequested)
                {
                    break;
                }

                DataReceived(data);
            }
        }