Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2d0b24b
Merge branch 'fixes/git-client-set-user' into enhancements/git-client…
StanleyGoldman Nov 9, 2017
f08fd3c
Merge branch 'fixes/git-client-set-user' into enhancements/git-client…
StanleyGoldman Nov 13, 2017
7e0f82f
Merge branch 'fixes/git-client-set-user' into enhancements/git-client…
StanleyGoldman Nov 13, 2017
b5351bd
Exposing CurrentUser in GitClient
StanleyGoldman Nov 13, 2017
98a9af3
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
bf459e2
Utilizing the git user cache better
StanleyGoldman Nov 13, 2017
90f1db4
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
06d801a
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
e5056f1
Merge branch 'fixes/repository-manager-warning' into enhancements/git…
StanleyGoldman Nov 13, 2017
088ed69
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
d4f5576
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
46c8dde
Reordering functions
StanleyGoldman Nov 13, 2017
92cea97
More code formatting
StanleyGoldman Nov 13, 2017
3e9aa3d
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
1de70d6
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 13, 2017
60312fd
Migrating Caching of user data from GitClient to User
StanleyGoldman Nov 20, 2017
9643fb8
Serialize the name and email directly
StanleyGoldman Nov 20, 2017
e61025b
Merge branch 'enhancements/using-cache-invalidated-events' into enhan…
StanleyGoldman Nov 20, 2017
e54fef8
GitName and GitEmail might be null themselves
StanleyGoldman Nov 20, 2017
7ac73ec
Moving functionality to set name and email
StanleyGoldman Nov 20, 2017
03e1f7d
Checking if gitClient is null
StanleyGoldman Nov 20, 2017
1b89aee
Renaming event
StanleyGoldman Nov 20, 2017
c74b1ea
Renaming method
StanleyGoldman Nov 20, 2017
293f150
Updating needsSaving after we get an update from the cache
StanleyGoldman Nov 20, 2017
d99a9a2
Merge branch 'master' into enhancements/git-client-cache
StanleyGoldman Nov 20, 2017
0d2f8a0
Renaming ShouldRaiseCacheEvent to IsLastUpdatedTimeDifferent
StanleyGoldman Nov 21, 2017
675064b
Merge branch 'fixes/settings-view-repository-null' into enhancements/…
StanleyGoldman Nov 21, 2017
8e42a42
Merge branch 'fixes/date-time-format-string' into enhancements/git-cl…
StanleyGoldman Nov 21, 2017
2e16908
Merge branch 'master' into enhancements/git-client-cache
StanleyGoldman Nov 21, 2017
1db3448
Merge branch 'master' into enhancements/git-client-cache
StanleyGoldman Nov 22, 2017
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
1 change: 1 addition & 0 deletions src/GitHub.Api/Application/ApplicationManagerBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ private async Task SetupGit()
}
}

Environment.User.Initialize(GitClient);
}

public ITask InitializeRepository()
Expand Down
3 changes: 2 additions & 1 deletion src/GitHub.Api/Cache/CacheInterfaces.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
34 changes: 28 additions & 6 deletions src/GitHub.Api/Git/GitClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ITask<string> GetConfig(string key, GitConfigSource configSource,
ITask<string> SetConfig(string key, string value, GitConfigSource configSource,
IOutputProcessor<string> processor = null);

ITask<User> GetConfigUserAndEmail();
ITask<GitUser> GetConfigUserAndEmail();

ITask<List<GitLock>> ListLocks(bool local,
BaseOutputListProcessor<GitLock> processor = null);
Expand Down Expand Up @@ -84,7 +84,7 @@ ITask<string> Unlock(string file, bool force,

ITask<Version> LfsVersion(IOutputProcessor<Version> processor = null);

ITask<User> SetConfigUserAndEmail(string username, string email);
ITask<GitUser> SetConfigNameAndEmail(string username, string email);
}

class GitClient : IGitClient
Expand Down Expand Up @@ -259,7 +259,7 @@ public ITask<string> SetConfig(string key, string value, GitConfigSource configS
.Configure(processManager);
}

public ITask<User> GetConfigUserAndEmail()
public ITask<GitUser> GetConfigUserAndEmail()
{
string username = null;
string email = null;
Expand All @@ -279,15 +279,15 @@ public ITask<User> 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<User> SetConfigUserAndEmail(string username, string email)
public ITask<GitUser> 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<List<GitLock>> ListLocks(bool local, BaseOutputListProcessor<GitLock> processor = null)
Expand Down Expand Up @@ -464,4 +464,26 @@ public ITask<string> Unlock(string file, bool force,

protected static ILogging Logger { get; } = Logging.GetLogger<GitClient>();
}

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}\"";
}
}
}
1 change: 0 additions & 1 deletion src/GitHub.Api/Git/IRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ public interface IRepository : IEquatable<IRepository>
GitRemote[] Remotes { get; }
GitBranch[] LocalBranches { get; }
GitBranch[] RemoteBranches { get; }
IUser User { get; set; }
List<GitLock> CurrentLocks { get; }
string CurrentBranchName { get; }
List<GitLogEntry> CurrentLog { get; }
Expand Down
21 changes: 21 additions & 0 deletions src/GitHub.Api/Git/ManagedCacheExtensions.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
140 changes: 113 additions & 27 deletions src/GitHub.Api/Git/Repository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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<Repository>();
}

public interface IUser
{
string Name { get; set; }
string Email { get; set; }
string Name { get; }
string Email { get; }
event Action<CacheUpdateEvent> 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<CacheUpdateEvent> Changed;

public User(ICacheContainer cacheContainer)
{
this.cacheContainer = cacheContainer;

cacheContainer.GitUserCache.CacheInvalidated += GitUserCacheOnCacheInvalidated;
cacheContainer.GitUserCache.CacheUpdated += GitUserCacheOnCacheUpdated;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will the User objects never need to be GCd? Adding these event handlers will mean that cacheContainer.GitUserCache will retain a reference to each User object.

Copy link
Contributor Author

@StanleyGoldman StanleyGoldman Nov 21, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

User and Repository are found on DefaultEnvironment.

IUser User { get; set; }
IRepository Repository { get; set; }

public IRepository Repository { get; set; }
public IUser User { get; set; }

There is generally only one instance of User and Repository in the system created at specific points of initialization.

User = new User(CacheContainer);

Repository = new Repository(RepositoryPath, CacheContainer);

These objects are only "destroyed" when the domain reloads.

When they are constructed (either the first time or after a domain reload) these objects are being fed a CacheContainer. It will take a moment on some other threads for the User and Repository objects to get what they need to be fully functioning (they both have Initialize methods for that).

These objects store their data in file based caches specifically for this reason. Until they are fully functioning, they get to use their file based cache to supply data to the user interface.

}

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<User>();
}

[Serializable]
Expand Down
12 changes: 0 additions & 12 deletions src/GitHub.Api/Git/RepositoryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace GitHub.Unity
public interface IRepositoryManager : IDisposable
{
event Action<ConfigBranch?, ConfigRemote?> OnCurrentBranchAndRemoteUpdated;
event Action<IUser> OnGitUserLoaded;
event Action<bool> OnIsBusyChanged;
event Action<string> OnLocalBranchAdded;
event Action<Dictionary<string, ConfigBranch>> OnLocalBranchListUpdated;
Expand Down Expand Up @@ -101,7 +100,6 @@ class RepositoryManager : IRepositoryManager
private bool isBusy;

public event Action<ConfigBranch?, ConfigRemote?> OnCurrentBranchAndRemoteUpdated;
public event Action<IUser> OnGitUserLoaded;
public event Action<bool> OnIsBusyChanged;
public event Action<string> OnLocalBranchAdded;
public event Action<Dictionary<string, ConfigBranch>> OnLocalBranchListUpdated;
Expand Down Expand Up @@ -149,7 +147,6 @@ public void Start()
Logger.Trace("Start");

UpdateConfigData();
LoadGitUser();
watcher.Start();
}

Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/GitHub.Api/GitHub.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
<Compile Include="Application\Organization.cs" />
<Compile Include="Cache\CacheInterfaces.cs" />
<Compile Include="Extensions\ListExtensions.cs" />
<Compile Include="Git\ManagedCacheExtensions.cs" />
<Compile Include="Git\Tasks\GitLfsVersionTask.cs" />
<Compile Include="Git\Tasks\GitVersionTask.cs" />
<Compile Include="Git\ValidateGitInstallResult.cs" />
Expand Down
Loading