Skip to content

Commit 1ee7d11

Browse files
committed
enhance: only refresh submodules when it is needed (#1344)
Signed-off-by: leo <[email protected]>
1 parent 44c83ef commit 1ee7d11

File tree

4 files changed

+66
-12
lines changed

4 files changed

+66
-12
lines changed

src/Models/IRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
{
33
public interface IRepository
44
{
5+
bool MayHaveSubmodules();
6+
57
void RefreshBranches();
68
void RefreshWorktrees();
79
void RefreshTags();

src/Models/Remote.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static bool IsValidURL(string url)
5050
return true;
5151
}
5252

53-
return url.StartsWith("file://", StringComparison.Ordinal) ||
53+
return url.StartsWith("file://", StringComparison.Ordinal) ||
5454
url.StartsWith("./", StringComparison.Ordinal) ||
5555
url.StartsWith("../", StringComparison.Ordinal) ||
5656
Directory.Exists(url);

src/Models/Watcher.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,22 @@ private void Tick(object sender)
107107
{
108108
_updateBranch = 0;
109109
_updateWC = 0;
110-
_updateSubmodules = 0;
111110

112111
if (_updateTags > 0)
113112
{
114113
_updateTags = 0;
115114
Task.Run(_repo.RefreshTags);
116115
}
117116

117+
if (_updateSubmodules > 0 || _repo.MayHaveSubmodules())
118+
{
119+
_updateSubmodules = 0;
120+
Task.Run(_repo.RefreshSubmodules);
121+
}
122+
118123
Task.Run(_repo.RefreshBranches);
119124
Task.Run(_repo.RefreshCommits);
120125
Task.Run(_repo.RefreshWorkingCopyChanges);
121-
Task.Run(_repo.RefreshSubmodules);
122126
Task.Run(_repo.RefreshWorktrees);
123127
}
124128

@@ -150,12 +154,13 @@ private void Tick(object sender)
150154

151155
private void OnRepositoryChanged(object o, FileSystemEventArgs e)
152156
{
153-
if (string.IsNullOrEmpty(e.Name) || e.Name.EndsWith(".lock", StringComparison.Ordinal))
157+
if (string.IsNullOrEmpty(e.Name))
154158
return;
155159

156160
var name = e.Name.Replace("\\", "/");
157-
158-
if (name.Contains("fsmonitor--daemon/", StringComparison.Ordinal))
161+
if (name.Contains("fsmonitor--daemon/", StringComparison.Ordinal) ||
162+
name.EndsWith(".lock", StringComparison.Ordinal) ||
163+
name.StartsWith("lfs/", StringComparison.Ordinal))
159164
return;
160165

161166
if (name.StartsWith("modules", StringComparison.Ordinal))
@@ -170,8 +175,8 @@ private void OnRepositoryChanged(object o, FileSystemEventArgs e)
170175
else if (name.Equals("MERGE_HEAD", StringComparison.Ordinal) ||
171176
name.Equals("AUTO_MERGE", StringComparison.Ordinal))
172177
{
173-
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
174-
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
178+
if (_repo.MayHaveSubmodules())
179+
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
175180
}
176181
else if (name.StartsWith("refs/tags", StringComparison.Ordinal))
177182
{
@@ -201,13 +206,12 @@ private void OnWorkingCopyChanged(object o, FileSystemEventArgs e)
201206
return;
202207

203208
var name = e.Name.Replace("\\", "/");
204-
205209
if (name.Equals(".git", StringComparison.Ordinal) ||
206210
name.StartsWith(".git/", StringComparison.Ordinal) ||
207211
name.EndsWith("/.git", StringComparison.Ordinal))
208212
return;
209213

210-
if (name.StartsWith(".vs/", StringComparison.Ordinal) && name.EndsWith("/.suo", StringComparison.Ordinal))
214+
if (name.StartsWith(".vs/", StringComparison.Ordinal))
211215
return;
212216

213217
if (name.Equals(".gitmodules", StringComparison.Ordinal))

src/ViewModels/Repository.cs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,13 @@ public void Bisect(string subcmd)
10931093
});
10941094
}
10951095

1096+
public bool MayHaveSubmodules()
1097+
{
1098+
var modulesFile = Path.Combine(_fullpath, ".gitmodules");
1099+
var info = new FileInfo(modulesFile);
1100+
return info.Exists && info.Length > 20;
1101+
}
1102+
10961103
public void RefreshBranches()
10971104
{
10981105
var branches = new Commands.QueryBranches(_fullpath).Result(out var localBranchesCount);
@@ -1196,13 +1203,54 @@ public void RefreshCommits()
11961203

11971204
public void RefreshSubmodules()
11981205
{
1206+
if (!MayHaveSubmodules())
1207+
{
1208+
if (_submodules.Count > 0)
1209+
{
1210+
Dispatcher.UIThread.Invoke(() =>
1211+
{
1212+
Submodules = [];
1213+
VisibleSubmodules = BuildVisibleSubmodules();
1214+
});
1215+
}
1216+
1217+
return;
1218+
}
1219+
11991220
var submodules = new Commands.QuerySubmodules(_fullpath).Result();
12001221
_watcher?.SetSubmodules(submodules);
12011222

12021223
Dispatcher.UIThread.Invoke(() =>
12031224
{
1204-
Submodules = submodules;
1205-
VisibleSubmodules = BuildVisibleSubmodules();
1225+
bool hasChanged = _submodules.Count != submodules.Count;
1226+
if (!hasChanged)
1227+
{
1228+
var old = new Dictionary<string, Models.Submodule>();
1229+
foreach (var module in _submodules)
1230+
old.Add(module.Path, module);
1231+
1232+
foreach (var module in submodules)
1233+
{
1234+
if (!old.TryGetValue(module.Path, out var exist))
1235+
{
1236+
hasChanged = true;
1237+
break;
1238+
}
1239+
1240+
hasChanged = !exist.SHA.Equals(module.SHA, StringComparison.Ordinal) ||
1241+
!exist.URL.Equals(module.URL, StringComparison.Ordinal) ||
1242+
exist.Status != module.Status;
1243+
1244+
if (hasChanged)
1245+
break;
1246+
}
1247+
}
1248+
1249+
if (hasChanged)
1250+
{
1251+
Submodules = submodules;
1252+
VisibleSubmodules = BuildVisibleSubmodules();
1253+
}
12061254
});
12071255
}
12081256

0 commit comments

Comments
 (0)