From c65e800d2e16212175f3f1c5738483917054181e Mon Sep 17 00:00:00 2001 From: Hylke Bons Date: Sat, 4 Aug 2012 00:21:00 +0200 Subject: [PATCH] Add backend support for listing history of a file and reverting --- SparkleLib/Git/SparkleRepoGit.cs | 100 +++++++++++++++++++++++-------- SparkleLib/SparkleRepoBase.cs | 3 +- 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/SparkleLib/Git/SparkleRepoGit.cs b/SparkleLib/Git/SparkleRepoGit.cs index 02d28d28..230ef8ce 100644 --- a/SparkleLib/Git/SparkleRepoGit.cs +++ b/SparkleLib/Git/SparkleRepoGit.cs @@ -522,22 +522,59 @@ namespace SparkleLib.Git { } - // Returns a list of the latest change sets + public override void RevertFile (string path, string revision) + { + if (path == null) + throw new ArgumentNullException ("path"); + + if (revision == null) + throw new ArgumentNullException ("revision"); + + SparkleGit git = new SparkleGit (LocalPath, "checkout " + revision + " \"" + path + "\""); + git.StartAndWaitForExit (); + + if (git.ExitCode == 0) + SparkleLogger.LogInfo ("Git", Name + " | Checked out \"" + path + "\" (" + revision + ")"); + else + SparkleLogger.LogInfo ("Git", Name + " | Failed to check out \"" + path + "\" (" + revision + ")"); + } + + + public override List GetChangeSets (string path, int count) + { + return GetChangeSetsInternal (path, count); + } + + public override List GetChangeSets (int count) + { + return GetChangeSetsInternal (null, count); + } + + + private List GetChangeSetsInternal (string path, int count) { if (count < 1) - count = 30; + throw new ArgumentOutOfRangeException ("count"); count = 150; List change_sets = new List (); - SparkleGit git_log = new SparkleGit (LocalPath, "log -" + count + - " --raw --find-renames --date=iso --format=medium --no-color --no-merges"); + SparkleGit git; - string output = git_log.StartAndReadStandardOutput (); + if (path == null) { + git = new SparkleGit (LocalPath, "log -" + count + " --raw --find-renames --date=iso " + + "--format=medium --no-color --no-merges"); - string [] lines = output.Split ("\n".ToCharArray ()); - List entries = new List (); + } else { + git = new SparkleGit (LocalPath, "log -" + count + " --raw --find-renames --date=iso " + + "--format=medium --no-color --no-merges -- " + path); + } + + string output = git.StartAndReadStandardOutput (); + + string [] lines = output.Split ("\n".ToCharArray ()); + List entries = new List (); int line_number = 0; bool first_pass = true; @@ -641,7 +678,7 @@ namespace SparkleLib.Git { change_type = SparkleChangeType.Edited; } else if (type_letter.Equals ("D")) { - change_type = SparkleChangeType.Deleted; + change_type = SparkleChangeType.Deleted; } change_set.Changes.Add ( @@ -655,33 +692,46 @@ namespace SparkleLib.Git { } } - if (change_set.Changes.Count > 0) { - if (change_sets.Count > 0) { - SparkleChangeSet last_change_set = change_sets [change_sets.Count - 1]; + if (change_sets.Count > 0 && path == null) { + SparkleChangeSet last_change_set = change_sets [change_sets.Count - 1]; - if (change_set.Timestamp.Year == last_change_set.Timestamp.Year && - change_set.Timestamp.Month == last_change_set.Timestamp.Month && - change_set.Timestamp.Day == last_change_set.Timestamp.Day && - change_set.User.Name.Equals (last_change_set.User.Name)) { + if (change_set.Timestamp.Year == last_change_set.Timestamp.Year && + change_set.Timestamp.Month == last_change_set.Timestamp.Month && + change_set.Timestamp.Day == last_change_set.Timestamp.Day && + change_set.User.Name.Equals (last_change_set.User.Name)) { - last_change_set.Changes.AddRange (change_set.Changes); + last_change_set.Changes.AddRange (change_set.Changes); - if (DateTime.Compare (last_change_set.Timestamp, change_set.Timestamp) < 1) { - last_change_set.FirstTimestamp = last_change_set.Timestamp; - last_change_set.Timestamp = change_set.Timestamp; - last_change_set.Revision = change_set.Revision; - - } else { - last_change_set.FirstTimestamp = change_set.Timestamp; - } + if (DateTime.Compare (last_change_set.Timestamp, change_set.Timestamp) < 1) { + last_change_set.FirstTimestamp = last_change_set.Timestamp; + last_change_set.Timestamp = change_set.Timestamp; + last_change_set.Revision = change_set.Revision; } else { - change_sets.Add (change_set); + last_change_set.FirstTimestamp = change_set.Timestamp; } } else { change_sets.Add (change_set); } + + } else { + if (path != null) { + bool skip_change_set = false;; + + foreach (SparkleChange change in change_set.Changes) { + if ((change.Type == SparkleChangeType.Deleted || + change.Type == SparkleChangeType.Moved) && change.Path.Equals (path)) { + + skip_change_set = true; + } + } + + if (skip_change_set) + continue; + } + + change_sets.Add (change_set); } } } diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index 063a6dd9..8fc39214 100755 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -46,7 +46,8 @@ namespace SparkleLib { public abstract bool SyncUp (); public abstract bool SyncDown (); public abstract List GetChangeSets (int count); - + public abstract List GetChangeSets (string path, int count); + public abstract void RevertFile (string path, string revision); public event SyncStatusChangedEventHandler SyncStatusChanged = delegate { }; public delegate void SyncStatusChangedEventHandler (SyncStatus new_status);