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

Commit 3b9521d

Browse files
Merge branch 'enhancements/branches-view-rollup' into fixes/change-selection-before-context-menu
2 parents 8628674 + f7c6ca3 commit 3b9521d

File tree

9 files changed

+196
-107
lines changed

9 files changed

+196
-107
lines changed

src/GitHub.Api/Cache/CacheInterfaces.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public enum CacheType
88
RepositoryInfoCache,
99
BranchCache,
1010
GitLogCache,
11-
GitStatusCache,
11+
GitTrackingStatusCache,
12+
GitStatusEntriesCache,
1213
GitLocksCache,
1314
GitUserCache
1415
}
@@ -20,7 +21,8 @@ public interface ICacheContainer
2021

2122
IBranchCache BranchCache { get; }
2223
IGitLogCache GitLogCache { get; }
23-
IGitStatusCache GitStatusCache { get; }
24+
IGitTrackingStatusCache GitTrackingStatusCache { get; }
25+
IGitStatusEntriesCache GitStatusEntriesCache { get; }
2426
IGitLocksCache GitLocksCache { get; }
2527
IGitUserCache GitUserCache { get; }
2628
IRepositoryInfoCache RepositoryInfoCache { get; }
@@ -53,10 +55,14 @@ public interface IGitUserCache : IManagedCache
5355
string Email { get; set; }
5456
}
5557

56-
public interface IGitStatusCache : IManagedCache
58+
public interface IGitTrackingStatusCache : IManagedCache
5759
{
5860
int Ahead { get; set; }
5961
int Behind { get; set; }
62+
}
63+
64+
public interface IGitStatusEntriesCache : IManagedCache
65+
{
6066
List<GitStatusEntry> Entries { get; set; }
6167
}
6268

src/GitHub.Api/Git/IRepository.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public interface IRepository : IEquatable<IRepository>
2121

2222
void CheckLogChangedEvent(CacheUpdateEvent gitLogCacheUpdateEvent);
2323
void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent);
24+
void CheckStatusEntriesChangedEvent(CacheUpdateEvent cacheUpdateEvent);
2425
void CheckCurrentBranchChangedEvent(CacheUpdateEvent cacheUpdateEvent);
2526
void CheckCurrentRemoteChangedEvent(CacheUpdateEvent cacheUpdateEvent);
2627
void CheckCurrentBranchAndRemoteChangedEvent(CacheUpdateEvent cacheUpdateEvent);
@@ -68,7 +69,8 @@ public interface IRepository : IEquatable<IRepository>
6869
List<GitLogEntry> CurrentLog { get; }
6970

7071
event Action<CacheUpdateEvent> LogChanged;
71-
event Action<CacheUpdateEvent> StatusChanged;
72+
event Action<CacheUpdateEvent> TrackingStatusChanged;
73+
event Action<CacheUpdateEvent> StatusEntriesChanged;
7274
event Action<CacheUpdateEvent> CurrentBranchChanged;
7375
event Action<CacheUpdateEvent> CurrentRemoteChanged;
7476
event Action<CacheUpdateEvent> CurrentBranchAndRemoteChanged;

src/GitHub.Api/Git/Repository.cs

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class Repository : IEquatable<Repository>, IRepository
1616
private string name;
1717

1818
public event Action<CacheUpdateEvent> LogChanged;
19-
public event Action<CacheUpdateEvent> StatusChanged;
19+
public event Action<CacheUpdateEvent> TrackingStatusChanged;
20+
public event Action<CacheUpdateEvent> StatusEntriesChanged;
2021
public event Action<CacheUpdateEvent> CurrentBranchChanged;
2122
public event Action<CacheUpdateEvent> CurrentRemoteChanged;
2223
public event Action<CacheUpdateEvent> CurrentBranchAndRemoteChanged;
@@ -116,7 +117,7 @@ public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)
116117
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
117118

118119
Logger.Trace("Check GitLogCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
119-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
120+
cacheUpdateEvent.UpdatedTime, raiseEvent);
120121

121122
if (raiseEvent)
122123
{
@@ -128,17 +129,33 @@ public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)
128129

129130
public void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent)
130131
{
131-
var managedCache = cacheContainer.GitStatusCache;
132+
var managedCache = cacheContainer.GitTrackingStatusCache;
132133
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
133134

134135
Logger.Trace("Check GitStatusCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
135-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
136+
cacheUpdateEvent.UpdatedTime, raiseEvent);
136137

137138
if (raiseEvent)
138139
{
139140
var dateTimeOffset = managedCache.LastUpdatedAt;
140141
var updateEvent = new CacheUpdateEvent { UpdatedTime = dateTimeOffset };
141-
HandleGitStatusCacheUpdatedEvent(updateEvent);
142+
HandleGitTrackingStatusCacheUpdatedEvent(updateEvent);
143+
}
144+
}
145+
146+
public void CheckStatusEntriesChangedEvent(CacheUpdateEvent cacheUpdateEvent)
147+
{
148+
var managedCache = cacheContainer.GitStatusEntriesCache;
149+
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
150+
151+
Logger.Trace("Check GitStatusEntriesCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
152+
cacheUpdateEvent.UpdatedTime, raiseEvent);
153+
154+
if (raiseEvent)
155+
{
156+
var dateTimeOffset = managedCache.LastUpdatedAt;
157+
var updateEvent = new CacheUpdateEvent { UpdatedTime = dateTimeOffset };
158+
HandleGitStatusEntriesCacheUpdatedEvent(updateEvent);
142159
}
143160
}
144161

@@ -163,7 +180,7 @@ private void CheckRepositoryInfoCacheEvent(CacheUpdateEvent cacheUpdateEvent)
163180
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
164181

165182
Logger.Trace("Check RepositoryInfoCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
166-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
183+
cacheUpdateEvent.UpdatedTime, raiseEvent);
167184

168185
if (raiseEvent)
169186
{
@@ -179,7 +196,7 @@ public void CheckLocksChangedEvent(CacheUpdateEvent cacheUpdateEvent)
179196
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
180197

181198
Logger.Trace("Check GitLocksCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
182-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
199+
cacheUpdateEvent.UpdatedTime, raiseEvent);
183200

184201
if (raiseEvent)
185202
{
@@ -242,7 +259,7 @@ private void CheckBranchCacheEvent(CacheUpdateEvent cacheUpdateEvent)
242259
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
243260

244261
Logger.Trace("Check BranchCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
245-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
262+
cacheUpdateEvent.UpdatedTime, raiseEvent);
246263

247264
if (raiseEvent)
248265
{
@@ -263,8 +280,8 @@ private void CacheContainer_OnCacheInvalidated(CacheType cacheType)
263280
repositoryManager?.UpdateGitLog();
264281
break;
265282

266-
case CacheType.GitStatusCache:
267-
repositoryManager?.UpdateGitStatus();
283+
case CacheType.GitTrackingStatusCache:
284+
repositoryManager?.UpdateGitAheadBehindStatus();
268285
break;
269286

270287
case CacheType.GitLocksCache:
@@ -277,6 +294,10 @@ private void CacheContainer_OnCacheInvalidated(CacheType cacheType)
277294
case CacheType.RepositoryInfoCache:
278295
break;
279296

297+
case CacheType.GitStatusEntriesCache:
298+
repositoryManager?.UpdateGitStatus();
299+
break;
300+
280301
default:
281302
throw new ArgumentOutOfRangeException(nameof(cacheType), cacheType, null);
282303
}
@@ -295,8 +316,8 @@ private void CacheContainer_OnCacheUpdated(CacheType cacheType, DateTimeOffset o
295316
HandleGitLogCacheUpdatedEvent(cacheUpdateEvent);
296317
break;
297318

298-
case CacheType.GitStatusCache:
299-
HandleGitStatusCacheUpdatedEvent(cacheUpdateEvent);
319+
case CacheType.GitTrackingStatusCache:
320+
HandleGitTrackingStatusCacheUpdatedEvent(cacheUpdateEvent);
300321
break;
301322

302323
case CacheType.GitLocksCache:
@@ -310,6 +331,10 @@ private void CacheContainer_OnCacheUpdated(CacheType cacheType, DateTimeOffset o
310331
HandleRepositoryInfoCacheUpdatedEvent(cacheUpdateEvent);
311332
break;
312333

334+
case CacheType.GitStatusEntriesCache:
335+
HandleGitStatusEntriesCacheUpdatedEvent(cacheUpdateEvent);
336+
break;
337+
313338
default:
314339
throw new ArgumentOutOfRangeException(nameof(cacheType), cacheType, null);
315340
}
@@ -329,10 +354,16 @@ private void HandleGitLocksCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
329354
LocksChanged?.Invoke(cacheUpdateEvent);
330355
}
331356

332-
private void HandleGitStatusCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
357+
private void HandleGitTrackingStatusCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
358+
{
359+
Logger.Trace("GitTrackingStatusCache Updated {0}", cacheUpdateEvent.UpdatedTimeString);
360+
TrackingStatusChanged?.Invoke(cacheUpdateEvent);
361+
}
362+
363+
private void HandleGitStatusEntriesCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
333364
{
334-
Logger.Trace("GitStatusCache Updated {0}", cacheUpdateEvent.UpdatedTimeString);
335-
StatusChanged?.Invoke(cacheUpdateEvent);
365+
Logger.Trace("GitStatusEntriesCache Updated {0}", cacheUpdateEvent.UpdatedTimeString);
366+
StatusEntriesChanged?.Invoke(cacheUpdateEvent);
336367
}
337368

338369
private void HandleGitLogCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
@@ -498,20 +529,20 @@ private ConfigRemote? CurrentConfigRemote
498529

499530
public int CurrentAhead
500531
{
501-
get { return cacheContainer.GitStatusCache.Ahead; }
502-
private set { cacheContainer.GitStatusCache.Ahead = value; }
532+
get { return cacheContainer.GitTrackingStatusCache.Ahead; }
533+
private set { cacheContainer.GitTrackingStatusCache.Ahead = value; }
503534
}
504535

505536
public int CurrentBehind
506537
{
507-
get { return cacheContainer.GitStatusCache.Behind; }
508-
private set { cacheContainer.GitStatusCache.Behind = value; }
538+
get { return cacheContainer.GitTrackingStatusCache.Behind; }
539+
private set { cacheContainer.GitTrackingStatusCache.Behind = value; }
509540
}
510541

511542
public List<GitStatusEntry> CurrentChanges
512543
{
513-
get { return cacheContainer.GitStatusCache.Entries; }
514-
private set { cacheContainer.GitStatusCache.Entries = value; }
544+
get { return cacheContainer.GitStatusEntriesCache.Entries; }
545+
private set { cacheContainer.GitStatusEntriesCache.Entries = value; }
515546
}
516547

517548
public GitBranch? CurrentBranch
@@ -629,7 +660,7 @@ public void CheckUserChangedEvent(CacheUpdateEvent cacheUpdateEvent)
629660
var raiseEvent = managedCache.LastUpdatedAt != cacheUpdateEvent.UpdatedTime;
630661

631662
Logger.Trace("Check GitUserCache CacheUpdateEvent Current:{0} Check:{1} Result:{2}", managedCache.LastUpdatedAt,
632-
cacheUpdateEvent.UpdatedTimeString ?? "[NULL]", raiseEvent);
663+
cacheUpdateEvent.UpdatedTime, raiseEvent);
633664

634665
if (raiseEvent)
635666
{
@@ -694,7 +725,7 @@ private void GitUserCacheOnCacheInvalidated()
694725

695726
private void HandleUserCacheUpdatedEvent(CacheUpdateEvent cacheUpdateEvent)
696727
{
697-
Logger.Trace("GitUserCache Updated {0}", cacheUpdateEvent.UpdatedTimeString);
728+
Logger.Trace("GitUserCache Updated {0}", cacheUpdateEvent.UpdatedTime);
698729
Changed?.Invoke(cacheUpdateEvent);
699730
}
700731

@@ -726,15 +757,23 @@ private void UpdateUserAndEmail()
726757
public struct CacheUpdateEvent
727758
{
728759
[NonSerialized] private DateTimeOffset? updatedTimeValue;
729-
private string updatedTimeString;
760+
public string updatedTimeString;
730761

731762
public DateTimeOffset UpdatedTime
732763
{
733764
get
734765
{
735766
if (!updatedTimeValue.HasValue)
736767
{
737-
UpdatedTime = DateTimeOffset.MinValue;
768+
DateTimeOffset result;
769+
if (DateTimeOffset.TryParseExact(updatedTimeString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
770+
{
771+
updatedTimeValue = result;
772+
}
773+
else
774+
{
775+
UpdatedTime = DateTimeOffset.MinValue;
776+
}
738777
}
739778

740779
return updatedTimeValue.Value;

0 commit comments

Comments
 (0)