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

Commit 24c989e

Browse files
Adding functionality to fire cache invalidated events on first run
1 parent ad226dd commit 24c989e

File tree

2 files changed

+135
-60
lines changed

2 files changed

+135
-60
lines changed

src/GitHub.Api/Git/Repository.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ public void Initialize(IRepositoryManager initRepositoryManager)
5858
repositoryManager.OnRemoteBranchAdded += RepositoryManager_OnRemoteBranchAdded;
5959
repositoryManager.OnRemoteBranchRemoved += RepositoryManager_OnRemoteBranchRemoved;
6060
repositoryManager.OnGitUserLoaded += user => User = user;
61-
62-
UpdateGitStatus();
63-
UpdateGitLog();
64-
65-
new ActionTask(CancellationToken.None, UpdateLocks) { Affinity = TaskAffinity.UI }.Start();
6661
}
6762

6863
public ITask SetupRemote(string remote, string remoteUrl)
@@ -318,6 +313,9 @@ private void CacheContainer_OnCacheInvalidated(CacheType cacheType)
318313
case CacheType.GitUserCache:
319314
break;
320315

316+
case CacheType.RepositoryInfoCache:
317+
break;
318+
321319
default:
322320
throw new ArgumentOutOfRangeException(nameof(cacheType), cacheType, null);
323321
}

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

Lines changed: 132 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,46 @@ namespace GitHub.Unity
1010
{
1111
sealed class ApplicationCache : ScriptObjectSingleton<ApplicationCache>
1212
{
13-
[NonSerialized] private bool? val;
1413
[SerializeField] private bool firstRun = true;
14+
[SerializeField] public string firstRunAtString;
15+
[NonSerialized] private bool? firstRunValue;
16+
[NonSerialized] public DateTimeOffset? firstRunAtValue;
1517

1618
public bool FirstRun
1719
{
1820
get
1921
{
20-
if (!val.HasValue)
22+
if (!firstRunValue.HasValue)
2123
{
22-
val = firstRun;
24+
firstRunValue = firstRun;
2325
}
2426

2527
if (firstRun)
2628
{
2729
firstRun = false;
30+
FirstRunAt = DateTimeOffset.Now;
2831
Save(true);
2932
}
3033

31-
return val.Value;
34+
return firstRunValue.Value;
35+
}
36+
}
37+
38+
public DateTimeOffset FirstRunAt
39+
{
40+
get
41+
{
42+
if (!firstRunAtValue.HasValue)
43+
{
44+
firstRunAtValue = DateTimeOffset.Parse(firstRunAtString);
45+
}
46+
47+
return firstRunAtValue.Value;
48+
}
49+
private set
50+
{
51+
firstRunAtString = value.ToString();
52+
firstRunAtValue = null;
3253
}
3354
}
3455
}
@@ -89,23 +110,35 @@ public IEnvironment Environment
89110

90111
abstract class ManagedCacheBase<T> : ScriptObjectSingleton<T> where T : ScriptableObject, IManagedCache
91112
{
92-
private static readonly TimeSpan DataTimeout = TimeSpan.MaxValue;
113+
private static readonly TimeSpan DataTimeout = TimeSpan.FromMinutes(1);
93114

94115
[NonSerialized] private DateTimeOffset? lastUpdatedAtValue;
95-
96116
[NonSerialized] private DateTimeOffset? lastVerifiedAtValue;
117+
[NonSerialized] private DateTimeOffset? firstInitializedAtValue;
118+
[NonSerialized] private readonly bool invalidOnFirstRun;
97119

98120
public event Action CacheInvalidated;
99121
public event Action<DateTimeOffset> CacheUpdated;
100122

101-
protected ManagedCacheBase()
123+
protected ManagedCacheBase(bool invalidOnFirstRun)
102124
{
125+
this.invalidOnFirstRun = invalidOnFirstRun;
103126
Logger = Logging.GetLogger(GetType());
104127
}
105128

106129
public void ValidateData()
107130
{
108-
if (DateTimeOffset.Now - LastUpdatedAt > DataTimeout)
131+
if (ApplicationCache.Instance.FirstRunAt > FirstInitializedAt)
132+
{
133+
FirstInitializedAt = DateTimeOffset.Now;
134+
Save(true);
135+
136+
if (invalidOnFirstRun)
137+
{
138+
InvalidateData();
139+
}
140+
}
141+
else if (DateTimeOffset.Now - LastUpdatedAt > DataTimeout)
109142
{
110143
InvalidateData();
111144
}
@@ -141,6 +174,7 @@ protected void SaveData(DateTimeOffset now, bool isUpdated)
141174

142175
public abstract string LastUpdatedAtString { get; protected set; }
143176
public abstract string LastVerifiedAtString { get; protected set; }
177+
public abstract string FirstInitializedAtString { get; protected set; }
144178

145179
public DateTimeOffset LastUpdatedAt
146180
{
@@ -178,6 +212,24 @@ public DateTimeOffset LastVerifiedAt
178212
}
179213
}
180214

215+
public DateTimeOffset FirstInitializedAt
216+
{
217+
get
218+
{
219+
if (!firstInitializedAtValue.HasValue)
220+
{
221+
firstInitializedAtValue = DateTimeOffset.Parse(FirstInitializedAtString);
222+
}
223+
224+
return firstInitializedAtValue.Value;
225+
}
226+
set
227+
{
228+
FirstInitializedAtString = value.ToString();
229+
firstInitializedAtValue = null;
230+
}
231+
}
232+
181233
protected ILogging Logger { get; private set; }
182234
}
183235

@@ -417,9 +469,13 @@ sealed class RepositoryInfoCache : ManagedCacheBase<RepositoryInfoCache>, IRepos
417469
{
418470
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
419471
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
472+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
420473
[SerializeField] private GitRemote gitRemote;
421474
[SerializeField] private GitBranch gitBranch;
422475

476+
public RepositoryInfoCache() : base(false)
477+
{ }
478+
423479
public GitRemote? CurrentGitRemote
424480
{
425481
get
@@ -479,6 +535,12 @@ public override string LastVerifiedAtString
479535
get { return lastVerifiedAtString; }
480536
protected set { lastVerifiedAtString = value; }
481537
}
538+
539+
public override string FirstInitializedAtString
540+
{
541+
get { return firstInitializedAtString; }
542+
protected set { firstInitializedAtString = value; }
543+
}
482544
}
483545

484546
[Location("cache/branches.yaml", LocationAttribute.Location.LibraryFolder)]
@@ -489,6 +551,7 @@ sealed class BranchCache : ManagedCacheBase<BranchCache>, IBranchCache
489551

490552
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
491553
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
554+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
492555

493556
[SerializeField] private ConfigBranch gitConfigBranch;
494557
[SerializeField] private ConfigRemote gitConfigRemote;
@@ -501,6 +564,9 @@ sealed class BranchCache : ManagedCacheBase<BranchCache>, IBranchCache
501564
[SerializeField] private RemoteConfigBranchDictionary remoteConfigBranches = new RemoteConfigBranchDictionary();
502565
[SerializeField] private ConfigRemoteDictionary configRemotes = new ConfigRemoteDictionary();
503566

567+
public BranchCache() : base(false)
568+
{ }
569+
504570
public ConfigRemote? CurrentConfigRemote
505571
{
506572
get
@@ -740,32 +806,24 @@ public override string LastVerifiedAtString
740806
get { return lastVerifiedAtString; }
741807
protected set { lastVerifiedAtString = value; }
742808
}
809+
810+
public override string FirstInitializedAtString
811+
{
812+
get { return firstInitializedAtString; }
813+
protected set { firstInitializedAtString = value; }
814+
}
743815
}
744816

745817
[Location("cache/gitlog.yaml", LocationAttribute.Location.LibraryFolder)]
746818
sealed class GitLogCache : ManagedCacheBase<GitLogCache>, IGitLogCache
747819
{
748820
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
749821
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
822+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
750823
[SerializeField] private List<GitLogEntry> log = new List<GitLogEntry>();
751824

752-
public void UpdateData(List<GitLogEntry> logUpdate)
753-
{
754-
var now = DateTimeOffset.Now;
755-
var isUpdated = false;
756-
757-
Logger.Trace("Processing Update: {0}", now);
758-
759-
var logIsNull = log == null;
760-
var updateIsNull = logUpdate == null;
761-
if (logIsNull != updateIsNull || !logIsNull && !log.SequenceEqual(logUpdate))
762-
{
763-
log = logUpdate;
764-
isUpdated = true;
765-
}
766-
767-
SaveData(now, isUpdated);
768-
}
825+
public GitLogCache() : base(true)
826+
{ }
769827

770828
public List<GitLogEntry> Log
771829
{
@@ -802,30 +860,24 @@ public override string LastVerifiedAtString
802860
get { return lastVerifiedAtString; }
803861
protected set { lastVerifiedAtString = value; }
804862
}
863+
864+
public override string FirstInitializedAtString
865+
{
866+
get { return firstInitializedAtString; }
867+
protected set { firstInitializedAtString = value; }
868+
}
805869
}
806870

807871
[Location("cache/gitstatus.yaml", LocationAttribute.Location.LibraryFolder)]
808872
sealed class GitStatusCache : ManagedCacheBase<GitStatusCache>, IGitStatusCache
809873
{
810874
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
811875
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
876+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
812877
[SerializeField] private GitStatus status;
813878

814-
public void UpdateData(GitStatus statusUpdate)
815-
{
816-
var now = DateTimeOffset.Now;
817-
var isUpdated = false;
818-
819-
Logger.Trace("Processing Update: {0}", now);
820-
821-
if (!status.Equals(statusUpdate))
822-
{
823-
status = statusUpdate;
824-
isUpdated = true;
825-
}
826-
827-
SaveData(now, isUpdated);
828-
}
879+
public GitStatusCache() : base(true)
880+
{ }
829881

830882
public GitStatus GitStatus
831883
{
@@ -862,15 +914,25 @@ public override string LastVerifiedAtString
862914
get { return lastVerifiedAtString; }
863915
protected set { lastVerifiedAtString = value; }
864916
}
917+
918+
public override string FirstInitializedAtString
919+
{
920+
get { return firstInitializedAtString; }
921+
protected set { firstInitializedAtString = value; }
922+
}
865923
}
866924

867925
[Location("cache/gitlocks.yaml", LocationAttribute.Location.LibraryFolder)]
868926
sealed class GitLocksCache : ManagedCacheBase<GitLocksCache>, IGitLocksCache
869927
{
870928
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
871929
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
930+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
872931
[SerializeField] private List<GitLock> gitLocks = new List<GitLock>();
873932

933+
public GitLocksCache() : base(true)
934+
{ }
935+
874936
public List<GitLock> GitLocks
875937
{
876938
get
@@ -906,30 +968,24 @@ public override string LastVerifiedAtString
906968
get { return lastVerifiedAtString; }
907969
protected set { lastVerifiedAtString = value; }
908970
}
971+
972+
public override string FirstInitializedAtString
973+
{
974+
get { return firstInitializedAtString; }
975+
protected set { firstInitializedAtString = value; }
976+
}
909977
}
910978

911979
[Location("cache/gituser.yaml", LocationAttribute.Location.LibraryFolder)]
912980
sealed class GitUserCache : ManagedCacheBase<GitUserCache>, IGitUserCache
913981
{
914982
[SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString();
915983
[SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString();
984+
[SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString();
916985
[SerializeField] private User user;
917986

918-
public void UpdateData(User userUpdate)
919-
{
920-
var now = DateTimeOffset.Now;
921-
var isUpdated = false;
922-
923-
Logger.Trace("Processing Update: {0}", now);
924-
925-
if (user != userUpdate)
926-
{
927-
user = userUpdate;
928-
isUpdated = true;
929-
}
930-
931-
SaveData(now, isUpdated);
932-
}
987+
public GitUserCache() : base(true)
988+
{ }
933989

934990
public User User
935991
{
@@ -938,6 +994,21 @@ public User User
938994
ValidateData();
939995
return user;
940996
}
997+
set
998+
{
999+
var now = DateTimeOffset.Now;
1000+
var isUpdated = false;
1001+
1002+
Logger.Trace("Updating: {0} user:{1}", now, value);
1003+
1004+
if (!user.Equals(value))
1005+
{
1006+
user = value;
1007+
isUpdated = true;
1008+
}
1009+
1010+
SaveData(now, isUpdated);
1011+
}
9411012
}
9421013

9431014
public override string LastUpdatedAtString
@@ -951,5 +1022,11 @@ public override string LastVerifiedAtString
9511022
get { return lastVerifiedAtString; }
9521023
protected set { lastVerifiedAtString = value; }
9531024
}
1025+
1026+
public override string FirstInitializedAtString
1027+
{
1028+
get { return firstInitializedAtString; }
1029+
protected set { firstInitializedAtString = value; }
1030+
}
9541031
}
9551032
}

0 commit comments

Comments
 (0)