private void CreateHeadOnlyCommit(string branch, BranchStreamCollection streams, FileCollection allFiles, string branchMergeFrom) { var headOnlyState = m_headOnlyState[branch]; var commitId = String.Format("headonly-{0}", branch); var commit = new Commit(commitId); var message = String.Format("Adding head-only files to {0}", m_branchRenamer.Process(branch)); foreach (var file in headOnlyState.LiveFiles.OrderBy(i => i, StringComparer.OrdinalIgnoreCase)) { var fileRevision = new FileRevision(allFiles[file], headOnlyState[file], mergepoint: Revision.Empty, time: DateTime.Now, author: "", commitId: commitId); fileRevision.AddMessage(message); commit.Add(fileRevision); } // check for a merge if (branchMergeFrom != null) { Commit mergeSource = streams.Head(branchMergeFrom); if (mergeSource.CommitId.StartsWith("headonly-")) { commit.MergeFrom = mergeSource; // check for deleted files var fileLookup = new HashSet <string>(commit.Select(r => r.File.Name)); foreach (var r in mergeSource) { if (!fileLookup.Contains(r.File.Name)) { var fileRevision = new FileRevision( file: r.File, revision: Revision.Empty, // a bit lazy, but I think we can get away with it mergepoint: Revision.Empty, time: DateTime.Now, author: "", commitId: commitId, isDead: true); fileRevision.AddMessage(message); commit.Add(fileRevision); } } } } if (commit.Any()) { m_log.WriteLine("Added commit {0}", commitId); streams.AppendCommit(commit); } }
/// <summary> /// Parse the log returning a list of the individual commits to the individual files. /// </summary> public IEnumerable <FileRevision> Parse() { var state = State.Start; FileInfo currentFile = null; Revision revision = Revision.Empty; FileRevision commit = null; m_repo = GetCvsRepo(); foreach (var line in m_reader) { switch (state) { case State.Start: if (line.StartsWith("RCS file: ")) { currentFile = new FileInfo(ExtractFileName(line)); m_files.Add(currentFile); state = State.InFileHeader; } break; case State.InFileHeader: if (line == LogSeparator) { state = State.ExpectCommitRevision; } else if (line == "symbolic names:") { state = State.InTags; } break; case State.InTags: if (!line.StartsWith("\t")) { state = State.InFileHeader; } else { var tagMatch = Regex.Match(line, @"^\t(\S+): (\S+)"); if (!tagMatch.Success) { throw MakeParseException("Invalid tag line: '{0}'", line); } var tagName = tagMatch.Groups[1].Value; var tagRevision = Revision.Create(tagMatch.Groups[2].Value); if (tagRevision.IsBranch) { if (m_branchMatcher.Match(tagName)) { currentFile.AddBranchTag(tagName, tagRevision); } else { m_excludedBranches.Add(tagName); } } else { currentFile.AddTag(tagName, tagRevision); } } break; case State.ExpectCommitRevision: if (line.StartsWith("revision ")) { revision = Revision.Create(line.Substring(9)); state = State.ExpectCommitInfo; } else { throw MakeParseException("Expected revision line, found '{0}'", line); } break; case State.ExpectCommitInfo: commit = ParseFields(currentFile, revision, line); state = State.ExpectCommitMessage; break; case State.ExpectCommitMessage: if (line == LogSeparator) { if (commit != null) { yield return(commit); } state = State.ExpectCommitRevision; } else if (line == FileSeparator) { if (commit != null) { yield return(commit); } state = State.Start; } else if (!line.StartsWith("branches: ")) { if (commit != null) { commit.AddMessage(line); } } break; } } }
private void CreateHeadOnlyCommit(string branch, BranchStreamCollection streams, FileCollection allFiles, string branchMergeFrom) { var headOnlyState = m_headOnlyState[branch]; var commitId = String.Format("headonly-{0}", branch); var commit = new Commit(commitId); var message = String.Format("Adding head-only files to {0}", m_branchRenamer.Process(branch)); foreach (var file in headOnlyState.LiveFiles.OrderBy(i => i, StringComparer.OrdinalIgnoreCase)) { var fileRevision = new FileRevision(allFiles[file], headOnlyState[file], mergepoint: Revision.Empty, time: DateTime.Now, author: "", commitId: commitId); fileRevision.AddMessage(message); commit.Add(fileRevision); } // check for a merge if (branchMergeFrom != null) { Commit mergeSource = streams.Head(branchMergeFrom); if (mergeSource.CommitId.StartsWith("headonly-")) { commit.MergeFrom = mergeSource; // check for deleted files var fileLookup = new HashSet<string>(commit.Select(r => r.File.Name)); foreach (var r in mergeSource) { if (!fileLookup.Contains(r.File.Name)) { var fileRevision = new FileRevision( file: r.File, revision: Revision.Empty, // a bit lazy, but I think we can get away with it mergepoint: Revision.Empty, time: DateTime.Now, author: "", commitId: commitId, isDead: true); fileRevision.AddMessage(message); commit.Add(fileRevision); } } } } if (commit.Any()) { m_log.WriteLine("Added commit {0}", commitId); streams.AppendCommit(commit); } }