diff options
author | Alan McGovern <alan.mcgovern@gmail.com> | 2012-01-18 01:21:37 +0400 |
---|---|---|
committer | Alan McGovern <alan.mcgovern@gmail.com> | 2012-01-18 01:37:21 +0400 |
commit | d9d47b28cac90c86d4d411c5b35208aa57873bd6 (patch) | |
tree | 78778391e1333153b7a78941df2be96216ef32d3 /main/src/addins/VersionControl/MonoDevelop.VersionControl.Git | |
parent | 3c7aaef04a9a469b140e0dab93f0333bb101309b (diff) |
[Git] Improve getting the status of a single file
We can get the status of a single file by using the 'GitStatus'
command and filtering the git tree to the specific files we need.
Fixes bug #2765.
Diffstat (limited to 'main/src/addins/VersionControl/MonoDevelop.VersionControl.Git')
-rw-r--r-- | main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs index b5b7030bb8..4aada9f2a3 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs @@ -50,6 +50,48 @@ using NGit.Treewalk.Filter; namespace MonoDevelop.VersionControl.Git { + class SpecificStatus : NGit.Api.StatusCommand + { + WorkingTreeIterator iter; + IEnumerable<string> Files { + get; set; + } + + public SpecificStatus (NGit.Repository repository) + : base (repository) + { + } + + public SpecificStatus (NGit.Repository repository, IEnumerable<string> files) + : base (repository) + { + Files = files; + } + + public override void SetWorkingTreeIt (WorkingTreeIterator workingTreeIt) + { + iter = workingTreeIt; + } + + public override NGit.Api.Status Call () + { + if (iter == null) + iter = new FileTreeIterator(repo); + + IndexDiff diff = new IndexDiff(repo, Constants.HEAD, iter); + if (Files != null) { + var filters = Files.Select (PathFilter.Create).ToArray (); + if (filters.Length > 1) + diff.SetFilter (OrTreeFilter.Create (filters)); + else + diff.SetFilter (filters [0]); + } + + diff.Diff (); + return new NGit.Api.Status(diff); + } + } + public class RepositoryStatus { private string _root_path; @@ -133,12 +175,38 @@ namespace MonoDevelop.VersionControl.Git MergeConflict = new HashSet<string>(); if (_file_paths != null) - UpdateDirectory (_file_paths, false); + UpdateSingleFiles (_file_paths.ToList ()); else if (_recursive) UpdateDirectory (new string[] { _root_path }, true); else UpdateDirectory (new string[] { _root_path }, false); } + + void UpdateSingleFiles (List<string> singleFiles) + { + var status = new SpecificStatus (Repository, singleFiles).Call (); + + foreach (var v in status.GetAdded ()) + Added.Add (v); + + foreach (var v in status.GetChanged ()) + Modified.Add (v); + + foreach (var v in status.GetConflicting ()) + MergeConflict.Add (v); + + foreach (var v in status.GetMissing ()) + Missing.Add (v); + + foreach (var v in status.GetModified ()) + Modified.Add (v); + + foreach (var v in status.GetRemoved ()) + Removed.Add (v); + + foreach (var v in status.GetUntracked ()) + Untracked.Add (v); + } /// <summary> /// Run the diff operation. Until this is called, all lists will be empty |