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

Commit dae248e

Browse files
authored
Merge pull request #1687 from github/fixes/1686-mark-pr-branch
Mark branch for created PR.
2 parents 8d59a27 + 718cc4b commit dae248e

File tree

5 files changed

+67
-59
lines changed

5 files changed

+67
-59
lines changed

src/GitHub.App/Services/PullRequestService.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,21 @@ public class PullRequestService : IPullRequestService
4141

4242
readonly IGitClient gitClient;
4343
readonly IGitService gitService;
44+
readonly IVSGitExt gitExt;
4445
readonly IOperatingSystem os;
4546
readonly IUsageTracker usageTracker;
4647

4748
[ImportingConstructor]
48-
public PullRequestService(IGitClient gitClient, IGitService gitService, IOperatingSystem os, IUsageTracker usageTracker)
49+
public PullRequestService(
50+
IGitClient gitClient,
51+
IGitService gitService,
52+
IVSGitExt gitExt,
53+
IOperatingSystem os,
54+
IUsageTracker usageTracker)
4955
{
5056
this.gitClient = gitClient;
5157
this.gitService = gitService;
58+
this.gitExt = gitExt;
5259
this.os = os;
5360
this.usageTracker = usageTracker;
5461
}
@@ -652,6 +659,8 @@ async Task<IPullRequestModel> PushAndCreatePR(IModelService modelService,
652659
await Task.Delay(TimeSpan.FromSeconds(5));
653660

654661
var ret = await modelService.CreatePullRequest(sourceRepository, targetRepository, sourceBranch, targetBranch, title, body);
662+
await MarkBranchAsPullRequest(repo, sourceBranch.Name, ret);
663+
gitExt.RefreshActiveRepositories();
655664
await usageTracker.IncrementCounter(x => x.NumberOfUpstreamPullRequests);
656665
return ret;
657666
}

src/GitHub.App/Services/TeamExplorerContext.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using System.ComponentModel;
44
using System.ComponentModel.Composition;
5+
using System.Reactive.Linq;
56
using GitHub.Models;
67
using GitHub.Logging;
78
using GitHub.Primitives;
@@ -29,25 +30,26 @@ public class TeamExplorerContext : ITeamExplorerContext
2930

3031
readonly DTE dte;
3132
readonly IVSGitExt gitExt;
33+
readonly IPullRequestService pullRequestService;
3234

3335
string solutionPath;
3436
string repositoryPath;
3537
UriString cloneUrl;
3638
string branchName;
3739
string headSha;
3840
string trackedSha;
41+
Tuple<string, int> pullRequest;
3942

4043
ILocalRepositoryModel repositoryModel;
4144

4245
[ImportingConstructor]
43-
public TeamExplorerContext(IGitHubServiceProvider serviceProvider, IVSGitExt gitExt)
44-
: this(gitExt, serviceProvider)
45-
{
46-
}
47-
48-
public TeamExplorerContext(IVSGitExt gitExt, IGitHubServiceProvider serviceProvider)
46+
public TeamExplorerContext(
47+
IGitHubServiceProvider serviceProvider,
48+
IVSGitExt gitExt,
49+
IPullRequestService pullRequestService)
4950
{
5051
this.gitExt = gitExt;
52+
this.pullRequestService = pullRequestService;
5153

5254
// This is a standard service which should always be available.
5355
dte = serviceProvider.GetService<DTE>();
@@ -56,7 +58,7 @@ public TeamExplorerContext(IVSGitExt gitExt, IGitHubServiceProvider serviceProvi
5658
gitExt.ActiveRepositoriesChanged += Refresh;
5759
}
5860

59-
void Refresh()
61+
async void Refresh()
6062
{
6163
try
6264
{
@@ -76,6 +78,7 @@ void Refresh()
7678
var newBranchName = repo?.CurrentBranch?.Name;
7779
var newHeadSha = repo?.CurrentBranch?.Sha;
7880
var newTrackedSha = repo?.CurrentBranch?.TrackedSha;
81+
var newPullRequest = await pullRequestService.GetPullRequestForCurrentBranch(repo);
7982

8083
if (newRepositoryPath != repositoryPath)
8184
{
@@ -102,13 +105,19 @@ void Refresh()
102105
log.Debug("Fire StatusChanged event when TrackedSha changes for ActiveRepository");
103106
StatusChanged?.Invoke(this, EventArgs.Empty);
104107
}
108+
else if (newPullRequest != pullRequest)
109+
{
110+
log.Debug("Fire StatusChanged event when PullRequest changes for ActiveRepository");
111+
StatusChanged?.Invoke(this, EventArgs.Empty);
112+
}
105113

106114
repositoryPath = newRepositoryPath;
107115
cloneUrl = newCloneUrl;
108116
branchName = newBranchName;
109117
headSha = newHeadSha;
110118
solutionPath = newSolutionPath;
111119
trackedSha = newTrackedSha;
120+
pullRequest = newPullRequest;
112121
}
113122
}
114123
catch (Exception e)

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

Lines changed: 25 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,12 @@ static PullRequestService CreatePullRequestService(Repository repo)
565565
var serviceProvider = Substitutes.ServiceProvider;
566566
var gitService = serviceProvider.GetGitService();
567567
gitService.GetRepository(repoDir).Returns(repo);
568-
var service = new PullRequestService(Substitute.For<IGitClient>(), gitService, serviceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
568+
var service = new PullRequestService(
569+
Substitute.For<IGitClient>(),
570+
gitService,
571+
Substitute.For<IVSGitExt>(),
572+
serviceProvider.GetOperatingSystem(),
573+
Substitute.For<IUsageTracker>());
569574
return service;
570575
}
571576

@@ -668,7 +673,12 @@ public void CreatePullRequestAllArgsMandatory()
668673
{
669674
var serviceProvider = Substitutes.ServiceProvider;
670675
var gitService = serviceProvider.GetGitService();
671-
var service = new PullRequestService(Substitute.For<IGitClient>(), serviceProvider.GetGitService(), serviceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
676+
var service = new PullRequestService(
677+
Substitute.For<IGitClient>(),
678+
serviceProvider.GetGitService(),
679+
Substitute.For<IVSGitExt>(),
680+
serviceProvider.GetOperatingSystem(),
681+
Substitute.For<IUsageTracker>());
672682

673683
IModelService ms = null;
674684
ILocalRepositoryModel sourceRepo = null;
@@ -710,11 +720,7 @@ public class TheCheckoutMethod
710720
public async Task ShouldCheckoutExistingBranch()
711721
{
712722
var gitClient = MockGitClient();
713-
var service = new PullRequestService(
714-
gitClient,
715-
MockGitService(),
716-
Substitute.For<IOperatingSystem>(),
717-
Substitute.For<IUsageTracker>());
723+
var service = CreateTarget(gitClient, MockGitService());
718724

719725
var localRepo = Substitute.For<ILocalRepositoryModel>();
720726
var pr = Substitute.For<IPullRequestModel>();
@@ -733,11 +739,7 @@ public async Task ShouldCheckoutExistingBranch()
733739
public async Task ShouldCheckoutLocalBranch()
734740
{
735741
var gitClient = MockGitClient();
736-
var service = new PullRequestService(
737-
gitClient,
738-
MockGitService(),
739-
Substitute.For<IOperatingSystem>(),
740-
Substitute.For<IUsageTracker>());
742+
var service = CreateTarget(gitClient, MockGitService());
741743

742744
var localRepo = Substitute.For<ILocalRepositoryModel>();
743745
localRepo.CloneUrl.Returns(new UriString("https://foo.bar/owner/repo"));
@@ -760,11 +762,7 @@ public async Task ShouldCheckoutLocalBranch()
760762
public async Task ShouldCheckoutBranchFromFork()
761763
{
762764
var gitClient = MockGitClient();
763-
var service = new PullRequestService(
764-
gitClient,
765-
MockGitService(),
766-
Substitute.For<IOperatingSystem>(),
767-
Substitute.For<IUsageTracker>());
765+
var service = CreateTarget(gitClient, MockGitService());
768766

769767
var localRepo = Substitute.For<ILocalRepositoryModel>();
770768
localRepo.CloneUrl.Returns(new UriString("https://foo.bar/owner/repo"));
@@ -791,11 +789,7 @@ public async Task ShouldUseUniquelyNamedRemoteForFork()
791789
{
792790
var gitClient = MockGitClient();
793791
var gitService = MockGitService();
794-
var service = new PullRequestService(
795-
gitClient,
796-
gitService,
797-
Substitute.For<IOperatingSystem>(),
798-
Substitute.For<IUsageTracker>());
792+
var service = CreateTarget(gitClient, gitService);
799793

800794
var localRepo = Substitute.For<ILocalRepositoryModel>();
801795
localRepo.CloneUrl.Returns(new UriString("https://foo.bar/owner/repo"));
@@ -825,11 +819,7 @@ public class TheGetDefaultLocalBranchNameMethod
825819
[Test]
826820
public async Task ShouldReturnCorrectDefaultLocalBranchName()
827821
{
828-
var service = new PullRequestService(
829-
MockGitClient(),
830-
MockGitService(),
831-
Substitute.For<IOperatingSystem>(),
832-
Substitute.For<IUsageTracker>());
822+
var service = CreateTarget(MockGitClient(), MockGitService());
833823

834824
var localRepo = Substitute.For<ILocalRepositoryModel>();
835825
var result = await service.GetDefaultLocalBranchName(localRepo, 123, "Pull requests can be \"named\" all sorts of thing's (sic)");
@@ -842,6 +832,7 @@ public async Task ShouldReturnCorrectDefaultLocalBranchNameForPullRequestsWithNo
842832
var service = new PullRequestService(
843833
MockGitClient(),
844834
MockGitService(),
835+
Substitute.For<IVSGitExt>(),
845836
Substitute.For<IOperatingSystem>(),
846837
Substitute.For<IUsageTracker>());
847838

@@ -853,11 +844,7 @@ public async Task ShouldReturnCorrectDefaultLocalBranchNameForPullRequestsWithNo
853844
[Test]
854845
public async Task DefaultLocalBranchNameShouldNotClashWithExistingBranchNames()
855846
{
856-
var service = new PullRequestService(
857-
MockGitClient(),
858-
MockGitService(),
859-
Substitute.For<IOperatingSystem>(),
860-
Substitute.For<IUsageTracker>());
847+
var service = CreateTarget(MockGitClient(), MockGitService());
861848

862849
var localRepo = Substitute.For<ILocalRepositoryModel>();
863850
var result = await service.GetDefaultLocalBranchName(localRepo, 123, "foo1");
@@ -870,11 +857,7 @@ public class TheGetLocalBranchesMethod
870857
[Test]
871858
public async Task ShouldReturnPullRequestBranchForPullRequestFromSameRepository()
872859
{
873-
var service = new PullRequestService(
874-
MockGitClient(),
875-
MockGitService(),
876-
Substitute.For<IOperatingSystem>(),
877-
Substitute.For<IUsageTracker>());
860+
var service = CreateTarget(MockGitClient(), MockGitService());
878861

879862
var localRepo = Substitute.For<ILocalRepositoryModel>();
880863
localRepo.CloneUrl.Returns(new UriString("https://github.com/foo/bar"));
@@ -905,11 +888,7 @@ public async Task ShouldReturnMarkedBranchForPullRequestFromFork()
905888

906889
repo.Config.Returns(config);
907890

908-
var service = new PullRequestService(
909-
MockGitClient(),
910-
MockGitService(repo),
911-
Substitute.For<IOperatingSystem>(),
912-
Substitute.For<IUsageTracker>());
891+
var service = CreateTarget(MockGitClient(), MockGitService(repo));
913892

914893
var localRepo = Substitute.For<ILocalRepositoryModel>();
915894
localRepo.CloneUrl.Returns(new UriString("https://github.com/foo/bar.git"));
@@ -947,11 +926,7 @@ public async Task ShouldRemoveUnusedRemote()
947926
{
948927
var gitClient = MockGitClient();
949928
var gitService = MockGitService();
950-
var service = new PullRequestService(
951-
gitClient,
952-
gitService,
953-
Substitute.For<IOperatingSystem>(),
954-
Substitute.For<IUsageTracker>());
929+
var service = CreateTarget(gitClient, gitService);
955930

956931
var localRepo = Substitute.For<ILocalRepositoryModel>();
957932
localRepo.CloneUrl.Returns(new UriString("https://github.com/foo/bar"));
@@ -993,17 +968,20 @@ public async Task ShouldRemoveUnusedRemote()
993968
static PullRequestService CreateTarget(
994969
IGitClient gitClient = null,
995970
IGitService gitService = null,
971+
IVSGitExt gitExt = null,
996972
IOperatingSystem os = null,
997973
IUsageTracker usageTracker = null)
998974
{
999975
gitClient = gitClient ?? Substitute.For<IGitClient>();
1000976
gitService = gitService ?? Substitute.For<IGitService>();
977+
gitExt = gitExt ?? Substitute.For<IVSGitExt>();
1001978
os = os ?? Substitute.For<IOperatingSystem>();
1002979
usageTracker = usageTracker ?? Substitute.For<IUsageTracker>();
1003980

1004981
return new PullRequestService(
1005982
gitClient,
1006983
gitService,
984+
gitExt,
1007985
os,
1008986
usageTracker);
1009987
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,16 @@ public void SolutionUnloadedAndReloaded_DontFireStatusChanged()
211211
}
212212
}
213213

214-
static TeamExplorerContext CreateTeamExplorerContext(IVSGitExt gitExt, DTE dte = null)
214+
static TeamExplorerContext CreateTeamExplorerContext(
215+
IVSGitExt gitExt,
216+
DTE dte = null,
217+
IPullRequestService pullRequestService = null)
215218
{
216219
dte = dte ?? Substitute.For<DTE>();
220+
pullRequestService = pullRequestService ?? Substitute.For<IPullRequestService>();
217221
var sp = Substitute.For<IGitHubServiceProvider>();
218222
sp.GetService<DTE>().Returns(dte);
219-
return new TeamExplorerContext(gitExt, sp);
223+
return new TeamExplorerContext(sp, gitExt, pullRequestService);
220224
}
221225

222226
static ILocalRepositoryModel CreateRepositoryModel(string path, string branchName = null, string headSha = null, string trackedSha = null)

test/UnitTests/GitHub.App/ViewModels/Dialog/PullRequestCreationViewModelTests.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ static TestData PrepareTestData(
125125
public void TargetBranchDisplayNameIncludesRepoOwnerWhenFork()
126126
{
127127
var data = PrepareTestData("octokit.net", "shana", "master", "octokit", "master", "origin", true, true);
128-
var prservice = new PullRequestService(data.GitClient, data.GitService, data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
128+
var prservice = new PullRequestService(data.GitClient, data.GitService, Substitute.For<IVSGitExt>(), data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
129129
prservice.GetPullRequestTemplate(data.ActiveRepo).Returns(Observable.Empty<string>());
130130
var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService);
131131
vm.InitializeAsync(data.ActiveRepo, data.Connection).Wait();
@@ -161,7 +161,7 @@ public async Task CreatingPRs(
161161
var targetBranch = data.TargetBranch;
162162
var ms = data.ModelService;
163163

164-
var prservice = new PullRequestService(data.GitClient, data.GitService, data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
164+
var prservice = new PullRequestService(data.GitClient, data.GitService, Substitute.For<IVSGitExt>(), data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>());
165165
var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService);
166166
await vm.InitializeAsync(data.ActiveRepo, data.Connection);
167167

@@ -177,6 +177,14 @@ public async Task CreatingPRs(
177177
if (body != null)
178178
vm.Description = body;
179179

180+
ms.CreatePullRequest(activeRepo, targetRepo, sourceBranch, targetBranch, Arg.Any<string>(), Arg.Any<string>())
181+
.Returns(x =>
182+
{
183+
var pr = Substitute.For<IPullRequestModel>();
184+
pr.Base.Returns(new GitReferenceModel("ref", "label", "sha", "https://clone.url"));
185+
return Observable.Return(pr);
186+
});
187+
180188
await vm.CreatePullRequest.ExecuteAsync();
181189

182190
var unused2 = gitClient.Received().Push(l2repo, sourceBranchName, remote);

0 commit comments

Comments
 (0)