protected override bool RunInternal(object options) { DiffVersionsVerbOptions localOptions = options as DiffVersionsVerbOptions; Printer.EnableDiagnostics = localOptions.Verbose; Objects.Version baseVersion = null; Objects.Version compareVersion = null; if (localOptions.Versions.Count == 0) { Printer.PrintError("Must specify a version or branch to compare to"); return(false); } else if (localOptions.Versions.Count == 1) { if (Workspace.HasStagedModifications) { Printer.PrintError("Cannot compare current workspace while there are staged modifications"); return(false); } baseVersion = Workspace.Version; compareVersion = GetVersionByName(localOptions.Versions[0]); } else if (localOptions.Versions.Count == 2) { baseVersion = GetVersionByName(localOptions.Versions[0]); compareVersion = GetVersionByName(localOptions.Versions[1]); } else { Printer.PrintError("Too many versions specified"); return(false); } if (baseVersion == null || compareVersion == null) { return(false); } CompareVersions(baseVersion, compareVersion, localOptions); return(true); }
public void CompareVersions(Objects.Version baseVersion, Objects.Version compareVersion, DiffVersionsVerbOptions localOptions) { var baseRecords = Workspace.GetRecords(baseVersion); var compareRecords = Workspace.GetRecords(compareVersion); // List additions var added = new HashSet <Objects.Record>(compareRecords, RecordPathComparer.Instance); added.ExceptWith(baseRecords); Report("Add", added.ToList()); // List deletions var deleted = new HashSet <Objects.Record>(baseRecords, RecordPathComparer.Instance); deleted.ExceptWith(compareRecords); Report("Delete", deleted.ToList()); // Check for modifications var compareLookup = new Dictionary <string, Objects.Record>(); foreach (var record in compareRecords) { compareLookup[record.CanonicalName] = record; } var modified = new List <Objects.Record>(); foreach (var baseRecord in baseRecords) { Objects.Record compareRecord; if (!compareLookup.TryGetValue(baseRecord.CanonicalName, out compareRecord)) { continue; } if (compareRecord.Fingerprint != baseRecord.Fingerprint) { modified.Add(compareRecord); } } Report("Modify", modified); }