mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-05 11:05:00 +00:00
enhance: only refresh submodules when it is needed (#1344)
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
parent
44c83ef342
commit
1ee7d1184e
4 changed files with 66 additions and 12 deletions
|
@ -2,6 +2,8 @@
|
||||||
{
|
{
|
||||||
public interface IRepository
|
public interface IRepository
|
||||||
{
|
{
|
||||||
|
bool MayHaveSubmodules();
|
||||||
|
|
||||||
void RefreshBranches();
|
void RefreshBranches();
|
||||||
void RefreshWorktrees();
|
void RefreshWorktrees();
|
||||||
void RefreshTags();
|
void RefreshTags();
|
||||||
|
|
|
@ -107,7 +107,6 @@ namespace SourceGit.Models
|
||||||
{
|
{
|
||||||
_updateBranch = 0;
|
_updateBranch = 0;
|
||||||
_updateWC = 0;
|
_updateWC = 0;
|
||||||
_updateSubmodules = 0;
|
|
||||||
|
|
||||||
if (_updateTags > 0)
|
if (_updateTags > 0)
|
||||||
{
|
{
|
||||||
|
@ -115,10 +114,15 @@ namespace SourceGit.Models
|
||||||
Task.Run(_repo.RefreshTags);
|
Task.Run(_repo.RefreshTags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_updateSubmodules > 0 || _repo.MayHaveSubmodules())
|
||||||
|
{
|
||||||
|
_updateSubmodules = 0;
|
||||||
|
Task.Run(_repo.RefreshSubmodules);
|
||||||
|
}
|
||||||
|
|
||||||
Task.Run(_repo.RefreshBranches);
|
Task.Run(_repo.RefreshBranches);
|
||||||
Task.Run(_repo.RefreshCommits);
|
Task.Run(_repo.RefreshCommits);
|
||||||
Task.Run(_repo.RefreshWorkingCopyChanges);
|
Task.Run(_repo.RefreshWorkingCopyChanges);
|
||||||
Task.Run(_repo.RefreshSubmodules);
|
|
||||||
Task.Run(_repo.RefreshWorktrees);
|
Task.Run(_repo.RefreshWorktrees);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,12 +154,13 @@ namespace SourceGit.Models
|
||||||
|
|
||||||
private void OnRepositoryChanged(object o, FileSystemEventArgs e)
|
private void OnRepositoryChanged(object o, FileSystemEventArgs e)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(e.Name) || e.Name.EndsWith(".lock", StringComparison.Ordinal))
|
if (string.IsNullOrEmpty(e.Name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var name = e.Name.Replace("\\", "/");
|
var name = e.Name.Replace("\\", "/");
|
||||||
|
if (name.Contains("fsmonitor--daemon/", StringComparison.Ordinal) ||
|
||||||
if (name.Contains("fsmonitor--daemon/", StringComparison.Ordinal))
|
name.EndsWith(".lock", StringComparison.Ordinal) ||
|
||||||
|
name.StartsWith("lfs/", StringComparison.Ordinal))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (name.StartsWith("modules", StringComparison.Ordinal))
|
if (name.StartsWith("modules", StringComparison.Ordinal))
|
||||||
|
@ -170,8 +175,8 @@ namespace SourceGit.Models
|
||||||
else if (name.Equals("MERGE_HEAD", StringComparison.Ordinal) ||
|
else if (name.Equals("MERGE_HEAD", StringComparison.Ordinal) ||
|
||||||
name.Equals("AUTO_MERGE", StringComparison.Ordinal))
|
name.Equals("AUTO_MERGE", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
|
if (_repo.MayHaveSubmodules())
|
||||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
|
||||||
}
|
}
|
||||||
else if (name.StartsWith("refs/tags", StringComparison.Ordinal))
|
else if (name.StartsWith("refs/tags", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
|
@ -201,13 +206,12 @@ namespace SourceGit.Models
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var name = e.Name.Replace("\\", "/");
|
var name = e.Name.Replace("\\", "/");
|
||||||
|
|
||||||
if (name.Equals(".git", StringComparison.Ordinal) ||
|
if (name.Equals(".git", StringComparison.Ordinal) ||
|
||||||
name.StartsWith(".git/", StringComparison.Ordinal) ||
|
name.StartsWith(".git/", StringComparison.Ordinal) ||
|
||||||
name.EndsWith("/.git", StringComparison.Ordinal))
|
name.EndsWith("/.git", StringComparison.Ordinal))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (name.StartsWith(".vs/", StringComparison.Ordinal) && name.EndsWith("/.suo", StringComparison.Ordinal))
|
if (name.StartsWith(".vs/", StringComparison.Ordinal))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (name.Equals(".gitmodules", StringComparison.Ordinal))
|
if (name.Equals(".gitmodules", StringComparison.Ordinal))
|
||||||
|
|
|
@ -1093,6 +1093,13 @@ namespace SourceGit.ViewModels
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool MayHaveSubmodules()
|
||||||
|
{
|
||||||
|
var modulesFile = Path.Combine(_fullpath, ".gitmodules");
|
||||||
|
var info = new FileInfo(modulesFile);
|
||||||
|
return info.Exists && info.Length > 20;
|
||||||
|
}
|
||||||
|
|
||||||
public void RefreshBranches()
|
public void RefreshBranches()
|
||||||
{
|
{
|
||||||
var branches = new Commands.QueryBranches(_fullpath).Result(out var localBranchesCount);
|
var branches = new Commands.QueryBranches(_fullpath).Result(out var localBranchesCount);
|
||||||
|
@ -1196,13 +1203,54 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
public void RefreshSubmodules()
|
public void RefreshSubmodules()
|
||||||
{
|
{
|
||||||
|
if (!MayHaveSubmodules())
|
||||||
|
{
|
||||||
|
if (_submodules.Count > 0)
|
||||||
|
{
|
||||||
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
|
{
|
||||||
|
Submodules = [];
|
||||||
|
VisibleSubmodules = BuildVisibleSubmodules();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var submodules = new Commands.QuerySubmodules(_fullpath).Result();
|
var submodules = new Commands.QuerySubmodules(_fullpath).Result();
|
||||||
_watcher?.SetSubmodules(submodules);
|
_watcher?.SetSubmodules(submodules);
|
||||||
|
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
|
{
|
||||||
|
bool hasChanged = _submodules.Count != submodules.Count;
|
||||||
|
if (!hasChanged)
|
||||||
|
{
|
||||||
|
var old = new Dictionary<string, Models.Submodule>();
|
||||||
|
foreach (var module in _submodules)
|
||||||
|
old.Add(module.Path, module);
|
||||||
|
|
||||||
|
foreach (var module in submodules)
|
||||||
|
{
|
||||||
|
if (!old.TryGetValue(module.Path, out var exist))
|
||||||
|
{
|
||||||
|
hasChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasChanged = !exist.SHA.Equals(module.SHA, StringComparison.Ordinal) ||
|
||||||
|
!exist.URL.Equals(module.URL, StringComparison.Ordinal) ||
|
||||||
|
exist.Status != module.Status;
|
||||||
|
|
||||||
|
if (hasChanged)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasChanged)
|
||||||
{
|
{
|
||||||
Submodules = submodules;
|
Submodules = submodules;
|
||||||
VisibleSubmodules = BuildVisibleSubmodules();
|
VisibleSubmodules = BuildVisibleSubmodules();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue