Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit a8ef148

Browse files
committed
Surface number of submodules to sync
Change IsSyncSubmodulesRequired to CountSubmodulesToSync.
1 parent 7a75448 commit a8ef148

File tree

4 files changed

+48
-50
lines changed

4 files changed

+48
-50
lines changed

src/GitHub.App/Services/PullRequestService.cs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -104,36 +104,33 @@ public IObservable<IReadOnlyList<CommitMessage>> GetMessagesForUniqueCommits(
104104
});
105105
}
106106

107-
public IObservable<bool> IsSyncSubmodulesRequired(ILocalRepositoryModel repository)
107+
public IObservable<int> CountSubmodulesToSync(ILocalRepositoryModel repository)
108108
{
109109
using (var repo = gitService.GetRepository(repository.LocalPath))
110110
{
111+
var count = 0;
111112
foreach (var submodule in repo.Submodules)
112113
{
113114
var status = submodule.RetrieveStatus();
114-
115115
if ((status & SubmoduleStatus.WorkDirAdded) != 0)
116116
{
117-
return Observable.Return(true);
117+
count++;
118118
}
119-
120-
if ((status & SubmoduleStatus.WorkDirDeleted) != 0)
119+
else if ((status & SubmoduleStatus.WorkDirDeleted) != 0)
121120
{
122-
return Observable.Return(true);
121+
count++;
123122
}
124-
125-
if ((status & SubmoduleStatus.WorkDirModified) != 0)
123+
else if ((status & SubmoduleStatus.WorkDirModified) != 0)
126124
{
127-
return Observable.Return(true);
125+
count++;
128126
}
129-
130-
if ((status & SubmoduleStatus.WorkDirUninitialized) != 0)
127+
else if ((status & SubmoduleStatus.WorkDirUninitialized) != 0)
131128
{
132-
return Observable.Return(true);
129+
count++;
133130
}
134131
}
135132

136-
return Observable.Return(false);
133+
return Observable.Return(count);
137134
}
138135
}
139136

src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -408,9 +408,9 @@ public async Task Load(IPullRequestModel pullRequest)
408408
pushToolTip = Resources.MustPullBeforePush;
409409
}
410410

411-
var syncSubmodulesEnabled = await pullRequestsService.IsSyncSubmodulesRequired(LocalRepository);
411+
var submodulesToSync = await pullRequestsService.CountSubmodulesToSync(LocalRepository);
412412

413-
UpdateState = new UpdateCommandState(divergence, pullEnabled, pushEnabled, pullToolTip, pushToolTip, syncSubmodulesEnabled);
413+
UpdateState = new UpdateCommandState(divergence, pullEnabled, pushEnabled, pullToolTip, pushToolTip, submodulesToSync);
414414
CheckoutState = null;
415415
}
416416
else
@@ -707,15 +707,15 @@ public UpdateCommandState(
707707
bool pushEnabled,
708708
string pullToolTip,
709709
string pushToolTip,
710-
bool syncSubmodulesEnabled)
710+
int submodulesToSync)
711711
{
712712
CommitsAhead = divergence.AheadBy ?? 0;
713713
CommitsBehind = divergence.BehindBy ?? 0;
714714
PushEnabled = pushEnabled;
715715
PullEnabled = pullEnabled;
716716
PullToolTip = pullToolTip;
717717
PushToolTip = pushToolTip;
718-
SyncSubmodulesEnabled = syncSubmodulesEnabled;
718+
SubmodulesToSync = submodulesToSync;
719719
}
720720

721721
public int CommitsAhead { get; }
@@ -725,7 +725,8 @@ public UpdateCommandState(
725725
public bool PushEnabled { get; }
726726
public string PullToolTip { get; }
727727
public string PushToolTip { get; }
728-
public bool SyncSubmodulesEnabled { get; }
728+
public bool SyncSubmodulesEnabled => SubmodulesToSync > 0;
729+
public int SubmodulesToSync { get; }
729730
}
730731
}
731732
}

src/GitHub.Exports.Reactive/Services/IPullRequestService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ IObservable<IPullRequestModel> CreatePullRequest(IModelService modelService,
2525
IObservable<bool> IsWorkingDirectoryClean(ILocalRepositoryModel repository);
2626

2727
/// <summary>
28-
/// Check if user needs to sync submodules on current branch.
28+
/// Count the number of submodules that require syncing.
2929
/// </summary>
3030
/// <param name="repository">The repository.</param>
31-
/// <returns>True if submodules need to be synced.</returns>
32-
IObservable<bool> IsSyncSubmodulesRequired(ILocalRepositoryModel repository);
31+
/// <returns>The number of submodules that need to be synced.</returns>
32+
IObservable<int> CountSubmodulesToSync(ILocalRepositoryModel repository);
3333

3434
/// <summary>
3535
/// Checks out a pull request to a local branch.

test/UnitTests/GitHub.App/Services/PullRequestServiceTests.cs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public async Task ChangedSubmodule_True()
253253
}
254254
}
255255

256-
public class TheIsSyncSubmodulesRequiredMethod
256+
public class TheCountSubmodulesToSyncMethod
257257
{
258258
[Fact] // WorkDirDeleted
259259
public async Task CommittedSubmodule_True()
@@ -269,9 +269,9 @@ public async Task CommittedSubmodule_True()
269269
var service = CreatePullRequestService(repo);
270270
var repositoryModel = CreateLocalRepositoryModel(repo);
271271

272-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
272+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
273273

274-
Assert.True(isRequired);
274+
Assert.Equal(1, count);
275275
}
276276
}
277277

@@ -292,9 +292,9 @@ public async Task UninitializedSubmodule_True()
292292
var service = CreatePullRequestService(repo);
293293
var repositoryModel = CreateLocalRepositoryModel(repo);
294294

295-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
295+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
296296

297-
Assert.True(isRequired);
297+
Assert.Equal(1, count);
298298
}
299299
}
300300

@@ -316,9 +316,9 @@ public async Task ChangedSubmodule_True()
316316
var service = CreatePullRequestService(repo);
317317
var repositoryModel = CreateLocalRepositoryModel(repo);
318318

319-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
319+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
320320

321-
Assert.True(isRequired);
321+
Assert.Equal(1, count);
322322
}
323323
}
324324

@@ -339,9 +339,9 @@ public async Task UpdatedSubmodule_False()
339339
var service = CreatePullRequestService(repo);
340340
var repositoryModel = CreateLocalRepositoryModel(repo);
341341

342-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
342+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
343343

344-
Assert.False(isRequired);
344+
Assert.Equal(0, count);
345345
}
346346
}
347347

@@ -354,9 +354,9 @@ public async Task NewRepo_False()
354354
var service = CreatePullRequestService(repo);
355355
var repositoryModel = CreateLocalRepositoryModel(repo);
356356

357-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
357+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
358358

359-
Assert.False(isRequired);
359+
Assert.Equal(0, count);
360360
}
361361
}
362362

@@ -371,9 +371,9 @@ public async Task UntrackedFile_False()
371371
var file = Path.Combine(repo.Info.WorkingDirectory, "file.txt");
372372
File.WriteAllText(file, "contents");
373373

374-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
374+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
375375

376-
Assert.False(isRequired);
376+
Assert.Equal(0, count);
377377
}
378378
}
379379

@@ -390,9 +390,9 @@ public async Task CommitFile_False()
390390
Commands.Stage(repo, file);
391391
repo.Commit("foo", Author, Author);
392392

393-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
393+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
394394

395-
Assert.False(isRequired);
395+
Assert.Equal(0, count);
396396
}
397397
}
398398

@@ -409,9 +409,9 @@ public async Task AddedFile_False()
409409
File.WriteAllText(file, "contents");
410410
Commands.Stage(repo, path);
411411

412-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
412+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
413413

414-
Assert.False(isRequired);
414+
Assert.Equal(0, count);
415415
}
416416
}
417417

@@ -430,9 +430,9 @@ public async Task ModifiedFile_False()
430430
repo.Commit("foo", Author, Author);
431431
File.WriteAllText(file, "contents2");
432432

433-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
433+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
434434

435-
Assert.False(isRequired);
435+
Assert.Equal(0, count);
436436
}
437437
}
438438

@@ -452,9 +452,9 @@ public async Task StagedFile_False()
452452
File.WriteAllText(file, "contents2");
453453
Commands.Stage(repo, path);
454454

455-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
455+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
456456

457-
Assert.False(isRequired);
457+
Assert.Equal(0, count);
458458
}
459459
}
460460

@@ -473,9 +473,9 @@ public async Task MissingFile_False()
473473
repo.Commit("foo", Author, Author);
474474
File.Delete(file);
475475

476-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
476+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
477477

478-
Assert.False(isRequired);
478+
Assert.Equal(0, count);
479479
}
480480
}
481481

@@ -495,9 +495,9 @@ public async Task RemovedFile_False()
495495
File.Delete(file);
496496
Commands.Stage(repo, path);
497497

498-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
498+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
499499

500-
Assert.False(isRequired);
500+
Assert.Equal(0, count);
501501
}
502502
}
503503

@@ -520,9 +520,9 @@ public async Task RenamedInIndexFile_False()
520520
Commands.Stage(repo, path);
521521
Commands.Stage(repo, renamedPath);
522522

523-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
523+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
524524

525-
Assert.False(isRequired);
525+
Assert.Equal(0, count);
526526
}
527527
}
528528

@@ -546,9 +546,9 @@ public async Task RenamedInWorkingDirFile_False()
546546
// NOTE: `RetrieveStatus(new StatusOptions { DetectRenamesInWorkDir = true })` would need to be used
547547
// for renamed files to appear as `RenamedInWorkingDir` rather than `Missing` and `Untracked`.
548548
// This isn't required in the current implementation.
549-
var isRequired = await service.IsSyncSubmodulesRequired(repositoryModel).FirstAsync();
549+
var count = await service.CountSubmodulesToSync(repositoryModel).FirstAsync();
550550

551-
Assert.False(isRequired);
551+
Assert.Equal(0, count);
552552
}
553553
}
554554
}

0 commit comments

Comments
 (0)