From 7b48c3e12f7ed94243bef59278f3f3e4ef463efb Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 18 Jan 2012 17:50:19 +0000 Subject: [VersionControl] Add a faster way of generating diffs for the status view The old code used to walk the entire solution to gather all the VersionInfo objects for changed files. It would then walk the entire filesystem a second time as soon as you expanded one of hte diffs so you could view it. We can completely remove the second walk by simply re-using the versioninfo objects we gathered during the first pass, typically only a few seconds previously. This means that diffs show up near instantly on large projects instead of having a large delay as the entire filesystem is probed again. --- .../GitRepository.cs | 38 +++++++++++++--------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'main/src/addins/VersionControl/MonoDevelop.VersionControl.Git') diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index f9bb1b5ca4..2b21cd1348 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -802,26 +802,34 @@ namespace MonoDevelop.VersionControl.Git return GetCommitTextContent (c, repositoryPath); } + public override DiffInfo GenerateDiff (FilePath baseLocalPath, VersionInfo vi) + { + try { + if ((vi.Status & VersionStatus.ScheduledAdd) != 0) { + var ctxt = GetFileContent (vi.LocalPath); + return new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (EmptyContent, ctxt)); + } else if ((vi.Status & VersionStatus.ScheduledDelete) != 0) { + var ctxt = GetCommitContent (GetHeadCommit (), vi.LocalPath); + return new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (ctxt, EmptyContent)); + } else if ((vi.Status & VersionStatus.Modified) != 0 || (vi.Status & VersionStatus.Conflicted) != 0) { + var ctxt1 = GetCommitContent (GetHeadCommit (), vi.LocalPath); + var ctxt2 = GetFileContent (vi.LocalPath); + return new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (ctxt1, ctxt2)); + } + } catch (Exception ex) { + LoggingService.LogError ("Could not get diff for file '" + vi.LocalPath + "'", ex); + } + return null; + } + public override DiffInfo[] PathDiff (FilePath baseLocalPath, FilePath[] localPaths, bool remoteDiff) { List diffs = new List (); VersionInfo[] vinfos = GetDirectoryVersionInfo (baseLocalPath, localPaths, false, true); foreach (VersionInfo vi in vinfos) { - try { - if ((vi.Status & VersionStatus.ScheduledAdd) != 0) { - var ctxt = GetFileContent (vi.LocalPath); - diffs.Add (new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (EmptyContent, ctxt))); - } else if ((vi.Status & VersionStatus.ScheduledDelete) != 0) { - var ctxt = GetCommitContent (GetHeadCommit (), vi.LocalPath); - diffs.Add (new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (ctxt, EmptyContent))); - } else if ((vi.Status & VersionStatus.Modified) != 0 || (vi.Status & VersionStatus.Conflicted) != 0) { - var ctxt1 = GetCommitContent (GetHeadCommit (), vi.LocalPath); - var ctxt2 = GetFileContent (vi.LocalPath); - diffs.Add (new DiffInfo (baseLocalPath, vi.LocalPath, GenerateDiff (ctxt1, ctxt2))); - } - } catch (Exception ex) { - LoggingService.LogError ("Could not get diff for file '" + vi.LocalPath + "'", ex); - } + var diff = GenerateDiff (baseLocalPath, vi); + if (diff != null) + diffs.Add (diff); } return diffs.ToArray (); } -- cgit v1.2.3