diff --git a/src/GitHub.Api/Git/Repository.cs b/src/GitHub.Api/Git/Repository.cs index ec47d0dfa..053698f77 100644 --- a/src/GitHub.Api/Git/Repository.cs +++ b/src/GitHub.Api/Git/Repository.cs @@ -323,6 +323,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 7ec041562..4eb96853e 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -10,25 +10,52 @@ 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) - { - val = firstRun; - } + EnsureFirstRun(); + return firstRunValue.Value; + } + } + + public DateTimeOffset FirstRunAt + { + get + { + EnsureFirstRun(); - if (firstRun) + if (!firstRunAtValue.HasValue) { - firstRun = false; - Save(true); + firstRunAtValue = DateTimeOffset.ParseExact(firstRunAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture); } - return val.Value; + return firstRunAtValue.Value; + } + private set + { + firstRunAtString = value.ToString(Constants.Iso8601Format); + firstRunAtValue = value; + } + } + + private void EnsureFirstRun() + { + if (!firstRunValue.HasValue) + { + firstRunValue = firstRun; + } + + if (firstRun) + { + firstRun = false; + FirstRunAt = DateTimeOffset.Now; + Save(true); } } } @@ -89,32 +116,45 @@ public IEnvironment Environment abstract class ManagedCacheBase : ScriptObjectSingleton where T : ScriptableObject, IManagedCache { - private static readonly TimeSpan DataTimeout = TimeSpan.MaxValue; - [NonSerialized] private DateTimeOffset? lastUpdatedAtValue; [NonSerialized] private DateTimeOffset? lastVerifiedAtValue; + [NonSerialized] private DateTimeOffset? initializedAtValue; + [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 > InitializedAt) + { + InitializedAt = DateTimeOffset.Now; + Save(true); + + 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, true); + SaveData(DateTimeOffset.Now, false); } protected void SaveData(DateTimeOffset now, bool isUpdated) @@ -138,8 +178,10 @@ 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 InitializedAtString { get; protected set; } public DateTimeOffset LastUpdatedAt { @@ -163,7 +205,7 @@ public DateTimeOffset LastUpdatedAt set { LastUpdatedAtString = value.ToString(Constants.Iso8601Format); - lastUpdatedAtValue = null; + lastUpdatedAtValue = value; } } @@ -189,7 +231,33 @@ public DateTimeOffset LastVerifiedAt set { LastVerifiedAtString = value.ToString(Constants.Iso8601Format); - lastVerifiedAtValue = null; + lastVerifiedAtValue = value; + } + } + + public DateTimeOffset InitializedAt + { + get + { + if (!initializedAtValue.HasValue) + { + 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(Constants.Iso8601Format); + initializedAtValue = value; } } @@ -332,9 +400,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 @@ -394,6 +466,17 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return firstInitializedAtString; } + protected set { firstInitializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.MaxValue; } + } } [Location("cache/branches.yaml", LocationAttribute.Location.LibraryFolder)] @@ -404,6 +487,7 @@ sealed class BranchCache : ManagedCacheBase, IBranchCache [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private ConfigBranch gitConfigBranch; [SerializeField] private ConfigRemote gitConfigRemote; @@ -416,6 +500,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 @@ -655,6 +742,17 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return initializedAtString; } + protected set { initializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.MaxValue; } + } } [Location("cache/gitlog.yaml", LocationAttribute.Location.LibraryFolder)] @@ -662,25 +760,11 @@ sealed class GitLogCache : ManagedCacheBase, IGitLogCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = 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 { @@ -717,6 +801,17 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return initializedAtString; } + protected set { initializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gitstatus.yaml", LocationAttribute.Location.LibraryFolder)] @@ -724,23 +819,11 @@ sealed class GitStatusCache : ManagedCacheBase, IGitStatusCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = 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 { @@ -777,6 +860,17 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return initializedAtString; } + protected set { initializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gitlocks.yaml", LocationAttribute.Location.LibraryFolder)] @@ -784,8 +878,12 @@ sealed class GitLocksCache : ManagedCacheBase, IGitLocksCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private List gitLocks = new List(); + public GitLocksCache() : base(true) + { } + public List GitLocks { get @@ -821,6 +919,17 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return initializedAtString; } + protected set { initializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(1); } + } } [Location("cache/gituser.yaml", LocationAttribute.Location.LibraryFolder)] @@ -828,23 +937,11 @@ sealed class GitUserCache : ManagedCacheBase, IGitUserCache { [SerializeField] private string lastUpdatedAtString = DateTimeOffset.MinValue.ToString(); [SerializeField] private string lastVerifiedAtString = DateTimeOffset.MinValue.ToString(); + [SerializeField] private string initializedAtString = 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 { @@ -853,6 +950,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 @@ -866,5 +978,16 @@ public override string LastVerifiedAtString get { return lastVerifiedAtString; } protected set { lastVerifiedAtString = value; } } + + public override string InitializedAtString + { + get { return initializedAtString; } + protected set { initializedAtString = value; } + } + + public override TimeSpan DataTimeout + { + get { return TimeSpan.FromMinutes(10); } + } } }