mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-02 01:34:58 +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
|
||||
{
|
||||
bool MayHaveSubmodules();
|
||||
|
||||
void RefreshBranches();
|
||||
void RefreshWorktrees();
|
||||
void RefreshTags();
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace SourceGit.Models
|
|||
return true;
|
||||
}
|
||||
|
||||
return url.StartsWith("file://", StringComparison.Ordinal) ||
|
||||
return url.StartsWith("file://", StringComparison.Ordinal) ||
|
||||
url.StartsWith("./", StringComparison.Ordinal) ||
|
||||
url.StartsWith("../", StringComparison.Ordinal) ||
|
||||
Directory.Exists(url);
|
||||
|
|
|
@ -107,7 +107,6 @@ namespace SourceGit.Models
|
|||
{
|
||||
_updateBranch = 0;
|
||||
_updateWC = 0;
|
||||
_updateSubmodules = 0;
|
||||
|
||||
if (_updateTags > 0)
|
||||
{
|
||||
|
@ -115,10 +114,15 @@ namespace SourceGit.Models
|
|||
Task.Run(_repo.RefreshTags);
|
||||
}
|
||||
|
||||
if (_updateSubmodules > 0 || _repo.MayHaveSubmodules())
|
||||
{
|
||||
_updateSubmodules = 0;
|
||||
Task.Run(_repo.RefreshSubmodules);
|
||||
}
|
||||
|
||||
Task.Run(_repo.RefreshBranches);
|
||||
Task.Run(_repo.RefreshCommits);
|
||||
Task.Run(_repo.RefreshWorkingCopyChanges);
|
||||
Task.Run(_repo.RefreshSubmodules);
|
||||
Task.Run(_repo.RefreshWorktrees);
|
||||
}
|
||||
|
||||
|
@ -150,12 +154,13 @@ namespace SourceGit.Models
|
|||
|
||||
private void OnRepositoryChanged(object o, FileSystemEventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(e.Name) || e.Name.EndsWith(".lock", StringComparison.Ordinal))
|
||||
if (string.IsNullOrEmpty(e.Name))
|
||||
return;
|
||||
|
||||
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;
|
||||
|
||||
if (name.StartsWith("modules", StringComparison.Ordinal))
|
||||
|
@ -170,8 +175,8 @@ namespace SourceGit.Models
|
|||
else if (name.Equals("MERGE_HEAD", StringComparison.Ordinal) ||
|
||||
name.Equals("AUTO_MERGE", StringComparison.Ordinal))
|
||||
{
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
if (_repo.MayHaveSubmodules())
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
}
|
||||
else if (name.StartsWith("refs/tags", StringComparison.Ordinal))
|
||||
{
|
||||
|
@ -201,13 +206,12 @@ namespace SourceGit.Models
|
|||
return;
|
||||
|
||||
var name = e.Name.Replace("\\", "/");
|
||||
|
||||
if (name.Equals(".git", StringComparison.Ordinal) ||
|
||||
name.StartsWith(".git/", StringComparison.Ordinal) ||
|
||||
name.EndsWith("/.git", StringComparison.Ordinal))
|
||||
return;
|
||||
|
||||
if (name.StartsWith(".vs/", StringComparison.Ordinal) && name.EndsWith("/.suo", StringComparison.Ordinal))
|
||||
if (name.StartsWith(".vs/", StringComparison.Ordinal))
|
||||
return;
|
||||
|
||||
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()
|
||||
{
|
||||
var branches = new Commands.QueryBranches(_fullpath).Result(out var localBranchesCount);
|
||||
|
@ -1196,13 +1203,54 @@ namespace SourceGit.ViewModels
|
|||
|
||||
public void RefreshSubmodules()
|
||||
{
|
||||
if (!MayHaveSubmodules())
|
||||
{
|
||||
if (_submodules.Count > 0)
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
Submodules = [];
|
||||
VisibleSubmodules = BuildVisibleSubmodules();
|
||||
});
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var submodules = new Commands.QuerySubmodules(_fullpath).Result();
|
||||
_watcher?.SetSubmodules(submodules);
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
Submodules = submodules;
|
||||
VisibleSubmodules = BuildVisibleSubmodules();
|
||||
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;
|
||||
VisibleSubmodules = BuildVisibleSubmodules();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue