From cefdb5432872f498d9f5dd5d9bdaa091c8f666ba Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 28 Nov 2018 14:59:06 -0500 Subject: [PATCH 1/4] Storing the host name in the keychain --- src/GitHub.Api/Application/ApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index f7b1c6703..3ef20f9ce 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -262,7 +262,7 @@ public void LoginWithToken(string token, Action result) Guard.ArgumentNotNull(result, "result"); new FuncTask(taskManager.Token, - () => loginManager.LoginWithToken(UriString.ToUriString(HostAddress.WebUri), token)) + () => loginManager.LoginWithToken(HostAddress.WebUri.Host, token)) .FinallyInUI((success, ex, res) => { if (!success) From 3ad7318be3e6ff3a1af819fb955d88e34c3ece9d Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 28 Nov 2018 15:57:37 -0500 Subject: [PATCH 2/4] Checking for the keychain of the current repository in the LocksView --- .../Editor/GitHub.Unity/UI/LocksView.cs | 68 +++++++++++++------ 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs index 0092d94f2..b8824459c 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs @@ -383,13 +383,14 @@ class LocksView : Subview { [NonSerialized] private bool isBusy; + [SerializeField] private bool currentRemoteHasUpdate; [SerializeField] private bool currentStatusEntriesHasUpdate; [SerializeField] private bool currentLocksHasUpdate; - [SerializeField] private bool currentUserHasUpdate; + [SerializeField] private bool keychainHasUpdate; [SerializeField] private LocksControl locksControl; + [SerializeField] private CacheUpdateEvent lastCurrentRemoteChangedEvent; [SerializeField] private CacheUpdateEvent lastLocksChangedEvent; [SerializeField] private CacheUpdateEvent lastStatusEntriesChangedEvent; - [SerializeField] private CacheUpdateEvent lastUserChangedEvent; [SerializeField] private List lockedFiles = new List(); [SerializeField] private List gitStatusEntries = new List(); [SerializeField] private string currentUsername; @@ -407,6 +408,7 @@ public override void OnEnable() AttachHandlers(Repository); ValidateCachedData(Repository); + KeychainConnectionsChanged(); } public override void OnDisable() @@ -523,9 +525,10 @@ private void AttachHandlers(IRepository repository) return; } + Platform.Keychain.ConnectionsChanged += KeychainConnectionsChanged; + repository.CurrentRemoteChanged += RepositoryOnCurrentRemoteChanged; repository.LocksChanged += RepositoryOnLocksChanged; - repository.LocksChanged += RepositoryOnStatusEntriesChanged; - User.Changed += UserOnChanged; + repository.StatusEntriesChanged += RepositoryOnStatusEntriesChanged; } private void DetachHandlers(IRepository repository) @@ -535,9 +538,20 @@ private void DetachHandlers(IRepository repository) return; } + Platform.Keychain.ConnectionsChanged -= KeychainConnectionsChanged; + repository.CurrentRemoteChanged -= RepositoryOnCurrentRemoteChanged; repository.LocksChanged -= RepositoryOnLocksChanged; - repository.LocksChanged -= RepositoryOnStatusEntriesChanged; - User.Changed -= UserOnChanged; + repository.StatusEntriesChanged -= RepositoryOnStatusEntriesChanged; + } + + private void RepositoryOnCurrentRemoteChanged(CacheUpdateEvent cacheUpdateEvent) + { + if (!lastCurrentRemoteChangedEvent.Equals(cacheUpdateEvent)) + { + lastCurrentRemoteChangedEvent = cacheUpdateEvent; + currentRemoteHasUpdate = true; + Redraw(); + } } private void RepositoryOnLocksChanged(CacheUpdateEvent cacheUpdateEvent) @@ -560,21 +574,17 @@ private void RepositoryOnStatusEntriesChanged(CacheUpdateEvent cacheUpdateEvent) } } - private void UserOnChanged(CacheUpdateEvent cacheUpdateEvent) + private void KeychainConnectionsChanged() { - if (!lastUserChangedEvent.Equals(cacheUpdateEvent)) - { - lastUserChangedEvent = cacheUpdateEvent; - currentUserHasUpdate = true; - Redraw(); - } + keychainHasUpdate = true; + Redraw(); } private void ValidateCachedData(IRepository repository) { + repository.CheckAndRaiseEventsIfCacheNewer(CacheType.RepositoryInfo, lastCurrentRemoteChangedEvent); repository.CheckAndRaiseEventsIfCacheNewer(CacheType.GitLocks, lastLocksChangedEvent); repository.CheckAndRaiseEventsIfCacheNewer(CacheType.GitStatus, lastStatusEntriesChangedEvent); - User.CheckAndRaiseEventsIfCacheNewer(CacheType.GitUser, lastUserChangedEvent); } private void MaybeUpdateData() @@ -584,15 +594,33 @@ private void MaybeUpdateData() return; } - if (currentUserHasUpdate) + if (keychainHasUpdate || currentRemoteHasUpdate) { - //TODO: ONE_USER_LOGIN This assumes only ever one user can login - var keychainConnection = Platform.Keychain.Connections.FirstOrDefault(); - if (keychainConnection != null) - currentUsername = keychainConnection.Username; + Connection[] connections; + if (HasRepository && !string.IsNullOrEmpty(Repository.CloneUrl)) + { + var host = Repository.CloneUrl + .ToRepositoryUri() + .GetComponents(UriComponents.Host, UriFormat.SafeUnescaped); + + connections = Platform.Keychain.Connections.OrderByDescending(x => x.Host == host).ToArray(); + } + else + { + connections = Platform.Keychain.Connections.OrderByDescending(HostAddress.IsGitHubDotCom).ToArray(); + } + + if (connections.Any()) + { + currentUsername = connections.First().Username; + } else + { currentUsername = ""; - currentUserHasUpdate = false; + } + + keychainHasUpdate = false; + currentRemoteHasUpdate = false; } if (currentLocksHasUpdate) From 692b7c6a52473401834059fbd1161c05482a74ed Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Thu, 29 Nov 2018 11:00:07 -0500 Subject: [PATCH 3/4] Adding the currentUsername check to ProjectWindowInterface --- .../GitHub.Unity/UI/ProjectWindowInterface.cs | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs index 97cbc521e..805286ed8 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs @@ -18,7 +18,7 @@ class ProjectWindowInterface : AssetPostprocessor private static List locks = new List(); private static List guids = new List(); private static List guidsLocks = new List(); - private static string loggedInUser; + private static string currentUsername; private static IApplicationManager manager; private static bool isBusy = false; @@ -26,6 +26,7 @@ class ProjectWindowInterface : AssetPostprocessor private static ILogging Logger { get { return logger = logger ?? LogHelper.GetLogger(); } } private static CacheUpdateEvent lastRepositoryStatusChangedEvent; private static CacheUpdateEvent lastLocksChangedEvent; + private static CacheUpdateEvent lastCurrentRemoteChangedEvent; private static IRepository Repository { get { return manager != null ? manager.Environment.Repository : null; } } private static IPlatform Platform { get { return manager != null ? manager.Platform : null; } } private static bool IsInitialized { get { return Repository != null; } } @@ -37,13 +38,14 @@ public static void Initialize(IApplicationManager theManager) manager = theManager; - Platform.Keychain.ConnectionsChanged += KeychainMayHaveChanged; - KeychainMayHaveChanged(); + Platform.Keychain.ConnectionsChanged += UpdateCurrentUsername; + UpdateCurrentUsername(); if (IsInitialized) { Repository.StatusEntriesChanged += RepositoryOnStatusEntriesChanged; Repository.LocksChanged += RepositoryOnLocksChanged; + Repository.CurrentRemoteChanged += RepositoryOnCurrentRemoteChanged; ValidateCachedData(); } } @@ -88,9 +90,39 @@ private static void RepositoryOnLocksChanged(CacheUpdateEvent cacheUpdateEvent) } } - private static void KeychainMayHaveChanged() + private static void RepositoryOnCurrentRemoteChanged(CacheUpdateEvent cacheUpdateEvent) { - loggedInUser = Platform.Keychain.Connections.Select(x => x.Username).FirstOrDefault(); + if (!lastCurrentRemoteChangedEvent.Equals(cacheUpdateEvent)) + { + lastCurrentRemoteChangedEvent = cacheUpdateEvent; + } + } + + private static void UpdateCurrentUsername() + { + var username = String.Empty; + if (Repository != null) + { + Connection[] connections; + if (!string.IsNullOrEmpty(Repository.CloneUrl)) + { + var host = Repository.CloneUrl.ToRepositoryUri() + .GetComponents(UriComponents.Host, UriFormat.SafeUnescaped); + + connections = Platform.Keychain.Connections.OrderByDescending(x => x.Host == host).ToArray(); + } + else + { + connections = Platform.Keychain.Connections.OrderByDescending(HostAddress.IsGitHubDotCom).ToArray(); + } + + if (connections.Any()) + { + username = connections.First().Username; + } + } + + currentUsername = username; } [MenuItem(AssetsMenuRequestLock, true, 10000)] @@ -202,7 +234,7 @@ private static bool IsObjectLocked(Object selected, bool isLockedByCurrentUser) NPath assetPath = AssetDatabase.GetAssetPath(selected.GetInstanceID()).ToNPath(); NPath repositoryPath = manager.Environment.GetRepositoryPath(assetPath); - return locks.Any(x => repositoryPath == x.Path && (!isLockedByCurrentUser || x.Owner.Name == loggedInUser)); + return locks.Any(x => repositoryPath == x.Path && (!isLockedByCurrentUser || x.Owner.Name == currentUsername)); } private static ITask CreateUnlockObjectTask(Object selected, bool force) From 45d44fef680d6cf17980ed399d3e9a8509ea9403 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Thu, 29 Nov 2018 11:07:18 -0500 Subject: [PATCH 4/4] Cleanup --- .../Editor/GitHub.Unity/UI/LocksView.cs | 38 ++++++++++--------- .../GitHub.Unity/UI/ProjectWindowInterface.cs | 13 ++++--- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs index b8824459c..0b22ee253 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs @@ -596,29 +596,31 @@ private void MaybeUpdateData() if (keychainHasUpdate || currentRemoteHasUpdate) { - Connection[] connections; - if (HasRepository && !string.IsNullOrEmpty(Repository.CloneUrl)) + var username = String.Empty; + if (Repository != null) { - var host = Repository.CloneUrl - .ToRepositoryUri() - .GetComponents(UriComponents.Host, UriFormat.SafeUnescaped); + Connection connection; + if (!string.IsNullOrEmpty(Repository.CloneUrl)) + { + var host = Repository.CloneUrl + .ToRepositoryUri() + .GetComponents(UriComponents.Host, UriFormat.SafeUnescaped); - connections = Platform.Keychain.Connections.OrderByDescending(x => x.Host == host).ToArray(); - } - else - { - connections = Platform.Keychain.Connections.OrderByDescending(HostAddress.IsGitHubDotCom).ToArray(); - } + connection = Platform.Keychain.Connections.FirstOrDefault(x => x.Host == host); + } + else + { + connection = Platform.Keychain.Connections.FirstOrDefault(HostAddress.IsGitHubDotCom); + } - if (connections.Any()) - { - currentUsername = connections.First().Username; - } - else - { - currentUsername = ""; + if (connection != null) + { + username = connection.Username; + } } + currentUsername = username; + keychainHasUpdate = false; currentRemoteHasUpdate = false; } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs index 805286ed8..7e1a9adb3 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ProjectWindowInterface.cs @@ -103,22 +103,23 @@ private static void UpdateCurrentUsername() var username = String.Empty; if (Repository != null) { - Connection[] connections; + Connection connection; if (!string.IsNullOrEmpty(Repository.CloneUrl)) { - var host = Repository.CloneUrl.ToRepositoryUri() + var host = Repository.CloneUrl + .ToRepositoryUri() .GetComponents(UriComponents.Host, UriFormat.SafeUnescaped); - connections = Platform.Keychain.Connections.OrderByDescending(x => x.Host == host).ToArray(); + connection = Platform.Keychain.Connections.FirstOrDefault(x => x.Host == host); } else { - connections = Platform.Keychain.Connections.OrderByDescending(HostAddress.IsGitHubDotCom).ToArray(); + connection = Platform.Keychain.Connections.FirstOrDefault(HostAddress.IsGitHubDotCom); } - if (connections.Any()) + if (connection != null) { - username = connections.First().Username; + username = connection.Username; } }