diff --git a/src/GitHub.Api/Application/ApplicationManagerBase.cs b/src/GitHub.Api/Application/ApplicationManagerBase.cs index ffa1bf77d..63c4d67bc 100644 --- a/src/GitHub.Api/Application/ApplicationManagerBase.cs +++ b/src/GitHub.Api/Application/ApplicationManagerBase.cs @@ -78,6 +78,7 @@ private async Task SetupGit() } } + Environment.User.Initialize(GitClient); } public ITask InitializeRepository() diff --git a/src/GitHub.Api/Cache/CacheInterfaces.cs b/src/GitHub.Api/Cache/CacheInterfaces.cs index 48fad4a55..cfd6971f5 100644 --- a/src/GitHub.Api/Cache/CacheInterfaces.cs +++ b/src/GitHub.Api/Cache/CacheInterfaces.cs @@ -49,7 +49,8 @@ public interface IGitLocksCache : IManagedCache public interface IGitUserCache : IManagedCache { - User User { get; } + string Name { get; set; } + string Email { get; set; } } public interface IGitStatusCache : IManagedCache diff --git a/src/GitHub.Api/Git/GitClient.cs b/src/GitHub.Api/Git/GitClient.cs index a9f5c7e4c..9c3643a58 100644 --- a/src/GitHub.Api/Git/GitClient.cs +++ b/src/GitHub.Api/Git/GitClient.cs @@ -23,7 +23,7 @@ ITask GetConfig(string key, GitConfigSource configSource, ITask SetConfig(string key, string value, GitConfigSource configSource, IOutputProcessor processor = null); - ITask GetConfigUserAndEmail(); + ITask GetConfigUserAndEmail(); ITask> ListLocks(bool local, BaseOutputListProcessor processor = null); @@ -84,7 +84,7 @@ ITask Unlock(string file, bool force, ITask LfsVersion(IOutputProcessor processor = null); - ITask SetConfigUserAndEmail(string username, string email); + ITask SetConfigNameAndEmail(string username, string email); } class GitClient : IGitClient @@ -259,7 +259,7 @@ public ITask SetConfig(string key, string value, GitConfigSource configS .Configure(processManager); } - public ITask GetConfigUserAndEmail() + public ITask GetConfigUserAndEmail() { string username = null; string email = null; @@ -279,15 +279,15 @@ public ITask GetConfigUserAndEmail() } })).Then(success => { Logger.Trace("{0}:{1} {2}:{3}", UserNameConfigKey, username, UserEmailConfigKey, email); - return new User { Name = username, Email = email }; + return new GitUser(username, email); }); } - public ITask SetConfigUserAndEmail(string username, string email) + public ITask SetConfigNameAndEmail(string username, string email) { return SetConfig(UserNameConfigKey, username, GitConfigSource.User) .Then(SetConfig(UserEmailConfigKey, email, GitConfigSource.User)) - .Then(b => new User { Name = username, Email = email }); + .Then(b => new GitUser(username, email)); } public ITask> ListLocks(bool local, BaseOutputListProcessor processor = null) @@ -464,4 +464,26 @@ public ITask Unlock(string file, bool force, protected static ILogging Logger { get; } = Logging.GetLogger(); } + + public struct GitUser + { + public static GitUser Default = new GitUser(); + + public string name; + public string email; + + public string Name { get { return name; } } + public string Email { get { return email; } } + + public GitUser(string name, string email) + { + this.name = name; + this.email = email; + } + + public override string ToString() + { + return $"Name:\"{Name}\" Email:\"{Email}\""; + } + } } diff --git a/src/GitHub.Api/Git/IRepository.cs b/src/GitHub.Api/Git/IRepository.cs index e6117dde8..e3e576bc8 100644 --- a/src/GitHub.Api/Git/IRepository.cs +++ b/src/GitHub.Api/Git/IRepository.cs @@ -64,7 +64,6 @@ public interface IRepository : IEquatable GitRemote[] Remotes { get; } GitBranch[] LocalBranches { get; } GitBranch[] RemoteBranches { get; } - IUser User { get; set; } List CurrentLocks { get; } string CurrentBranchName { get; } List CurrentLog { get; } diff --git a/src/GitHub.Api/Git/ManagedCacheExtensions.cs b/src/GitHub.Api/Git/ManagedCacheExtensions.cs new file mode 100644 index 000000000..4590b911f --- /dev/null +++ b/src/GitHub.Api/Git/ManagedCacheExtensions.cs @@ -0,0 +1,21 @@ +using System; + +namespace GitHub.Unity +{ + static class ManagedCacheExtensions + { + public static bool IsLastUpdatedTimeDifferent(this IManagedCache managedCache, CacheUpdateEvent cacheUpdateEvent) + { + bool isDifferent; + if (cacheUpdateEvent.UpdatedTimeString == null) + { + isDifferent = managedCache.LastUpdatedAt != DateTimeOffset.MinValue; + } + else + { + isDifferent = managedCache.LastUpdatedAt.ToString() != cacheUpdateEvent.UpdatedTimeString; + } + return isDifferent; + } + } +} \ No newline at end of file diff --git a/src/GitHub.Api/Git/Repository.cs b/src/GitHub.Api/Git/Repository.cs index 053698f77..2aabfd7f3 100644 --- a/src/GitHub.Api/Git/Repository.cs +++ b/src/GitHub.Api/Git/Repository.cs @@ -35,7 +35,6 @@ public Repository(NPath localPath, ICacheContainer container) Guard.ArgumentNotNull(localPath, nameof(localPath)); LocalPath = localPath; - User = new User(); cacheContainer = container; cacheContainer.CacheInvalidated += CacheContainer_OnCacheInvalidated; @@ -57,7 +56,6 @@ public void Initialize(IRepositoryManager initRepositoryManager) repositoryManager.OnLocalBranchRemoved += RepositoryManager_OnLocalBranchRemoved; repositoryManager.OnRemoteBranchAdded += RepositoryManager_OnRemoteBranchAdded; repositoryManager.OnRemoteBranchRemoved += RepositoryManager_OnRemoteBranchRemoved; - repositoryManager.OnGitUserLoaded += user => User = user; UpdateGitStatus(); UpdateGitLog(); @@ -150,7 +148,7 @@ public void UpdateConfigData() public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent) { var managedCache = cacheContainer.GitLogCache; - var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache); + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent); Logger.Trace("Check GitLogCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent); @@ -166,7 +164,7 @@ public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent) public void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent) { var managedCache = cacheContainer.GitStatusCache; - var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache); + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent); Logger.Trace("Check GitStatusCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent); @@ -197,7 +195,7 @@ public void CheckCurrentBranchAndRemoteChangedEvent(CacheUpdateEvent cacheUpdate private void CheckRepositoryInfoCacheEvent(CacheUpdateEvent cacheUpdateEvent) { var managedCache = cacheContainer.RepositoryInfoCache; - var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache); + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent); Logger.Trace("Check RepositoryInfoCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent); @@ -214,7 +212,7 @@ public void CheckLocksChangedEvent(CacheUpdateEvent cacheUpdateEvent) { CacheUpdateEvent cacheUpdateEvent1 = cacheUpdateEvent; var managedCache = cacheContainer.GitLocksCache; - var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent1, managedCache); + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent1); Logger.Trace("Check GitLocksCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, cacheUpdateEvent1.UpdatedTimeString ?? "[NULL]", raiseEvent); @@ -277,7 +275,7 @@ public bool Equals(IRepository other) private void CheckBranchCacheEvent(CacheUpdateEvent cacheUpdateEvent) { var managedCache = cacheContainer.BranchCache; - var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache); + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent); Logger.Trace("Check BranchCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent); @@ -290,20 +288,6 @@ private void CheckBranchCacheEvent(CacheUpdateEvent cacheUpdateEvent) } } - private static bool ShouldRaiseCacheEvent(CacheUpdateEvent cacheUpdateEvent, IManagedCache managedCache) - { - bool raiseEvent; - if (cacheUpdateEvent.UpdatedTimeString == null) - { - raiseEvent = managedCache.LastUpdatedAt != DateTimeOffset.MinValue; - } - else - { - raiseEvent = managedCache.LastUpdatedAt.ToString() != cacheUpdateEvent.UpdatedTimeString; - } - return raiseEvent; - } - private void CacheContainer_OnCacheInvalidated(CacheType cacheType) { switch (cacheType) @@ -669,27 +653,129 @@ public bool IsGitHub "{0} Owner: {1} Name: {2} CloneUrl: {3} LocalPath: {4} Branch: {5} Remote: {6}", GetHashCode(), Owner, Name, CloneUrl, LocalPath, CurrentBranch, CurrentRemote); - public IUser User { get; set; } - protected static ILogging Logger { get; } = Logging.GetLogger(); } public interface IUser { - string Name { get; set; } - string Email { get; set; } + string Name { get; } + string Email { get; } + event Action Changed; + void CheckUserChangedEvent(CacheUpdateEvent cacheUpdateEvent); + void Initialize(IGitClient client); + void SetNameAndEmail(string name, string email); } [Serializable] public class User : IUser { + private ICacheContainer cacheContainer; + private IGitClient gitClient; + + public event Action Changed; + + public User(ICacheContainer cacheContainer) + { + this.cacheContainer = cacheContainer; + + cacheContainer.GitUserCache.CacheInvalidated += GitUserCacheOnCacheInvalidated; + cacheContainer.GitUserCache.CacheUpdated += GitUserCacheOnCacheUpdated; + } + + public void CheckUserChangedEvent(CacheUpdateEvent cacheUpdateEvent) + { + var managedCache = cacheContainer.GitUserCache; + var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent); + + Logger.Trace("Check GitUserCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt, + cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent); + + if (raiseEvent) + { + var dateTimeOffset = managedCache.LastUpdatedAt; + var updateEvent = new CacheUpdateEvent { UpdatedTimeString = dateTimeOffset.ToString() }; + HandleUserCacheUpdatedEvent(updateEvent); + } + } + + public void Initialize(IGitClient client) + { + Guard.ArgumentNotNull(client, nameof(client)); + + Logger.Trace("Initialize"); + + gitClient = client; + UpdateUserAndEmail(); + } + + public void SetNameAndEmail(string name, string email) + { + gitClient.SetConfigNameAndEmail(name, email) + .ThenInUI((success, value) => { + if (success) + { + Name = value.Name; + Email = value.Email; + } + }).Start(); + } + public override string ToString() { return String.Format("Name: {0} Email: {1}", Name, Email); } - public string Name { get; set; } - public string Email { get; set; } + public string Name + { + get { return cacheContainer.GitUserCache.Name; } + private set { cacheContainer.GitUserCache.Name = value; } + } + + public string Email + { + get { return cacheContainer.GitUserCache.Email; } + private set { cacheContainer.GitUserCache.Email = value; } + } + + private void GitUserCacheOnCacheUpdated(DateTimeOffset timeOffset) + { + HandleUserCacheUpdatedEvent(new CacheUpdateEvent + { + UpdatedTimeString = timeOffset.ToString() + }); + } + + private void GitUserCacheOnCacheInvalidated() + { + Logger.Trace("GitUserCache Invalidated"); + UpdateUserAndEmail(); + } + + private void HandleUserCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent) + { + Logger.Trace("GitUserCache Updated {0}", cacheUpdateEvent.UpdatedTimeString); + Changed?.Invoke(cacheUpdateEvent); + } + + private void UpdateUserAndEmail() + { + if (gitClient != null) + { + Logger.Trace("UpdateUserAndEmail"); + + gitClient.GetConfigUserAndEmail() + .ThenInUI((success, value) => + { + if (success) + { + Name = value.Name; + Email = value.Email; + } + }).Start(); + } + } + + protected static ILogging Logger { get; } = Logging.GetLogger(); } [Serializable] diff --git a/src/GitHub.Api/Git/RepositoryManager.cs b/src/GitHub.Api/Git/RepositoryManager.cs index fd0bd7104..52be6b2ff 100644 --- a/src/GitHub.Api/Git/RepositoryManager.cs +++ b/src/GitHub.Api/Git/RepositoryManager.cs @@ -8,7 +8,6 @@ namespace GitHub.Unity public interface IRepositoryManager : IDisposable { event Action OnCurrentBranchAndRemoteUpdated; - event Action OnGitUserLoaded; event Action OnIsBusyChanged; event Action OnLocalBranchAdded; event Action> OnLocalBranchListUpdated; @@ -101,7 +100,6 @@ class RepositoryManager : IRepositoryManager private bool isBusy; public event Action OnCurrentBranchAndRemoteUpdated; - public event Action OnGitUserLoaded; public event Action OnIsBusyChanged; public event Action OnLocalBranchAdded; public event Action> OnLocalBranchListUpdated; @@ -149,7 +147,6 @@ public void Start() Logger.Trace("Start"); UpdateConfigData(); - LoadGitUser(); watcher.Start(); } @@ -300,15 +297,6 @@ public void UpdateConfigData() UpdateConfigData(false); } - private void LoadGitUser() - { - GitClient.GetConfigUserAndEmail() - .Then((success, user) => { - Logger.Trace("OnGitUserLoaded: {0}", user); - OnGitUserLoaded?.Invoke(user); - }).Start(); - } - private void SetupWatcher() { watcher.HeadChanged += Watcher_OnHeadChanged; diff --git a/src/GitHub.Api/GitHub.Api.csproj b/src/GitHub.Api/GitHub.Api.csproj index 2816e0140..7185423ec 100644 --- a/src/GitHub.Api/GitHub.Api.csproj +++ b/src/GitHub.Api/GitHub.Api.csproj @@ -103,6 +103,7 @@ + diff --git a/src/GitHub.Api/Platform/DefaultEnvironment.cs b/src/GitHub.Api/Platform/DefaultEnvironment.cs index 7301e3875..b568804fd 100644 --- a/src/GitHub.Api/Platform/DefaultEnvironment.cs +++ b/src/GitHub.Api/Platform/DefaultEnvironment.cs @@ -7,7 +7,6 @@ namespace GitHub.Unity public class DefaultEnvironment : IEnvironment { private const string logFile = "github-unity.log"; - private ICacheContainer cacheContainer; public NPath LogPath { get; } public DefaultEnvironment() @@ -39,7 +38,7 @@ public DefaultEnvironment() public DefaultEnvironment(ICacheContainer cacheContainer) : this() { - this.cacheContainer = cacheContainer; + this.CacheContainer = cacheContainer; } public void Initialize(string unityVersion, NPath extensionInstallPath, NPath unityPath, NPath assetsPath) @@ -49,6 +48,7 @@ public void Initialize(string unityVersion, NPath extensionInstallPath, NPath un UnityAssetsPath = assetsPath; UnityProjectPath = assetsPath.Parent; UnityVersion = unityVersion; + User = new User(CacheContainer); } public void InitializeRepository(NPath expectedRepositoryPath = null) @@ -86,7 +86,7 @@ public void InitializeRepository(NPath expectedRepositoryPath = null) { Logger.Trace("Determined expectedRepositoryPath:{0}", expectedRepositoryPath); RepositoryPath = expectedRepositoryPath; - Repository = new Repository(RepositoryPath, cacheContainer); + Repository = new Repository(RepositoryPath, CacheContainer); } } @@ -133,7 +133,9 @@ public NPath GitExecutablePath public NPath GitInstallPath { get; private set; } public NPath RepositoryPath { get; private set; } + public ICacheContainer CacheContainer { get; private set; } public IRepository Repository { get; set; } + public IUser User { get; set; } public bool IsWindows { get { return OnWindows; } } public bool IsLinux { get { return OnLinux; } } diff --git a/src/GitHub.Api/Platform/IEnvironment.cs b/src/GitHub.Api/Platform/IEnvironment.cs index 1c42158ad..d37c89ec9 100644 --- a/src/GitHub.Api/Platform/IEnvironment.cs +++ b/src/GitHub.Api/Platform/IEnvironment.cs @@ -27,7 +27,9 @@ public interface IEnvironment NPath SystemCachePath { get; set; } NPath LogPath { get; } IFileSystem FileSystem { get; set; } + IUser User { get; set; } IRepository Repository { get; set; } string ExecutableExtension { get; } + ICacheContainer CacheContainer { get; } } } \ No newline at end of file diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 4eb96853e..701f231f2 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -938,28 +938,53 @@ 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; + [SerializeField] private string gitName; + [SerializeField] private string gitEmail; public GitUserCache() : base(true) { } - public User User + public string Name { get { ValidateData(); - return user; + return gitName; } set { var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} user:{1}", now, value); + Logger.Trace("Updating: {0} Name:{1}", now, value); - if (!user.Equals(value)) + if (gitName != value) { - user = value; + gitName = value; + isUpdated = true; + } + + SaveData(now, isUpdated); + } + } + + public string Email + { + get + { + ValidateData(); + return gitEmail; + } + set + { + var now = DateTimeOffset.Now; + var isUpdated = false; + + Logger.Trace("Updating: {0} Email:{1}", now, value); + + if (gitEmail != value) + { + gitEmail = value; isUpdated = true; } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs index c864652c5..3cc00a234 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs @@ -7,6 +7,7 @@ namespace GitHub.Unity abstract class BaseWindow : EditorWindow, IView { [NonSerialized] private bool initialized = false; + [NonSerialized] private IUser cachedUser; [NonSerialized] private IRepository cachedRepository; [NonSerialized] private bool initializeWasCalled; [NonSerialized] private bool inLayout; @@ -21,6 +22,7 @@ public void InitializeWindow(IApplicationManager applicationManager, bool requir initialized = true; initializeWasCalled = true; Manager = applicationManager; + cachedUser = Environment.User; cachedRepository = Environment.Repository; Initialize(applicationManager); if (requiresRedraw) @@ -103,6 +105,8 @@ public virtual void OnSelectionChange() public abstract bool IsBusy { get; } public IRepository Repository { get { return inLayout ? cachedRepository : Environment.Repository; } } public bool HasRepository { get { return Repository != null; } } + public IUser User { get { return cachedUser; } } + public bool HasUser { get { return User != null; } } protected ITaskManager TaskManager { get { return Manager.TaskManager; } } protected IGitClient GitClient { get { return Manager.GitClient; } } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/IView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/IView.cs index 7afe70af4..52cc69c2c 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/IView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/IView.cs @@ -14,6 +14,8 @@ interface IView void Finish(bool result); IRepository Repository { get; } bool HasRepository { get; } + IUser User { get; } + bool HasUser { get; } IApplicationManager Manager { get; } bool IsBusy { get; } } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs index 9a195b510..b6175d6de 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs @@ -13,12 +13,22 @@ class InitProjectView : Subview [NonSerialized] private bool isBusy; [NonSerialized] private bool isUserDataPresent; [NonSerialized] private bool hasCompletedInitialCheck; - [NonSerialized] private bool userDataHasChanged; + + [SerializeField] private CacheUpdateEvent lastCheckUserChangedEvent; + [NonSerialized] private bool userHasChanges; public override void OnEnable() { base.OnEnable(); - userDataHasChanged = Environment.GitExecutablePath != null; + AttachHandlers(); + + User.CheckUserChangedEvent(lastCheckUserChangedEvent); + } + + public override void OnDisable() + { + base.OnDisable(); + DetachHandlers(); } public override void OnGUI() @@ -76,35 +86,39 @@ public override void OnDataUpdate() MaybeUpdateData(); } - private void MaybeUpdateData() + private void AttachHandlers() { - if (userDataHasChanged) - { - userDataHasChanged = false; - CheckForUser(); - } + User.Changed += UserOnChanged; } - private void CheckForUser() + private void UserOnChanged(CacheUpdateEvent cacheUpdateEvent) { - if (string.IsNullOrEmpty(Environment.GitExecutablePath)) + if (!lastCheckUserChangedEvent.Equals(cacheUpdateEvent)) { - Logger.Warning("No git exec cannot check for user"); - return; + new ActionTask(TaskManager.Token, () => + { + lastCheckUserChangedEvent = cacheUpdateEvent; + userHasChanges = true; + Redraw(); + }) + { Affinity = TaskAffinity.UI }.Start(); } + } - Logger.Trace("Checking for user"); - isBusy = true; + private void DetachHandlers() + { + User.Changed -= UserOnChanged; + } - GitClient.GetConfigUserAndEmail().FinallyInUI((success, ex, user) => { - isBusy = false; - isUserDataPresent = success && !String.IsNullOrEmpty(user.Name) && !String.IsNullOrEmpty(user.Email); + private void MaybeUpdateData() + { + if (userHasChanges) + { + userHasChanges = false; + isUserDataPresent = !string.IsNullOrEmpty(User.Name) + && !string.IsNullOrEmpty(User.Email); hasCompletedInitialCheck = true; - - Logger.Trace("User Present: {0}", isUserDataPresent); - - Redraw(); - }).Start(); + } } public override bool IsBusy diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Subview.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Subview.cs index b6a4d84f7..e144f48be 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Subview.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Subview.cs @@ -52,6 +52,8 @@ public virtual void Finish(bool result) public IApplicationManager Manager { get { return Parent.Manager; } } public IRepository Repository { get { return Parent.Repository; } } public bool HasRepository { get { return Parent.HasRepository; } } + public IUser User { get { return Parent.User; } } + public bool HasUser { get { return Parent.HasUser; } } public abstract bool IsBusy { get; } protected ITaskManager TaskManager { get { return Manager.TaskManager; } } protected IGitClient GitClient { get { return Manager.GitClient; } } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/UserSettingsView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/UserSettingsView.cs index 6bf1945a0..f280b5eda 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/UserSettingsView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/UserSettingsView.cs @@ -15,14 +15,15 @@ class UserSettingsView : Subview private const string GitConfigEmailLabel = "Email"; private const string GitConfigUserSave = "Save User"; - [NonSerialized] private bool isBusy; - [NonSerialized] private bool userDataHasChanged; - [SerializeField] private string gitName; [SerializeField] private string gitEmail; [SerializeField] private string newGitName; [SerializeField] private string newGitEmail; [SerializeField] private bool needsSaving; + [SerializeField] private CacheUpdateEvent lastCheckUserChangedEvent; + + [NonSerialized] private bool isBusy; + [NonSerialized] private bool userHasChanges; public override void InitializeView(IView parent) { @@ -62,29 +63,7 @@ public override void OnGUI() GUI.FocusControl(null); isBusy = true; - GitClient.SetConfigUserAndEmail(newGitName, newGitEmail) - .FinallyInUI((success, exception, user) => { - isBusy = false; - if (success) - { - if (Repository != null) - { - Repository.User.Name = gitName = newGitName; - Repository.User.Email = gitEmail = newGitEmail; - } - else - { - gitName = newGitName; - gitEmail = newGitEmail; - } - - needsSaving = false; - - Redraw(); - Finish(true); - } - }) - .Start(); + User.SetNameAndEmail(newGitName, newGitEmail); } } EditorGUI.EndDisabledGroup(); @@ -95,52 +74,52 @@ public override void OnGUI() public override void OnEnable() { base.OnEnable(); - userDataHasChanged = true; + AttachHandlers(); + + User.CheckUserChangedEvent(lastCheckUserChangedEvent); } - private void MaybeUpdateData() + public override void OnDisable() { - if (userDataHasChanged) - { - userDataHasChanged = false; - - if (Repository == null) - { - UpdateUserDataFromClient(); - } - else - { - newGitName = gitName = Repository.User.Name; - newGitEmail = gitEmail = Repository.User.Email; - needsSaving = false; - } - } + base.OnDisable(); + DetachHandlers(); + } + + private void AttachHandlers() + { + User.Changed += UserOnChanged; } - private void UpdateUserDataFromClient() + private void UserOnChanged(CacheUpdateEvent cacheUpdateEvent) { - if (String.IsNullOrEmpty(EntryPoint.Environment.GitExecutablePath)) - { - return; - } + Logger.Trace("UserOnChanged"); - if (GitClient == null) + if (!lastCheckUserChangedEvent.Equals(cacheUpdateEvent)) { - return; + new ActionTask(TaskManager.Token, () => { + lastCheckUserChangedEvent = cacheUpdateEvent; + userHasChanges = true; + isBusy = false; + Redraw(); + }) + { Affinity = TaskAffinity.UI }.Start(); } + } - Logger.Trace("Update user data from GitClient"); + private void DetachHandlers() + { + User.Changed -= UserOnChanged; + } - GitClient.GetConfigUserAndEmail() - .ThenInUI((success, user) => { - if (success && !String.IsNullOrEmpty(user.Name) && !String.IsNullOrEmpty(user.Email)) - { - newGitName = gitName = user.Name; - newGitEmail = gitEmail = user.Email; - needsSaving = false; - Redraw(); - } - }).Start(); + private void MaybeUpdateData() + { + if (userHasChanges) + { + userHasChanges = false; + gitName = newGitName = User.Name; + gitEmail = newGitEmail = User.Email; + needsSaving = false; + } } public override bool IsBusy diff --git a/src/tests/IntegrationTests/Git/IntegrationTestEnvironment.cs b/src/tests/IntegrationTests/Git/IntegrationTestEnvironment.cs index 62158eac2..3951f9537 100644 --- a/src/tests/IntegrationTests/Git/IntegrationTestEnvironment.cs +++ b/src/tests/IntegrationTests/Git/IntegrationTestEnvironment.cs @@ -118,7 +118,13 @@ public NPath GitExecutablePath public NPath GitInstallPath => defaultEnvironment.GitInstallPath; public IRepository Repository { get; set; } + public IUser User { get; set; } public IFileSystem FileSystem { get { return defaultEnvironment.FileSystem; } set { defaultEnvironment.FileSystem = value; } } public string ExecutableExtension { get { return defaultEnvironment.ExecutableExtension; } } + + public ICacheContainer CacheContainer + { + get { throw new NotImplementedException(); } + } } } diff --git a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs index 2d43f6304..ec7a10537 100644 --- a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs +++ b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs @@ -19,7 +19,6 @@ interface IRepositoryManagerListener void OnLocalBranchRemoved(string name); void OnRemoteBranchAdded(string origin, string name); void OnRemoteBranchRemoved(string origin, string name); - void OnGitUserLoaded(IUser user); void OnCurrentBranchAndRemoteUpdated(ConfigBranch? configBranch, ConfigRemote? configRemote); } @@ -38,7 +37,6 @@ class RepositoryManagerEvents public EventWaitHandle OnLocalBranchRemoved { get; } = new AutoResetEvent(false); public EventWaitHandle OnRemoteBranchAdded { get; } = new AutoResetEvent(false); public EventWaitHandle OnRemoteBranchRemoved { get; } = new AutoResetEvent(false); - public EventWaitHandle OnGitUserLoaded { get; } = new AutoResetEvent(false); public void Reset() { @@ -55,7 +53,6 @@ public void Reset() OnLocalBranchRemoved.Reset(); OnRemoteBranchAdded.Reset(); OnRemoteBranchRemoved.Reset(); - OnGitUserLoaded.Reset(); } public void WaitForNotBusy(int seconds = 1) @@ -138,12 +135,6 @@ public static void AttachListener(this IRepositoryManagerListener listener, listener.OnRemoteBranchRemoved(origin, name); managerEvents?.OnRemoteBranchRemoved.Set(); }; - - repositoryManager.OnGitUserLoaded += user => { - logger?.Trace("OnGitUserLoaded Name:{0}", user); - listener.OnGitUserLoaded(user); - managerEvents?.OnGitUserLoaded.Set(); - }; } public static void AssertDidNotReceiveAnyCalls(this IRepositoryManagerListener repositoryManagerListener)