public IAnnotatedFile Annotate(string path, VersionSpec version) { var options = new DiffOptions { Flags = DiffOptionFlags.EnablePreambleHandling | DiffOptionFlags.IgnoreLeadingAndTrailingWhiteSpace | DiffOptionFlags.IgnoreEndOfLineDifference }; PendingChange[] pendingChanges = server.GetWorkspace(path).GetPendingChanges(path); if (pendingChanges.Length >= 2) { throw new InvalidOperationException("Expected at most 1 pending change, but got " + pendingChanges.Length); } Changeset currentChangeset = null; AnnotatedFile annotatedFile; string currentPath; int currentEncoding; if (pendingChanges.Length == 1 && (pendingChanges[0].ChangeType & ChangeType.Edit) != 0) { annotatedFile = new AnnotatedFile(path, pendingChanges[0].Encoding); if (annotatedFile.IsBinary()) { return(annotatedFile); } currentPath = path; currentEncoding = pendingChanges[0].Encoding; } else { annotatedFile = null; currentPath = null; currentEncoding = 0; } using (var historyProvider = new HistoryProvider(server, path, version)) { var done = false; while (!done && historyProvider.Next()) { Changeset previousChangeset = historyProvider.Changeset(); string previousPath = historyProvider.Filename(); int previousEncoding = previousChangeset.Changes[0].Item.Encoding; if (annotatedFile == null) { annotatedFile = new AnnotatedFile(previousPath, previousEncoding); if (annotatedFile.IsBinary()) { return(annotatedFile); } } else if (previousEncoding == -1) { annotatedFile.Apply(currentChangeset); done = true; } else { var diff = Diff(Difference.DiffFiles(currentPath, currentEncoding, previousPath, previousEncoding, options)); done = annotatedFile.ApplyDiff(currentChangeset, diff); } currentChangeset = previousChangeset; currentEncoding = previousEncoding; currentPath = previousPath; } if (annotatedFile != null) { annotatedFile.Apply(currentChangeset); } } return(annotatedFile); }
public IAnnotatedFile Annotate(string path, VersionSpec version) { var options = new DiffOptions(); options.Flags = DiffOptionFlags.EnablePreambleHandling; PendingChange[] pendingChanges = server.GetWorkspace(path).GetPendingChanges(path); if (pendingChanges.Length >= 2) { throw new InvalidOperationException("Expected at most 1 pending change, but got " + pendingChanges.Length); } Changeset currentChangeset = null; AnnotatedFile annotatedFile; string currentPath; int currentEncoding; if (pendingChanges.Length == 1 && (pendingChanges[0].ChangeType & ChangeType.Edit) != 0) { annotatedFile = new AnnotatedFile(path, pendingChanges[0].Encoding); if (annotatedFile.IsBinary()) { return(annotatedFile); } currentPath = path; currentEncoding = pendingChanges[0].Encoding; } else { annotatedFile = null; currentPath = null; currentEncoding = 0; } var history = server.QueryHistory(path, version, 0, RecursionType.None, null, null, version, int.MaxValue, true, false, true, false); using (var historyProvider = new HistoryProvider(server, (IEnumerable <Changeset>)history)) { bool done = false; while (!done && historyProvider.Next()) { Changeset previousChangeset = historyProvider.Changeset(); string previousPath = historyProvider.Filename(); int previousEncoding = previousChangeset.Changes[0].Item.Encoding; if (annotatedFile == null) { annotatedFile = new AnnotatedFile(previousPath, previousEncoding); if (annotatedFile.IsBinary()) { return(annotatedFile); } } else if (previousEncoding == -1) { annotatedFile.Apply(currentChangeset); done = true; } else { var diff = Diff(Difference.DiffFiles(currentPath, currentEncoding, previousPath, previousEncoding, options)); done = annotatedFile.ApplyDiff(currentChangeset, diff); } currentChangeset = previousChangeset; currentEncoding = previousEncoding; currentPath = previousPath; } if (annotatedFile != null) { annotatedFile.Apply(currentChangeset); } } return(annotatedFile); }