public IRevisionVersion GetRevisionOfItem(IRevisionVersion maxRevisionVersion, string path) { var relativePath = path.Substring(m_fileSystemPath.Length); Commit maxCommit = maxRevisionVersion.GetCommit(); var fileInGit = maxCommit[relativePath]; if (fileInGit == null) { return new GitRevisionVersion(m_branch.Commits.Last()); // BegginingOfTime; } Commit foundCommit = null; { foreach (var commit in m_repository.Commits) { if (commit.Parents.Count() == 1) { TreeChanges changes = m_repository.Diff.Compare<TreeChanges>(commit.Tree, commit.Parents.Single().Tree); if (HasAnyChanged(changes.Added, relativePath) || HasAnyChanged(changes.Modified, relativePath)) { foundCommit = commit; break; } } } } if (foundCommit == null) { // This is a bug change every thing return new GitRevisionVersion(m_branch.Commits.Last()); // BegginingOfTime; } else { return new GitRevisionVersion(foundCommit); } }
public IEnumerable<IRevision> GetRevisions(IRevisionVersion sourceRevision, IRevisionVersion targetRevision) { HashSet<string> paths = new HashSet<string>(new StringIgnoreCaseEqualityComarer()); Commit minCommit = sourceRevision.GetCommit(); var maxCommit = targetRevision.GetCommit(); if (maxCommit.Equals(minCommit)) { // Nothing Happend return Enumerable.Empty<IRevision>(); } IEnumerable<Commit> allCommits = FindAllCommits(maxCommit, minCommit); List<Commit> affectedCommits = new List<Commit>(); foreach (var currentCommit in allCommits) { int count = currentCommit.Parents.Count(); // We Ignore all merges if (count == 1) { affectedCommits.Add(currentCommit); foreach (var parent in currentCommit.Parents) { TreeChanges changes = m_repository.Diff.Compare<TreeChanges>(currentCommit.Tree, parent.Tree); AddChanges(paths, changes.Added); AddChanges(paths, changes.Deleted); AddChanges(paths, changes.Modified); AddChanges(paths, changes.Renamed); AddChanges(paths, changes.TypeChanged); } } } return paths.Select(p => new GitRevision(p)).ToList(); }