Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 72c1551

Browse files
committed
Reduce amount of cache events even more
1 parent 389020d commit 72c1551

File tree

7 files changed

+48
-77
lines changed

7 files changed

+48
-77
lines changed

src/GitHub.Api/Cache/CacheInterfaces.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,18 @@ public interface IBranchCache : IManagedCache
9999
void SetLocals(Dictionary<string, ConfigBranch> branchDictionary);
100100
}
101101

102-
public interface IRepositoryInfoCache : IManagedCache, ICanUpdate<IRepositoryInfoCache>
102+
public interface IRepositoryInfoCacheData
103103
{
104104
GitRemote? CurrentGitRemote { get; }
105105
GitBranch? CurrentGitBranch { get; }
106106
ConfigRemote? CurrentConfigRemote { get; }
107107
ConfigBranch? CurrentConfigBranch { get; }
108108
}
109109

110+
public interface IRepositoryInfoCache : IManagedCache, IRepositoryInfoCacheData, ICanUpdate<IRepositoryInfoCacheData>
111+
{
112+
}
113+
110114
public interface IGitLogCache : IManagedCache
111115
{
112116
List<GitLogEntry> Log { get; set; }

src/GitHub.Api/Cache/CachingClasses.cs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,11 @@
88

99
namespace GitHub.Unity
1010
{
11-
class DataCache : IManagedCache
11+
sealed class RepositoryInfoCacheData : IRepositoryInfoCacheData
1212
{
13-
public DataCache(CacheType cacheType)
14-
{
15-
CacheType = cacheType;
16-
}
17-
public CacheType CacheType { get; }
18-
19-
public DateTimeOffset LastUpdatedAt { get; }
20-
21-
public event Action CacheInvalidated;
22-
public event Action<DateTimeOffset> CacheUpdated;
23-
24-
public void InvalidateData()
25-
{
26-
}
27-
28-
public bool ValidateData() => true;
29-
}
30-
31-
sealed class DataCache_RepositoryInfo : DataCache, IRepositoryInfoCache
32-
{
33-
public DataCache_RepositoryInfo() : base(CacheType.RepositoryInfo)
34-
{ }
35-
36-
public void UpdateData(IRepositoryInfoCache data)
37-
{
38-
}
39-
4013
public GitRemote? CurrentGitRemote { get; set; }
4114
public GitBranch? CurrentGitBranch { get; set; }
42-
4315
public ConfigRemote? CurrentConfigRemote { get; set; }
44-
4516
public ConfigBranch? CurrentConfigBranch { get; set; }
46-
47-
public TimeSpan DataTimeout { get { return TimeSpan.FromDays(1); } }
4817
}
4918
}

src/GitHub.Api/Git/Repository.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,15 +211,19 @@ private void RepositoryManagerOnCurrentBranchUpdated(ConfigBranch? branch, Confi
211211
{
212212
taskManager.RunInUI(() =>
213213
{
214-
var data = new DataCache_RepositoryInfo();
214+
var data = new RepositoryInfoCacheData();
215215
data.CurrentConfigBranch = branch;
216-
data.CurrentGitBranch = branch.HasValue ? (GitBranch?)GetLocalGitBranch(branch.Value) : null;
216+
data.CurrentGitBranch = branch.HasValue ? (GitBranch?)GetLocalGitBranch(branch.Value.name, branch.Value) : null;
217217
data.CurrentConfigRemote = remote;
218218
data.CurrentGitRemote = remote.HasValue ? (GitRemote?)GetGitRemote(remote.Value) : null;
219219
name = null;
220220
cloneUrl = null;
221221
cacheContainer.RepositoryInfoCache.UpdateData(data);
222222
var n = Name; // force refresh of the Name and CloneUrl property
223+
// update active state in local branches
224+
cacheContainer.BranchCache.LocalBranches = LocalConfigBranches;
225+
// update tracking state in remote branches
226+
cacheContainer.BranchCache.RemoteBranches = RemoteConfigBranches;
223227
});
224228
}
225229

@@ -270,11 +274,11 @@ private void RepositoryManagerOnLocalBranchesUpdated(Dictionary<string, ConfigBr
270274
});
271275
}
272276

273-
private GitBranch GetLocalGitBranch(ConfigBranch x)
277+
private static GitBranch GetLocalGitBranch(string currentBranchName, ConfigBranch x)
274278
{
275279
var branchName = x.Name;
276280
var trackingName = x.IsTracking ? x.Remote.Value.Name + "/" + branchName : "[None]";
277-
var isActive = branchName == CurrentBranchName;
281+
var isActive = branchName == currentBranchName;
278282
return new GitBranch(branchName, trackingName, isActive);
279283
}
280284

@@ -346,7 +350,7 @@ public string Name
346350

347351
private GitBranch[] RemoteConfigBranches => cacheContainer.BranchCache.RemoteConfigBranches.Values.SelectMany(x => x.Values).Select(GetRemoteGitBranch).ToArray();
348352
private GitRemote[] ConfigRemotes => cacheContainer.BranchCache.ConfigRemotes.Values.Select(GetGitRemote).ToArray();
349-
private GitBranch[] LocalConfigBranches => cacheContainer.BranchCache.LocalConfigBranches.Values.Select(GetLocalGitBranch).ToArray();
353+
private GitBranch[] LocalConfigBranches => cacheContainer.BranchCache.LocalConfigBranches.Values.Select(x => GetLocalGitBranch(CurrentBranchName, x)).ToArray();
350354
}
351355

352356
public interface IUser

src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,6 @@
1010

1111
namespace GitHub.Unity
1212
{
13-
[Serializable]
14-
public class SerializationException : Exception
15-
{
16-
public SerializationException() : base()
17-
{ }
18-
public SerializationException(string message) : base(message)
19-
{ }
20-
public SerializationException(string message, Exception innerException) : base(message, innerException)
21-
{ }
22-
protected SerializationException(SerializationInfo info, StreamingContext context) : base(info, context)
23-
{ }
24-
}
25-
2613
sealed class ApplicationCache : ScriptObjectSingleton<ApplicationCache>
2714
{
2815
[SerializeField] private bool firstRun = true;
@@ -403,7 +390,7 @@ sealed class RepositoryInfoCache : ManagedCacheBase<RepositoryInfoCache>, IRepos
403390
public RepositoryInfoCache() : base(CacheType.RepositoryInfo)
404391
{ }
405392

406-
public void UpdateData(IRepositoryInfoCache data)
393+
public void UpdateData(IRepositoryInfoCacheData data)
407394
{
408395
var now = DateTimeOffset.Now;
409396
var isUpdated = false;

src/UnityExtension/Assets/Editor/GitHub.Unity/SerializableDictionary.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Runtime.Serialization;
34
using UnityEngine;
45

56
namespace GitHub.Unity

src/tests/IntegrationTests/CachingClasses.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ abstract class ManagedCacheBase<T> : ScriptObjectSingleton<T> where T : class, I
107107
private DateTimeOffset? lastUpdatedAtValue;
108108
private DateTimeOffset? initializedAtValue;
109109

110+
private bool isInvalidating;
111+
110112
public event Action CacheInvalidated;
111113
public event Action<DateTimeOffset> CacheUpdated;
112114

@@ -132,8 +134,12 @@ public bool ValidateData()
132134
public void InvalidateData()
133135
{
134136
Logger.Trace("Invalidate");
135-
LastUpdatedAt = DateTimeOffset.MinValue;
136-
CacheInvalidated.SafeInvoke();
137+
if (!isInvalidating)
138+
{
139+
isInvalidating = true;
140+
LastUpdatedAt = DateTimeOffset.MinValue;
141+
CacheInvalidated.SafeInvoke();
142+
}
137143
}
138144

139145
protected void SaveData(DateTimeOffset now, bool isChanged)
@@ -146,6 +152,8 @@ protected void SaveData(DateTimeOffset now, bool isChanged)
146152

147153
Save(true);
148154

155+
isInvalidating = false;
156+
149157
if (isChanged)
150158
{
151159
Logger.Trace("Updated: {0}", now);
@@ -358,7 +366,7 @@ sealed class RepositoryInfoCache : ManagedCacheBase<RepositoryInfoCache>, IRepos
358366
public RepositoryInfoCache() : base(CacheType.RepositoryInfo)
359367
{ }
360368

361-
public void UpdateData(IRepositoryInfoCache data)
369+
public void UpdateData(IRepositoryInfoCacheData data)
362370
{
363371
var now = DateTimeOffset.Now;
364372
var isUpdated = false;

src/tests/IntegrationTests/Events/RepositoryManagerTests.cs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,16 @@ await RepositoryManager
193193

194194
repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
195195
repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
196-
repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
197196
repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
198197

199198
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
200-
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
201-
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
199+
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
200+
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
202201
repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
203202
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
204203
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
205204
repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
206-
repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
205+
repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
207206
}
208207
finally
209208
{
@@ -275,19 +274,18 @@ await RepositoryManager
275274
repositoryManagerEvents.WaitForNotBusy();
276275
StopTrackTimeAndLog(watch, logger);
277276

278-
repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
279277
repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
280278
repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
281279
repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
282280

283281
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
284-
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
285-
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
282+
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
283+
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
286284
repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
287285
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
288286
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
289287
repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
290-
repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
288+
repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
291289
}
292290
finally
293291
{
@@ -411,34 +409,36 @@ public async Task ShouldDetectBranchCreate()
411409
repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
412410

413411
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
414-
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
412+
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
415413
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
416414
repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus);
417415
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
418416
repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs);
419417
repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
420-
repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
418+
repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
421419

422420
repositoryManagerListener.ClearReceivedCalls();
423421
repositoryManagerEvents.Reset();
424422

425423
await RepositoryManager.CreateBranch("feature2/document2", "feature/document").StartAsAsync();
426424
await TaskManager.Wait();
427425

426+
StartTrackTime(watch, logger, "CreateBranch");
428427
RepositoryManager.WaitForEvents();
428+
StopTrackTimeAndLog(watch, logger);
429+
429430
repositoryManagerEvents.WaitForNotBusy();
430431

431432
repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
432-
repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
433433

434434
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
435435
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
436-
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
436+
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
437437
repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus);
438438
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
439-
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
439+
repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs);
440440
repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
441-
repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
441+
repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
442442
}
443443
finally
444444
{
@@ -570,7 +570,7 @@ await RepositoryManager.SwitchBranch("branch2")
570570

571571
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
572572
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
573-
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
573+
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
574574
repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus);
575575
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
576576
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
@@ -609,11 +609,10 @@ public async Task ShouldDetectGitPull()
609609

610610
repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
611611
repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
612-
repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
613612

614613
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
615-
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
616-
repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
614+
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
615+
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
617616
repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
618617
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
619618
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
@@ -651,16 +650,15 @@ public async Task ShouldDetectGitFetch()
651650
repositoryManagerEvents.WaitForNotBusy();
652651

653652
repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
654-
repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
655653
repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue();
656654

657655
repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
658-
repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
656+
repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
659657
repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
660658
repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus);
661659
repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
662-
repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
663-
repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary);
660+
repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs);
661+
repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
664662
repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
665663
}
666664
finally

0 commit comments

Comments
 (0)