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

Commit f7fd3e4

Browse files
Merge branch 'master' into enhancements/repository-watcher-refactor-rollup
2 parents 500c279 + 61771b0 commit f7fd3e4

19 files changed

+296
-148
lines changed

appveyor.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,5 @@ artifacts:
6262
type: zip
6363
name: github-for-unity-packageproject
6464
- path: build\*.log
65+
on_failure:
66+
- ps: Get-ChildItem build\*.log | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ private async Task SetupGit()
7878
}
7979
}
8080

81+
Environment.User.Initialize(GitClient);
8182
}
8283

8384
public ITask InitializeRepository()

src/GitHub.Api/Cache/CacheInterfaces.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public interface IGitLocksCache : IManagedCache
4949

5050
public interface IGitUserCache : IManagedCache
5151
{
52-
User User { get; }
52+
string Name { get; set; }
53+
string Email { get; set; }
5354
}
5455

5556
public interface IGitStatusCache : IManagedCache

src/GitHub.Api/Git/GitClient.cs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ITask<string> GetConfig(string key, GitConfigSource configSource,
2323
ITask<string> SetConfig(string key, string value, GitConfigSource configSource,
2424
IOutputProcessor<string> processor = null);
2525

26-
ITask<User> GetConfigUserAndEmail();
26+
ITask<GitUser> GetConfigUserAndEmail();
2727

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

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

87-
ITask<User> SetConfigUserAndEmail(string username, string email);
87+
ITask<GitUser> SetConfigNameAndEmail(string username, string email);
8888
}
8989

9090
class GitClient : IGitClient
@@ -259,7 +259,7 @@ public ITask<string> SetConfig(string key, string value, GitConfigSource configS
259259
.Configure(processManager);
260260
}
261261

262-
public ITask<User> GetConfigUserAndEmail()
262+
public ITask<GitUser> GetConfigUserAndEmail()
263263
{
264264
string username = null;
265265
string email = null;
@@ -279,15 +279,15 @@ public ITask<User> GetConfigUserAndEmail()
279279
}
280280
})).Then(success => {
281281
Logger.Trace("{0}:{1} {2}:{3}", UserNameConfigKey, username, UserEmailConfigKey, email);
282-
return new User { Name = username, Email = email };
282+
return new GitUser(username, email);
283283
});
284284
}
285285

286-
public ITask<User> SetConfigUserAndEmail(string username, string email)
286+
public ITask<GitUser> SetConfigNameAndEmail(string username, string email)
287287
{
288288
return SetConfig(UserNameConfigKey, username, GitConfigSource.User)
289289
.Then(SetConfig(UserEmailConfigKey, email, GitConfigSource.User))
290-
.Then(b => new User { Name = username, Email = email });
290+
.Then(b => new GitUser(username, email));
291291
}
292292

293293
public ITask<List<GitLock>> ListLocks(bool local, BaseOutputListProcessor<GitLock> processor = null)
@@ -464,4 +464,26 @@ public ITask<string> Unlock(string file, bool force,
464464

465465
protected static ILogging Logger { get; } = Logging.GetLogger<GitClient>();
466466
}
467+
468+
public struct GitUser
469+
{
470+
public static GitUser Default = new GitUser();
471+
472+
public string name;
473+
public string email;
474+
475+
public string Name { get { return name; } }
476+
public string Email { get { return email; } }
477+
478+
public GitUser(string name, string email)
479+
{
480+
this.name = name;
481+
this.email = email;
482+
}
483+
484+
public override string ToString()
485+
{
486+
return $"Name:\"{Name}\" Email:\"{Email}\"";
487+
}
488+
}
467489
}

src/GitHub.Api/Git/IRepository.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public interface IRepository : IEquatable<IRepository>
6161
GitRemote[] Remotes { get; }
6262
GitBranch[] LocalBranches { get; }
6363
GitBranch[] RemoteBranches { get; }
64-
IUser User { get; set; }
6564
List<GitLock> CurrentLocks { get; }
6665
string CurrentBranchName { get; }
6766
List<GitLogEntry> CurrentLog { get; }
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
3+
namespace GitHub.Unity
4+
{
5+
static class ManagedCacheExtensions
6+
{
7+
public static bool IsLastUpdatedTimeDifferent(this IManagedCache managedCache, CacheUpdateEvent cacheUpdateEvent)
8+
{
9+
bool isDifferent;
10+
if (cacheUpdateEvent.UpdatedTimeString == null)
11+
{
12+
isDifferent = managedCache.LastUpdatedAt != DateTimeOffset.MinValue;
13+
}
14+
else
15+
{
16+
isDifferent = managedCache.LastUpdatedAt.ToString() != cacheUpdateEvent.UpdatedTimeString;
17+
}
18+
return isDifferent;
19+
}
20+
}
21+
}

src/GitHub.Api/Git/Repository.cs

Lines changed: 113 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public Repository(NPath localPath, ICacheContainer container)
3535
Guard.ArgumentNotNull(localPath, nameof(localPath));
3636

3737
LocalPath = localPath;
38-
User = new User();
3938

4039
cacheContainer = container;
4140
cacheContainer.CacheInvalidated += CacheContainer_OnCacheInvalidated;
@@ -57,7 +56,6 @@ public void Initialize(IRepositoryManager initRepositoryManager)
5756
repositoryManager.OnLocalBranchRemoved += RepositoryManager_OnLocalBranchRemoved;
5857
repositoryManager.OnRemoteBranchAdded += RepositoryManager_OnRemoteBranchAdded;
5958
repositoryManager.OnRemoteBranchRemoved += RepositoryManager_OnRemoteBranchRemoved;
60-
repositoryManager.OnGitUserLoaded += user => User = user;
6159
}
6260

6361
public ITask SetupRemote(string remote, string remoteUrl)
@@ -120,7 +118,7 @@ public ITask ReleaseLock(string file, bool force)
120118
public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)
121119
{
122120
var managedCache = cacheContainer.GitLogCache;
123-
var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache);
121+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent);
124122

125123
Logger.Trace("Check GitLogCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
126124
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
@@ -136,7 +134,7 @@ public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)
136134
public void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent)
137135
{
138136
var managedCache = cacheContainer.GitStatusCache;
139-
var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache);
137+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent);
140138

141139
Logger.Trace("Check GitStatusCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
142140
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
@@ -167,7 +165,7 @@ public void CheckCurrentBranchAndRemoteChangedEvent(CacheUpdateEvent cacheUpdate
167165
private void CheckRepositoryInfoCacheEvent(CacheUpdateEvent cacheUpdateEvent)
168166
{
169167
var managedCache = cacheContainer.RepositoryInfoCache;
170-
var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache);
168+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent);
171169

172170
Logger.Trace("Check RepositoryInfoCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
173171
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
@@ -184,7 +182,7 @@ public void CheckLocksChangedEvent(CacheUpdateEvent cacheUpdateEvent)
184182
{
185183
CacheUpdateEvent cacheUpdateEvent1 = cacheUpdateEvent;
186184
var managedCache = cacheContainer.GitLocksCache;
187-
var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent1, managedCache);
185+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent1);
188186

189187
Logger.Trace("Check GitLocksCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
190188
cacheUpdateEvent1.UpdatedTimeString ?? "[NULL]", raiseEvent);
@@ -247,7 +245,7 @@ public bool Equals(IRepository other)
247245
private void CheckBranchCacheEvent(CacheUpdateEvent cacheUpdateEvent)
248246
{
249247
var managedCache = cacheContainer.BranchCache;
250-
var raiseEvent = ShouldRaiseCacheEvent(cacheUpdateEvent, managedCache);
248+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent);
251249

252250
Logger.Trace("Check BranchCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
253251
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
@@ -260,20 +258,6 @@ private void CheckBranchCacheEvent(CacheUpdateEvent cacheUpdateEvent)
260258
}
261259
}
262260

263-
private static bool ShouldRaiseCacheEvent(CacheUpdateEvent cacheUpdateEvent, IManagedCache managedCache)
264-
{
265-
bool raiseEvent;
266-
if (cacheUpdateEvent.UpdatedTimeString == null)
267-
{
268-
raiseEvent = managedCache.LastUpdatedAt != DateTimeOffset.MinValue;
269-
}
270-
else
271-
{
272-
raiseEvent = managedCache.LastUpdatedAt.ToString() != cacheUpdateEvent.UpdatedTimeString;
273-
}
274-
return raiseEvent;
275-
}
276-
277261
private void CacheContainer_OnCacheInvalidated(CacheType cacheType)
278262
{
279263
switch (cacheType)
@@ -642,27 +626,129 @@ public bool IsGitHub
642626
"{0} Owner: {1} Name: {2} CloneUrl: {3} LocalPath: {4} Branch: {5} Remote: {6}", GetHashCode(), Owner, Name,
643627
CloneUrl, LocalPath, CurrentBranch, CurrentRemote);
644628

645-
public IUser User { get; set; }
646-
647629
protected static ILogging Logger { get; } = Logging.GetLogger<Repository>();
648630
}
649631

650632
public interface IUser
651633
{
652-
string Name { get; set; }
653-
string Email { get; set; }
634+
string Name { get; }
635+
string Email { get; }
636+
event Action<CacheUpdateEvent> Changed;
637+
void CheckUserChangedEvent(CacheUpdateEvent cacheUpdateEvent);
638+
void Initialize(IGitClient client);
639+
void SetNameAndEmail(string name, string email);
654640
}
655641

656642
[Serializable]
657643
public class User : IUser
658644
{
645+
private ICacheContainer cacheContainer;
646+
private IGitClient gitClient;
647+
648+
public event Action<CacheUpdateEvent> Changed;
649+
650+
public User(ICacheContainer cacheContainer)
651+
{
652+
this.cacheContainer = cacheContainer;
653+
654+
cacheContainer.GitUserCache.CacheInvalidated += GitUserCacheOnCacheInvalidated;
655+
cacheContainer.GitUserCache.CacheUpdated += GitUserCacheOnCacheUpdated;
656+
}
657+
658+
public void CheckUserChangedEvent(CacheUpdateEvent cacheUpdateEvent)
659+
{
660+
var managedCache = cacheContainer.GitUserCache;
661+
var raiseEvent = managedCache.IsLastUpdatedTimeDifferent(cacheUpdateEvent);
662+
663+
Logger.Trace("Check GitUserCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
664+
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
665+
666+
if (raiseEvent)
667+
{
668+
var dateTimeOffset = managedCache.LastUpdatedAt;
669+
var updateEvent = new CacheUpdateEvent { UpdatedTimeString = dateTimeOffset.ToString() };
670+
HandleUserCacheUpdatedEvent(updateEvent);
671+
}
672+
}
673+
674+
public void Initialize(IGitClient client)
675+
{
676+
Guard.ArgumentNotNull(client, nameof(client));
677+
678+
Logger.Trace("Initialize");
679+
680+
gitClient = client;
681+
UpdateUserAndEmail();
682+
}
683+
684+
public void SetNameAndEmail(string name, string email)
685+
{
686+
gitClient.SetConfigNameAndEmail(name, email)
687+
.ThenInUI((success, value) => {
688+
if (success)
689+
{
690+
Name = value.Name;
691+
Email = value.Email;
692+
}
693+
}).Start();
694+
}
695+
659696
public override string ToString()
660697
{
661698
return String.Format("Name: {0} Email: {1}", Name, Email);
662699
}
663700

664-
public string Name { get; set; }
665-
public string Email { get; set; }
701+
public string Name
702+
{
703+
get { return cacheContainer.GitUserCache.Name; }
704+
private set { cacheContainer.GitUserCache.Name = value; }
705+
}
706+
707+
public string Email
708+
{
709+
get { return cacheContainer.GitUserCache.Email; }
710+
private set { cacheContainer.GitUserCache.Email = value; }
711+
}
712+
713+
private void GitUserCacheOnCacheUpdated(DateTimeOffset timeOffset)
714+
{
715+
HandleUserCacheUpdatedEvent(new CacheUpdateEvent
716+
{
717+
UpdatedTimeString = timeOffset.ToString()
718+
});
719+
}
720+
721+
private void GitUserCacheOnCacheInvalidated()
722+
{
723+
Logger.Trace("GitUserCache Invalidated");
724+
UpdateUserAndEmail();
725+
}
726+
727+
private void HandleUserCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
728+
{
729+
Logger.Trace("GitUserCache Updated {0}", cacheUpdateEvent.UpdatedTimeString);
730+
Changed?.Invoke(cacheUpdateEvent);
731+
}
732+
733+
private void UpdateUserAndEmail()
734+
{
735+
if (gitClient != null)
736+
{
737+
Logger.Trace("UpdateUserAndEmail");
738+
739+
gitClient.GetConfigUserAndEmail()
740+
.ThenInUI((success, value) =>
741+
{
742+
if (success)
743+
{
744+
Name = value.Name;
745+
Email = value.Email;
746+
}
747+
}).Start();
748+
}
749+
}
750+
751+
protected static ILogging Logger { get; } = Logging.GetLogger<User>();
666752
}
667753

668754
[Serializable]

src/GitHub.Api/Git/RepositoryManager.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ namespace GitHub.Unity
88
public interface IRepositoryManager : IDisposable
99
{
1010
event Action<ConfigBranch?, ConfigRemote?> OnCurrentBranchAndRemoteUpdated;
11-
event Action<IUser> OnGitUserLoaded;
1211
event Action<bool> OnIsBusyChanged;
1312
event Action<string> OnLocalBranchAdded;
1413
event Action<Dictionary<string, ConfigBranch>> OnLocalBranchListUpdated;
@@ -100,7 +99,6 @@ class RepositoryManager : IRepositoryManager
10099
private bool isBusy;
101100

102101
public event Action<ConfigBranch?, ConfigRemote?> OnCurrentBranchAndRemoteUpdated;
103-
public event Action<IUser> OnGitUserLoaded;
104102
public event Action<bool> OnIsBusyChanged;
105103
public event Action<string> OnLocalBranchAdded;
106104
public event Action<Dictionary<string, ConfigBranch>> OnLocalBranchListUpdated;
@@ -148,7 +146,6 @@ public void Start()
148146
Logger.Trace("Start");
149147

150148
UpdateConfigData();
151-
LoadGitUser();
152149
watcher.Start();
153150
}
154151

@@ -294,15 +291,6 @@ public ITask UnlockFile(string file, bool force)
294291
return HookupHandlers(task);
295292
}
296293

297-
private void LoadGitUser()
298-
{
299-
GitClient.GetConfigUserAndEmail()
300-
.Then((success, user) => {
301-
Logger.Trace("OnGitUserLoaded: {0}", user);
302-
OnGitUserLoaded?.Invoke(user);
303-
}).Start();
304-
}
305-
306294
private void SetupWatcher()
307295
{
308296
watcher.HeadChanged += Watcher_OnHeadChanged;

src/GitHub.Api/GitHub.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<Compile Include="Application\Organization.cs" />
104104
<Compile Include="Cache\CacheInterfaces.cs" />
105105
<Compile Include="Extensions\ListExtensions.cs" />
106+
<Compile Include="Git\ManagedCacheExtensions.cs" />
106107
<Compile Include="Git\Tasks\GitLfsVersionTask.cs" />
107108
<Compile Include="Git\Tasks\GitVersionTask.cs" />
108109
<Compile Include="Git\ValidateGitInstallResult.cs" />

0 commit comments

Comments
 (0)