@@ -10,25 +10,46 @@ namespace GitHub.Unity
10
10
{
11
11
sealed class ApplicationCache : ScriptObjectSingleton < ApplicationCache >
12
12
{
13
- [ NonSerialized ] private bool ? val ;
14
13
[ SerializeField ] private bool firstRun = true ;
14
+ [ SerializeField ] public string firstRunAtString ;
15
+ [ NonSerialized ] private bool ? firstRunValue ;
16
+ [ NonSerialized ] public DateTimeOffset ? firstRunAtValue ;
15
17
16
18
public bool FirstRun
17
19
{
18
20
get
19
21
{
20
- if ( ! val . HasValue )
22
+ if ( ! firstRunValue . HasValue )
21
23
{
22
- val = firstRun ;
24
+ firstRunValue = firstRun ;
23
25
}
24
26
25
27
if ( firstRun )
26
28
{
27
29
firstRun = false ;
30
+ FirstRunAt = DateTimeOffset . Now ;
28
31
Save ( true ) ;
29
32
}
30
33
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 ;
32
53
}
33
54
}
34
55
}
@@ -89,23 +110,35 @@ public IEnvironment Environment
89
110
90
111
abstract class ManagedCacheBase < T > : ScriptObjectSingleton < T > where T : ScriptableObject , IManagedCache
91
112
{
92
- private static readonly TimeSpan DataTimeout = TimeSpan . MaxValue ;
113
+ private static readonly TimeSpan DataTimeout = TimeSpan . FromMinutes ( 1 ) ;
93
114
94
115
[ NonSerialized ] private DateTimeOffset ? lastUpdatedAtValue ;
95
-
96
116
[ NonSerialized ] private DateTimeOffset ? lastVerifiedAtValue ;
117
+ [ NonSerialized ] private DateTimeOffset ? firstInitializedAtValue ;
118
+ [ NonSerialized ] private readonly bool invalidOnFirstRun ;
97
119
98
120
public event Action CacheInvalidated ;
99
121
public event Action < DateTimeOffset > CacheUpdated ;
100
122
101
- protected ManagedCacheBase ( )
123
+ protected ManagedCacheBase ( bool invalidOnFirstRun )
102
124
{
125
+ this . invalidOnFirstRun = invalidOnFirstRun ;
103
126
Logger = Logging . GetLogger ( GetType ( ) ) ;
104
127
}
105
128
106
129
public void ValidateData ( )
107
130
{
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 )
109
142
{
110
143
InvalidateData ( ) ;
111
144
}
@@ -141,6 +174,7 @@ protected void SaveData(DateTimeOffset now, bool isUpdated)
141
174
142
175
public abstract string LastUpdatedAtString { get ; protected set ; }
143
176
public abstract string LastVerifiedAtString { get ; protected set ; }
177
+ public abstract string FirstInitializedAtString { get ; protected set ; }
144
178
145
179
public DateTimeOffset LastUpdatedAt
146
180
{
@@ -178,6 +212,24 @@ public DateTimeOffset LastVerifiedAt
178
212
}
179
213
}
180
214
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
+
181
233
protected ILogging Logger { get ; private set ; }
182
234
}
183
235
@@ -417,9 +469,13 @@ sealed class RepositoryInfoCache : ManagedCacheBase<RepositoryInfoCache>, IRepos
417
469
{
418
470
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
419
471
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
472
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
420
473
[ SerializeField ] private GitRemote gitRemote ;
421
474
[ SerializeField ] private GitBranch gitBranch ;
422
475
476
+ public RepositoryInfoCache ( ) : base ( false )
477
+ { }
478
+
423
479
public GitRemote ? CurrentGitRemote
424
480
{
425
481
get
@@ -479,6 +535,12 @@ public override string LastVerifiedAtString
479
535
get { return lastVerifiedAtString ; }
480
536
protected set { lastVerifiedAtString = value ; }
481
537
}
538
+
539
+ public override string FirstInitializedAtString
540
+ {
541
+ get { return firstInitializedAtString ; }
542
+ protected set { firstInitializedAtString = value ; }
543
+ }
482
544
}
483
545
484
546
[ Location ( "cache/branches.yaml" , LocationAttribute . Location . LibraryFolder ) ]
@@ -489,6 +551,7 @@ sealed class BranchCache : ManagedCacheBase<BranchCache>, IBranchCache
489
551
490
552
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
491
553
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
554
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
492
555
493
556
[ SerializeField ] private ConfigBranch gitConfigBranch ;
494
557
[ SerializeField ] private ConfigRemote gitConfigRemote ;
@@ -501,6 +564,9 @@ sealed class BranchCache : ManagedCacheBase<BranchCache>, IBranchCache
501
564
[ SerializeField ] private RemoteConfigBranchDictionary remoteConfigBranches = new RemoteConfigBranchDictionary ( ) ;
502
565
[ SerializeField ] private ConfigRemoteDictionary configRemotes = new ConfigRemoteDictionary ( ) ;
503
566
567
+ public BranchCache ( ) : base ( false )
568
+ { }
569
+
504
570
public ConfigRemote ? CurrentConfigRemote
505
571
{
506
572
get
@@ -740,32 +806,24 @@ public override string LastVerifiedAtString
740
806
get { return lastVerifiedAtString ; }
741
807
protected set { lastVerifiedAtString = value ; }
742
808
}
809
+
810
+ public override string FirstInitializedAtString
811
+ {
812
+ get { return firstInitializedAtString ; }
813
+ protected set { firstInitializedAtString = value ; }
814
+ }
743
815
}
744
816
745
817
[ Location ( "cache/gitlog.yaml" , LocationAttribute . Location . LibraryFolder ) ]
746
818
sealed class GitLogCache : ManagedCacheBase < GitLogCache > , IGitLogCache
747
819
{
748
820
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
749
821
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
822
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
750
823
[ SerializeField ] private List < GitLogEntry > log = new List < GitLogEntry > ( ) ;
751
824
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
+ { }
769
827
770
828
public List < GitLogEntry > Log
771
829
{
@@ -802,30 +860,24 @@ public override string LastVerifiedAtString
802
860
get { return lastVerifiedAtString ; }
803
861
protected set { lastVerifiedAtString = value ; }
804
862
}
863
+
864
+ public override string FirstInitializedAtString
865
+ {
866
+ get { return firstInitializedAtString ; }
867
+ protected set { firstInitializedAtString = value ; }
868
+ }
805
869
}
806
870
807
871
[ Location ( "cache/gitstatus.yaml" , LocationAttribute . Location . LibraryFolder ) ]
808
872
sealed class GitStatusCache : ManagedCacheBase < GitStatusCache > , IGitStatusCache
809
873
{
810
874
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
811
875
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
876
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
812
877
[ SerializeField ] private GitStatus status ;
813
878
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
+ { }
829
881
830
882
public GitStatus GitStatus
831
883
{
@@ -862,15 +914,25 @@ public override string LastVerifiedAtString
862
914
get { return lastVerifiedAtString ; }
863
915
protected set { lastVerifiedAtString = value ; }
864
916
}
917
+
918
+ public override string FirstInitializedAtString
919
+ {
920
+ get { return firstInitializedAtString ; }
921
+ protected set { firstInitializedAtString = value ; }
922
+ }
865
923
}
866
924
867
925
[ Location ( "cache/gitlocks.yaml" , LocationAttribute . Location . LibraryFolder ) ]
868
926
sealed class GitLocksCache : ManagedCacheBase < GitLocksCache > , IGitLocksCache
869
927
{
870
928
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
871
929
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
930
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
872
931
[ SerializeField ] private List < GitLock > gitLocks = new List < GitLock > ( ) ;
873
932
933
+ public GitLocksCache ( ) : base ( true )
934
+ { }
935
+
874
936
public List < GitLock > GitLocks
875
937
{
876
938
get
@@ -906,30 +968,24 @@ public override string LastVerifiedAtString
906
968
get { return lastVerifiedAtString ; }
907
969
protected set { lastVerifiedAtString = value ; }
908
970
}
971
+
972
+ public override string FirstInitializedAtString
973
+ {
974
+ get { return firstInitializedAtString ; }
975
+ protected set { firstInitializedAtString = value ; }
976
+ }
909
977
}
910
978
911
979
[ Location ( "cache/gituser.yaml" , LocationAttribute . Location . LibraryFolder ) ]
912
980
sealed class GitUserCache : ManagedCacheBase < GitUserCache > , IGitUserCache
913
981
{
914
982
[ SerializeField ] private string lastUpdatedAtString = DateTimeOffset . MinValue . ToString ( ) ;
915
983
[ SerializeField ] private string lastVerifiedAtString = DateTimeOffset . MinValue . ToString ( ) ;
984
+ [ SerializeField ] private string firstInitializedAtString = DateTimeOffset . MinValue . ToString ( ) ;
916
985
[ SerializeField ] private User user ;
917
986
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
+ { }
933
989
934
990
public User User
935
991
{
@@ -938,6 +994,21 @@ public User User
938
994
ValidateData ( ) ;
939
995
return user ;
940
996
}
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
+ }
941
1012
}
942
1013
943
1014
public override string LastUpdatedAtString
@@ -951,5 +1022,11 @@ public override string LastVerifiedAtString
951
1022
get { return lastVerifiedAtString ; }
952
1023
protected set { lastVerifiedAtString = value ; }
953
1024
}
1025
+
1026
+ public override string FirstInitializedAtString
1027
+ {
1028
+ get { return firstInitializedAtString ; }
1029
+ protected set { firstInitializedAtString = value ; }
1030
+ }
954
1031
}
955
1032
}
0 commit comments