Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Fixing issues where the user has multiple connections #970

Merged
merged 6 commits into from
Dec 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/GitHub.Api/Application/ApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ public void LoginWithToken(string token, Action<bool> result)
Guard.ArgumentNotNull(result, "result");

new FuncTask<bool>(taskManager.Token,
() => loginManager.LoginWithToken(UriString.ToUriString(HostAddress.WebUri), token))
() => loginManager.LoginWithToken(HostAddress.WebUri.Host, token))
.FinallyInUI((success, ex, res) =>
{
if (!success)
Expand Down
74 changes: 52 additions & 22 deletions src/UnityExtension/Assets/Editor/GitHub.Unity/UI/LocksView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<GitLock> lockedFiles = new List<GitLock>();
[SerializeField] private List<GitStatusEntry> gitStatusEntries = new List<GitStatusEntry>();
[SerializeField] private string currentUsername;
Expand All @@ -407,6 +408,7 @@ public override void OnEnable()

AttachHandlers(Repository);
ValidateCachedData(Repository);
KeychainConnectionsChanged();
}

public override void OnDisable()
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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()
Expand All @@ -584,15 +594,35 @@ 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;
else
currentUsername = "";
currentUserHasUpdate = false;
var username = String.Empty;
if (Repository != null)
{
Connection connection;
if (!string.IsNullOrEmpty(Repository.CloneUrl))
{
var host = Repository.CloneUrl
.ToRepositoryUri()
.GetComponents(UriComponents.Host, UriFormat.SafeUnescaped);

connection = Platform.Keychain.Connections.FirstOrDefault(x => x.Host == host);
}
else
{
connection = Platform.Keychain.Connections.FirstOrDefault(HostAddress.IsGitHubDotCom);
}

if (connection != null)
{
username = connection.Username;
}
}

currentUsername = username;

keychainHasUpdate = false;
currentRemoteHasUpdate = false;
}

if (currentLocksHasUpdate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ class ProjectWindowInterface : AssetPostprocessor
private static List<GitLock> locks = new List<GitLock>();
private static List<string> guids = new List<string>();
private static List<string> guidsLocks = new List<string>();
private static string loggedInUser;
private static string currentUsername;

private static IApplicationManager manager;
private static bool isBusy = false;
private static ILogging logger;
private static ILogging Logger { get { return logger = logger ?? LogHelper.GetLogger<ProjectWindowInterface>(); } }
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; } }
Expand All @@ -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();
}
}
Expand Down Expand Up @@ -88,9 +90,40 @@ 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 connection;
if (!string.IsNullOrEmpty(Repository.CloneUrl))
{
var host = Repository.CloneUrl
.ToRepositoryUri()
.GetComponents(UriComponents.Host, UriFormat.SafeUnescaped);

connection = Platform.Keychain.Connections.FirstOrDefault(x => x.Host == host);
}
else
{
connection = Platform.Keychain.Connections.FirstOrDefault(HostAddress.IsGitHubDotCom);
}

if (connection != null)
{
username = connection.Username;
}
}

currentUsername = username;
}

[MenuItem(AssetsMenuRequestLock, true, 10000)]
Expand Down Expand Up @@ -202,7 +235,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)
Expand Down