From d9d47b28cac90c86d4d411c5b35208aa57873bd6 Mon Sep 17 00:00:00 2001 From: Alan McGovern Date: Tue, 17 Jan 2012 21:21:37 +0000 Subject: [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. --- .../RepositoryStatus.cs | 70 +++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'main/src/addins/VersionControl/MonoDevelop.VersionControl.Git') 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 Files { + get; set; + } + + public SpecificStatus (NGit.Repository repository) + : base (repository) + { + } + + public SpecificStatus (NGit.Repository repository, IEnumerable 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(); 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 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); + } /// /// Run the diff operation. Until this is called, all lists will be empty -- cgit v1.2.3