public void Reset(ReadStep Step, int BytesNeed) { Step_ = Step; BytesRead_ = 0; BytesNeed_ = BytesNeed; Buffer_ = new byte[BytesNeed_]; }
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; }
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; }
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++; }
void finishRevision() { lock (revisions) { if (revision == null || revision.Guid.Trim(hexChars).Length == 0) { revisions.Add(revision); Updated(this, new RevisionGraphUpdatedEvent(revision)); } nextStep = ReadStep.Commit; } }
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++; }
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; }
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++; }
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++; }
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++; }
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; } }
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++; }
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++; }
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); } }
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; } } }
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++; }
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); } }
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++; }
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++; }
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; }
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); } }