From 24c989efef77dc46ec7b09bd977aeafda9d2a408 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 15:49:17 -0500 Subject: [PATCH 01/10] Adding functionality to fire cache invalidated events on first run --- src/GitHub.Api/Git/Repository.cs | 8 +- .../Editor/GitHub.Unity/ApplicationCache.cs | 187 ++++++++++++------ 2 files changed, 135 insertions(+), 60 deletions(-) diff --git a/src/GitHub.Api/Git/Repository.cs b/src/GitHub.Api/Git/Repository.cs index daadaacda..793fb28df 100644 --- a/src/GitHub.Api/Git/Repository.cs +++ b/src/GitHub.Api/Git/Repository.cs @@ -58,11 +58,6 @@ public void Initialize(IRepositoryManager initRepositoryManager) repositoryManager.OnRemoteBranchAdded += RepositoryManager_OnRemoteBranchAdded; repositoryManager.OnRemoteBranchRemoved += RepositoryManager_OnRemoteBranchRemoved; repositoryManager.OnGitUserLoaded += user => User = user; - - UpdateGitStatus(); - UpdateGitLog(); - - new ActionTask(CancellationToken.None, UpdateLocks) { Affinity = TaskAffinity.UI }.Start(); } public ITask SetupRemote(string remote, string remoteUrl) @@ -318,6 +313,9 @@ private void CacheContainer_OnCacheInvalidated(CacheType cacheType) case CacheType.GitUserCache: break; + case CacheType.RepositoryInfoCache: + break; + default: throw new ArgumentOutOfRangeException(nameof(cacheType), cacheType, null); } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 55c9ffd38..9f8f66c88 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -10,25 +10,46 @@ namespace GitHub.Unity { sealed class ApplicationCache : ScriptObjectSingleton { - [NonSerialized] private bool? val; [SerializeField] private bool firstRun = true; + [SerializeField] public string firstRunAtString; + [NonSerialized] private bool? firstRunValue; + [NonSerialized] public DateTimeOffset? firstRunAtValue; public bool FirstRun { get { - if (!val.HasValue) + if (!firstRunValue.HasValue) { - val = firstRun; + firstRunValue = firstRun; } if (firstRun) { firstRun = false; + FirstRunAt = DateTimeOffset.Now; Save(true); } - return val.Value; + return firstRunValue.Value; + } + } + + public DateTimeOffset FirstRunAt + { + get + { + if (!firstRunAtValue.HasValue) + { + firstRunAtValue = DateTimeOffset.Parse(firstRunAtString); + } + + return firstRunAtValue.Value; + } + private set + { + firstRunAtString = value.ToString(); + firstRunAtValue = null; } } } @@ -89,23 +110,35 @@ public IEnvironment Environment abstract class ManagedCacheBase : ScriptObjectSingleton where T : ScriptableObject, IManagedCache { - private static readonly TimeSpan DataTimeout = TimeSpan.MaxValue; + private static readonly TimeSpan DataTimeout = TimeSpan.FromMinutes(1); [NonSerialized] private DateTimeOffset? lastUpdatedAtValue; - [NonSerialized] private DateTimeOffset? lastVerifiedAtValue; + [NonSerialized] private DateTimeOffset? firstInitializedAtValue; + [NonSerialized] private readonly bool invalidOnFirstRun; public event Action CacheInvalidated; public event Action CacheUpdated; - protected ManagedCacheBase() + protected ManagedCacheBase(bool invalidOnFirstRun) { + this.invalidOnFirstRun = invalidOnFirstRun; Logger = Logging.GetLogger(GetType()); } public void ValidateData() { - if (DateTimeOffset.Now - LastUpdatedAt > DataTimeout) + if (ApplicationCache.Instance.FirstRunAt > FirstInitializedAt) + { + FirstInitializedAt = DateTimeOffset.Now; + Save(true); + + if (invalidOnFirstRun) + { + InvalidateData(); + } + } + else if (DateTimeOffset.Now - LastUpdatedAt > DataTimeout) { InvalidateData(); } @@ -141,6 +174,7 @@ protected void SaveData(DateTimeOffset now, bool isUpdated) public abstract string LastUpdatedAtString { get; protected set; } public abstract string LastVerifiedAtString { get; protected set; } + public abstract string FirstInitializedAtString { get; protected set; } public DateTimeOffset LastUpdatedAt { @@ -178,6 +212,24 @@ public DateTimeOffset LastVerifiedAt } } + public DateTimeOffset FirstInitializedAt + { + get + { + if (!firstInitializedAtValue.HasValue) + { + firstInitializedAtValue = DateTimeOffset.Parse(FirstInitializedAtString); + } + + return firstInitializedAtValue.Value; + } + set + { + FirstInitializedAtString = value.ToString(); + firstInitializedAtValue = null; + } + } + protected ILogging Logger { get; private set; } } @@ -417,9 +469,13 @@ sealed class RepositoryInfoCache : ManagedCacheBase, IRepos { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private GitRemote gitRemote; [SerializeField] private GitBranch gitBranch; + public RepositoryInfoCache() : base(false) + { } + public GitRemote? CurrentGitRemote { get @@ -479,6 +535,12 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } [Location("cache/branches.yaml", LocationAttribute.Location.LibraryFolder)] @@ -489,6 +551,7 @@ sealed class BranchCache : ManagedCacheBase, IBranchCache [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private ConfigBranch gitConfigBranch; [SerializeField] private ConfigRemote gitConfigRemote; @@ -501,6 +564,9 @@ sealed class BranchCache : ManagedCacheBase, IBranchCache [SerializeField] private RemoteConfigBranchDictionary remoteConfigBranches = new RemoteConfigBranchDictionary(); [SerializeField] private ConfigRemoteDictionary configRemotes = new ConfigRemoteDictionary(); + public BranchCache() : base(false) + { } + public ConfigRemote? CurrentConfigRemote { get @@ -740,6 +806,12 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } [Location("cache/gitlog.yaml", LocationAttribute.Location.LibraryFolder)] @@ -747,25 +819,11 @@ sealed class GitLogCache : ManagedCacheBase, IGitLogCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private List log = new List(); - public void UpdateData(List logUpdate) - { - var now = DateTimeOffset.Now; - var isUpdated = false; - - Logger.Trace("Processing Update: {0}", now); - - var logIsNull = log == null; - var updateIsNull = logUpdate == null; - if (logIsNull != updateIsNull || !logIsNull && !log.SequenceEqual(logUpdate)) - { - log = logUpdate; - isUpdated = true; - } - - SaveData(now, isUpdated); - } + public GitLogCache() : base(true) + { } public List Log { @@ -802,6 +860,12 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } [Location("cache/gitstatus.yaml", LocationAttribute.Location.LibraryFolder)] @@ -809,23 +873,11 @@ sealed class GitStatusCache : ManagedCacheBase, IGitStatusCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private GitStatus status; - public void UpdateData(GitStatus statusUpdate) - { - var now = DateTimeOffset.Now; - var isUpdated = false; - - Logger.Trace("Processing Update: {0}", now); - - if (!status.Equals(statusUpdate)) - { - status = statusUpdate; - isUpdated = true; - } - - SaveData(now, isUpdated); - } + public GitStatusCache() : base(true) + { } public GitStatus GitStatus { @@ -862,6 +914,12 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } [Location("cache/gitlocks.yaml", LocationAttribute.Location.LibraryFolder)] @@ -869,8 +927,12 @@ sealed class GitLocksCache : ManagedCacheBase, IGitLocksCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private List gitLocks = new List(); + public GitLocksCache() : base(true) + { } + public List GitLocks { get @@ -906,6 +968,12 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } [Location("cache/gituser.yaml", LocationAttribute.Location.LibraryFolder)] @@ -913,23 +981,11 @@ sealed class GitUserCache : ManagedCacheBase, IGitUserCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private User user; - public void UpdateData(User userUpdate) - { - var now = DateTimeOffset.Now; - var isUpdated = false; - - Logger.Trace("Processing Update: {0}", now); - - if (user != userUpdate) - { - user = userUpdate; - isUpdated = true; - } - - SaveData(now, isUpdated); - } + public GitUserCache() : base(true) + { } public User User { @@ -938,6 +994,21 @@ public User User ValidateData(); return user; } + set + { + var now = DateTimeOffset.Now; + var isUpdated = false; + + Logger.Trace("Updating: {0} user:{1}", now, value); + + if (!user.Equals(value)) + { + user = value; + isUpdated = true; + } + + SaveData(now, isUpdated); + } } public override string LastUpdatedAtString @@ -951,5 +1022,11 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string FirstInitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } } } From fecbc829b831d43d188c4db545c1ea06b535c50a Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 17:05:57 -0500 Subject: [PATCH 02/10] Data is not updated when invalidated --- .../Assets/Editor/GitHub.Unity/ApplicationCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 9f8f66c88..9053e5018 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -148,7 +148,7 @@ public void InvalidateData() { Logger.Trace("Invalidated"); CacheInvalidated.SafeInvoke(); - SaveData(DateTimeOffset.Now, true); + SaveData(DateTimeOffset.Now, false); } protected void SaveData(DateTimeOffset now, bool isUpdated) From 21f5a7e44d534e63e398a4e76e0e0dc1a8c7ceb0 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 17:42:35 -0500 Subject: [PATCH 03/10] Adding log details for log invalidation --- .../Assets/Editor/GitHub.Unity/ApplicationCache.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 9053e5018..025a58c7e 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -135,18 +135,20 @@ public void ValidateData() if (invalidOnFirstRun) { + Logger.Trace("FirstRun Invalidation"); InvalidateData(); } } else if (DateTimeOffset.Now - LastUpdatedAt > DataTimeout) { + Logger.Trace("Timeout Invalidation"); InvalidateData(); } } public void InvalidateData() { - Logger.Trace("Invalidated"); + Logger.Trace("Invalidate"); CacheInvalidated.SafeInvoke(); SaveData(DateTimeOffset.Now, false); } From d7e495b9e4209d629b5b2500d7cdc971421cf6ec Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 17:54:13 -0500 Subject: [PATCH 04/10] Restoring functionality to Repository --- src/GitHub.Api/Git/Repository.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/GitHub.Api/Git/Repository.cs b/src/GitHub.Api/Git/Repository.cs index d6be458ee..bdf23178e 100644 --- a/src/GitHub.Api/Git/Repository.cs +++ b/src/GitHub.Api/Git/Repository.cs @@ -58,6 +58,11 @@ public void Initialize(IRepositoryManager initRepositoryManager) repositoryManager.OnRemoteBranchAdded += RepositoryManager_OnRemoteBranchAdded; repositoryManager.OnRemoteBranchRemoved += RepositoryManager_OnRemoteBranchRemoved; repositoryManager.OnGitUserLoaded += user => User = user; + + UpdateGitStatus(); + UpdateGitLog(); + + new ActionTask(CancellationToken.None, UpdateLocks) { Affinity = TaskAffinity.UI }.Start(); } public ITask SetupRemote(string remote, string remoteUrl) From 9a86b947d0209a5b8b424e6f7535c38a1dcf53f6 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 17:58:27 -0500 Subject: [PATCH 05/10] Defining DataTimeout per cache --- .../Editor/GitHub.Unity/ApplicationCache.cs | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 025a58c7e..4edb04cca 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -110,8 +110,6 @@ public IEnvironment Environment abstract class ManagedCacheBase : ScriptObjectSingleton where T : ScriptableObject, IManagedCache { - private static readonly TimeSpan DataTimeout = TimeSpan.FromMinutes(1); - [NonSerialized] private DateTimeOffset? lastUpdatedAtValue; [NonSerialized] private DateTimeOffset? lastVerifiedAtValue; [NonSerialized] private DateTimeOffset? firstInitializedAtValue; @@ -174,6 +172,7 @@ protected void SaveData(DateTimeOffset now, bool isUpdated) } } + public abstract TimeSpan DataTimeout { get; } public abstract string LastUpdatedAtString { get; protected set; } public abstract string LastVerifiedAtString { get; protected set; } public abstract string FirstInitializedAtString { get; protected set; } @@ -543,6 +542,11 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.MaxValue; } + } } [Location("cache/branches.yaml", LocationAttribute.Location.LibraryFolder)] @@ -814,6 +818,11 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.MaxValue; } + } } [Location("cache/gitlog.yaml", LocationAttribute.Location.LibraryFolder)] @@ -868,6 +877,11 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gitstatus.yaml", LocationAttribute.Location.LibraryFolder)] @@ -922,6 +936,11 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gitlocks.yaml", LocationAttribute.Location.LibraryFolder)] @@ -976,6 +995,11 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gituser.yaml", LocationAttribute.Location.LibraryFolder)] @@ -1030,5 +1054,10 @@ public override string FirstInitializedAtString get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(10); } + } } } From ae27fa029c57f8e965fd487c99d3b2e514e1ca98 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 18:20:51 -0500 Subject: [PATCH 06/10] Renaming variable --- .../Editor/GitHub.Unity/ApplicationCache.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 4edb04cca..1caa52c78 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -112,7 +112,7 @@ abstract class ManagedCacheBase : ScriptObjectSingleton where T : Scriptab { [NonSerialized] private DateTimeOffset? lastUpdatedAtValue; [NonSerialized] private DateTimeOffset? lastVerifiedAtValue; - [NonSerialized] private DateTimeOffset? firstInitializedAtValue; + [NonSerialized] private DateTimeOffset? initializedAtValue; [NonSerialized] private readonly bool invalidOnFirstRun; public event Action CacheInvalidated; @@ -126,9 +126,9 @@ protected ManagedCacheBase(bool invalidOnFirstRun) public void ValidateData() { - if (ApplicationCache.Instance.FirstRunAt > FirstInitializedAt) + if (ApplicationCache.Instance.FirstRunAt > InitializedAt) { - FirstInitializedAt = DateTimeOffset.Now; + InitializedAt = DateTimeOffset.Now; Save(true); if (invalidOnFirstRun) @@ -175,7 +175,7 @@ protected void SaveData(DateTimeOffset now, bool isUpdated) public abstract TimeSpan DataTimeout { get; } public abstract string LastUpdatedAtString { get; protected set; } public abstract string LastVerifiedAtString { get; protected set; } - public abstract string FirstInitializedAtString { get; protected set; } + public abstract string InitializedAtString { get; protected set; } public DateTimeOffset LastUpdatedAt { @@ -213,21 +213,21 @@ public DateTimeOffset LastVerifiedAt } } - public DateTimeOffset FirstInitializedAt + public DateTimeOffset InitializedAt { get { - if (!firstInitializedAtValue.HasValue) + if (!initializedAtValue.HasValue) { - firstInitializedAtValue = DateTimeOffset.Parse(FirstInitializedAtString); + initializedAtValue = DateTimeOffset.Parse(InitializedAtString); } - return firstInitializedAtValue.Value; + return initializedAtValue.Value; } set { - FirstInitializedAtString = value.ToString(); - firstInitializedAtValue = null; + InitializedAtString = value.ToString(); + initializedAtValue = null; } } @@ -537,7 +537,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } @@ -813,7 +813,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } @@ -872,7 +872,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } @@ -931,7 +931,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } @@ -990,7 +990,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } @@ -1049,7 +1049,7 @@ public override string LastVerifiedAtString protected set { lastVerifiedAtString = value; } } - public override string FirstInitializedAtString + public override string InitializedAtString { get { return firstInitializedAtString; } protected set { firstInitializedAtString = value; } From e3ec808d20e3703d3e08b53a776a0d60c31fe030 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 13 Nov 2017 18:35:21 -0500 Subject: [PATCH 07/10] Renaming more variables --- .../Editor/GitHub.Unity/ApplicationCache.cs | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 1caa52c78..ede850d31 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -557,7 +557,7 @@ sealed class BranchCache : ManagedCacheBase, IBranchCache [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); - [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private ConfigBranch gitConfigBranch; [SerializeField] private ConfigRemote gitConfigRemote; @@ -815,8 +815,8 @@ public override string LastVerifiedAtString public override string InitializedAtString { - get { return firstInitializedAtString; } - protected set { firstInitializedAtString = value; } + get { return initializedAtString; } + protected set { initializedAtString = value; } } public override TimeSpan DataTimeout @@ -830,7 +830,7 @@ sealed class GitLogCache : ManagedCacheBase, IGitLogCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); - [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private List log = new List(); public GitLogCache() : base(true) @@ -874,8 +874,8 @@ public override string LastVerifiedAtString public override string InitializedAtString { - get { return firstInitializedAtString; } - protected set { firstInitializedAtString = value; } + get { return initializedAtString; } + protected set { initializedAtString = value; } } public override TimeSpan DataTimeout @@ -889,7 +889,7 @@ sealed class GitStatusCache : ManagedCacheBase, IGitStatusCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); - [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private GitStatus status; public GitStatusCache() : base(true) @@ -933,8 +933,8 @@ public override string LastVerifiedAtString public override string InitializedAtString { - get { return firstInitializedAtString; } - protected set { firstInitializedAtString = value; } + get { return initializedAtString; } + protected set { initializedAtString = value; } } public override TimeSpan DataTimeout @@ -948,7 +948,7 @@ sealed class GitLocksCache : ManagedCacheBase, IGitLocksCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); - [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private List gitLocks = new List(); public GitLocksCache() : base(true) @@ -992,8 +992,8 @@ public override string LastVerifiedAtString public override string InitializedAtString { - get { return firstInitializedAtString; } - protected set { firstInitializedAtString = value; } + get { return initializedAtString; } + protected set { initializedAtString = value; } } public override TimeSpan DataTimeout @@ -1007,7 +1007,7 @@ sealed class GitUserCache : ManagedCacheBase, IGitUserCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); - [SerializeField] private string firstInitializedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private User user; public GitUserCache() : base(true) @@ -1051,8 +1051,8 @@ public override string LastVerifiedAtString public override string InitializedAtString { - get { return firstInitializedAtString; } - protected set { firstInitializedAtString = value; } + get { return initializedAtString; } + protected set { initializedAtString = value; } } public override TimeSpan DataTimeout From a15ee5d40a1bd84f4fcb891a3027a4c7ec0fbc18 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 20 Nov 2017 12:32:01 -0500 Subject: [PATCH 08/10] Formatting InitializedAt with ISO8601 --- .../Assets/Editor/GitHub.Unity/ApplicationCache.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 135b67d47..072dfdf5f 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -235,14 +235,22 @@ public DateTimeOffset InitializedAt { if (!initializedAtValue.HasValue) { - initializedAtValue = DateTimeOffset.Parse(InitializedAtString); + DateTimeOffset result; + if (DateTimeOffset.TryParseExact(InitializedAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) + { + initializedAtValue = result; + } + else + { + initializedAtValue = DateTimeOffset.MinValue; + } } return initializedAtValue.Value; } set { - InitializedAtString = value.ToString(); + InitializedAtString = value.ToString(Constants.Iso8601Format); initializedAtValue = null; } } From d02baef1a2e8083bee726333d0a96b1418ca16b4 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 20 Nov 2017 12:36:14 -0500 Subject: [PATCH 09/10] Preserving the value that is set in DateTimeOffset fields in cache There is no reason for these values to be set to null, even though they are evaluated lazily. --- .../Assets/Editor/GitHub.Unity/ApplicationCache.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 072dfdf5f..74bc44bc4 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -199,7 +199,7 @@ public DateTimeOffset LastUpdatedAt set { LastUpdatedAtString = value.ToString(Constants.Iso8601Format); - lastUpdatedAtValue = null; + lastUpdatedAtValue = value; } } @@ -225,7 +225,7 @@ public DateTimeOffset LastVerifiedAt set { LastVerifiedAtString = value.ToString(Constants.Iso8601Format); - lastVerifiedAtValue = null; + lastVerifiedAtValue = value; } } @@ -251,7 +251,7 @@ public DateTimeOffset InitializedAt set { InitializedAtString = value.ToString(Constants.Iso8601Format); - initializedAtValue = null; + initializedAtValue = value; } } From 9c95f349dda6fb322dc0789f8624ae24248fe3d6 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 20 Nov 2017 12:57:09 -0500 Subject: [PATCH 10/10] Ensure FirstRunAtValue is populated Ensure FirstRun is resolved before FirstRunAt is called --- .../Editor/GitHub.Unity/ApplicationCache.cs | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 74bc44bc4..148988cdf 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -19,18 +19,7 @@ public bool FirstRun { get { - if (!firstRunValue.HasValue) - { - firstRunValue = firstRun; - } - - if (firstRun) - { - firstRun = false; - FirstRunAt = DateTimeOffset.Now; - Save(true); - } - + EnsureFirstRun(); return firstRunValue.Value; } } @@ -39,17 +28,34 @@ public DateTimeOffset FirstRunAt { get { + EnsureFirstRun(); + if (!firstRunAtValue.HasValue) { - firstRunAtValue = DateTimeOffset.Parse(firstRunAtString); + firstRunAtValue = DateTimeOffset.ParseExact(firstRunAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture); } return firstRunAtValue.Value; } private set { - firstRunAtString = value.ToString(); - firstRunAtValue = null; + firstRunAtString = value.ToString(Constants.Iso8601Format); + firstRunAtValue = value; + } + } + + private void EnsureFirstRun() + { + if (!firstRunValue.HasValue) + { + firstRunValue = firstRun; + } + + if (firstRun) + { + firstRun = false; + FirstRunAt = DateTimeOffset.Now; + Save(true); } } }