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

Commit ad67d7f

Browse files
authored
Merge pull request #1214 from github/fixes/1208-dont-link-to-fork
Open PR link to the selected (not active) repo on GitHub
2 parents 3393213 + cb7bfc6 commit ad67d7f

File tree

6 files changed

+51
-32
lines changed

6 files changed

+51
-32
lines changed

src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public PullRequestListViewModelDesigner()
3434
Assignee = new AccountDesigner { Login = "haacked", IsUser = true },
3535
});
3636
prs.Add(new PullRequestModel(409, "Fix publish button style and a really, really long name for this thing... OMG look how long this name is yusssss",
37-
new AccountDesigner { Login = "shana", IsUser = true },
37+
new AccountDesigner { Login = "shana", IsUser = true },
3838
DateTimeOffset.Now - TimeSpan.FromHours(5))
3939
{
4040
CommentCount = 27,
@@ -76,5 +76,6 @@ public PullRequestListViewModelDesigner()
7676

7777
public ReactiveCommand<object> OpenPullRequest { get; }
7878
public ReactiveCommand<object> CreatePullRequest { get; }
79+
public ReactiveCommand<object> OpenPullRequestOnGitHub { get; }
7980
}
8081
}

src/GitHub.App/ViewModels/PullRequestListViewModel.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
44
using System.ComponentModel.Composition;
5-
using System.Diagnostics;
65
using System.Linq;
76
using System.Reactive.Linq;
87
using System.Reactive.Subjects;
@@ -32,6 +31,7 @@ public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListV
3231
readonly TrackingCollection<IAccount> trackingAuthors;
3332
readonly TrackingCollection<IAccount> trackingAssignees;
3433
readonly IPackageSettings settings;
34+
readonly IVisualStudioBrowser visualStudioBrowser;
3535
readonly PullRequestListUIState listSettings;
3636
readonly bool constructing;
3737
IRemoteRepositoryModel remoteRepository;
@@ -40,8 +40,9 @@ public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListV
4040
PullRequestListViewModel(
4141
IConnectionRepositoryHostMap connectionRepositoryHostMap,
4242
ITeamExplorerServiceHolder teservice,
43-
IPackageSettings settings)
44-
: this(connectionRepositoryHostMap.CurrentRepositoryHost, teservice.ActiveRepo, settings)
43+
IPackageSettings settings,
44+
IVisualStudioBrowser visualStudioBrowser)
45+
: this(connectionRepositoryHostMap.CurrentRepositoryHost, teservice.ActiveRepo, settings, visualStudioBrowser)
4546
{
4647
Guard.ArgumentNotNull(connectionRepositoryHostMap, nameof(connectionRepositoryHostMap));
4748
Guard.ArgumentNotNull(teservice, nameof(teservice));
@@ -51,16 +52,19 @@ public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListV
5152
public PullRequestListViewModel(
5253
IRepositoryHost repositoryHost,
5354
ILocalRepositoryModel repository,
54-
IPackageSettings settings)
55+
IPackageSettings settings,
56+
IVisualStudioBrowser visualStudioBrowser)
5557
{
5658
Guard.ArgumentNotNull(repositoryHost, nameof(repositoryHost));
5759
Guard.ArgumentNotNull(repository, nameof(repository));
5860
Guard.ArgumentNotNull(settings, nameof(settings));
61+
Guard.ArgumentNotNull(visualStudioBrowser, nameof(visualStudioBrowser));
5962

6063
constructing = true;
6164
this.repositoryHost = repositoryHost;
6265
this.localRepository = repository;
6366
this.settings = settings;
67+
this.visualStudioBrowser = visualStudioBrowser;
6468

6569
Title = Resources.PullRequestsNavigationItemText;
6670

@@ -108,6 +112,9 @@ public PullRequestListViewModel(
108112
CreatePullRequest = ReactiveCommand.Create();
109113
CreatePullRequest.Subscribe(_ => DoCreatePullRequest());
110114

115+
OpenPullRequestOnGitHub = ReactiveCommand.Create();
116+
OpenPullRequestOnGitHub.Subscribe(x => DoOpenPullRequestOnGitHub((int)x));
117+
111118
constructing = false;
112119
}
113120

@@ -269,6 +276,8 @@ public IAccount EmptyUser
269276
public ReactiveCommand<object> OpenPullRequest { get; }
270277
public ReactiveCommand<object> CreatePullRequest { get; }
271278

279+
public ReactiveCommand<object> OpenPullRequestOnGitHub { get; }
280+
272281
bool disposed;
273282
protected void Dispose(bool disposing)
274283
{
@@ -334,5 +343,12 @@ void DoCreatePullRequest()
334343
var d = new ViewWithData(UIControllerFlow.PullRequestCreation);
335344
navigate.OnNext(d);
336345
}
346+
347+
void DoOpenPullRequestOnGitHub(int pullRequest)
348+
{
349+
var repoUrl = SelectedRepository.CloneUrl.ToRepositoryUrl();
350+
var url = repoUrl.Append("pull/" + pullRequest);
351+
visualStudioBrowser.OpenUrl(url);
352+
}
337353
}
338354
}

src/GitHub.Exports.Reactive/ViewModels/IPullRequestListViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ public interface IPullRequestListViewModel : IViewModel, ICanNavigate, IHasBusy
4141
IAccount SelectedAssignee { get; set; }
4242
ReactiveCommand<object> OpenPullRequest { get; }
4343
ReactiveCommand<object> CreatePullRequest { get; }
44+
ReactiveCommand<object> OpenPullRequestOnGitHub { get; }
4445
}
4546
}

src/GitHub.VisualStudio/UI/Views/Controls/PullRequestListItem.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
</Grid.ColumnDefinitions>
109109
<Button x:Name="prHashtagLink"
110110
Grid.Column="0"
111-
Command="{Binding OpenPROnGitHub, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:PullRequestListView}}}"
111+
Command="{Binding ViewModel.OpenPullRequestOnGitHub, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:PullRequestListView}}}"
112112
CommandParameter="{Binding Number}"
113113
Content="{Binding Number}"
114114
ToolTip="{x:Static prop:Resources.OpenPROnGitHubToolTip}"

src/GitHub.VisualStudio/UI/Views/PullRequestListView.xaml.cs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,37 +26,16 @@ public partial class PullRequestListView : GenericPullRequestListView, IDisposab
2626
readonly Subject<int> open = new Subject<int>();
2727
readonly Subject<object> create = new Subject<object>();
2828

29-
public PullRequestListView()
30-
{
31-
InitializeComponent();
32-
}
33-
3429
[ImportingConstructor]
35-
public PullRequestListView(IGitHubServiceProvider serviceProvider)
30+
public PullRequestListView()
3631
{
3732
InitializeComponent();
3833

39-
OpenPROnGitHub = new RelayCommand(x =>
40-
{
41-
var repo = serviceProvider.TryGetService<ITeamExplorerServiceHolder>()?.ActiveRepo;
42-
var browser = serviceProvider.TryGetService<IVisualStudioBrowser>();
43-
Debug.Assert(repo != null, "No active repo, cannot open PR on GitHub");
44-
Debug.Assert(browser != null, "No browser service, cannot open PR on GitHub");
45-
if (repo == null || browser == null)
46-
{
47-
return;
48-
}
49-
var url = repo.CloneUrl.ToRepositoryUrl().Append("pull/" + x);
50-
browser.OpenUrl(url);
51-
});
52-
5334
this.WhenActivated(d =>
5435
{
5536
});
5637
}
5738

58-
public ICommand OpenPROnGitHub { get; set; }
59-
6039
bool disposed;
6140
protected override void Dispose(bool disposing)
6241
{

src/UnitTests/GitHub.App/ViewModels/PullRequestListViewModelTests.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using GitHub.Services;
88
using GitHub.Settings;
99
using GitHub.ViewModels;
10+
using GitHub.Primitives;
1011
using NSubstitute;
1112
using Xunit;
1213

@@ -20,7 +21,8 @@ public void SelectingAssigneeShouldTriggerFilter()
2021
var repositoryHost = CreateRepositoryHost();
2122
var repository = Substitute.For<ILocalRepositoryModel>();
2223
var settings = CreateSettings();
23-
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings);
24+
var browser = Substitute.For<IVisualStudioBrowser>();
25+
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings, browser);
2426

2527
prViewModel.Initialize(null);
2628
prViewModel.PullRequests.Received(1).Filter = AnyFilter;
@@ -35,7 +37,8 @@ public void ResettingAssigneeToNoneShouldNotTriggerFilter()
3537
var repositoryHost = CreateRepositoryHost();
3638
var repository = Substitute.For<ILocalRepositoryModel>();
3739
var settings = CreateSettings();
38-
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings);
40+
var browser = Substitute.For<IVisualStudioBrowser>();
41+
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings, browser);
3942

4043
prViewModel.Initialize(null);
4144
prViewModel.PullRequests.Received(1).Filter = AnyFilter;
@@ -56,7 +59,8 @@ public void SelectingAuthorShouldTriggerFilter()
5659
var repositoryHost = CreateRepositoryHost();
5760
var repository = Substitute.For<ILocalRepositoryModel>();
5861
var settings = CreateSettings();
59-
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings);
62+
var browser = Substitute.For<IVisualStudioBrowser>();
63+
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings, browser);
6064

6165
prViewModel.Initialize(null);
6266
prViewModel.PullRequests.Received(1).Filter = AnyFilter;
@@ -71,7 +75,8 @@ public void ResettingAuthorToNoneShouldNotTriggerFilter()
7175
var repositoryHost = CreateRepositoryHost();
7276
var repository = Substitute.For<ILocalRepositoryModel>();
7377
var settings = CreateSettings();
74-
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings);
78+
var browser = Substitute.For<IVisualStudioBrowser>();
79+
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings, browser);
7580

7681
prViewModel.Initialize(null);
7782
prViewModel.PullRequests.Received(1).Filter = AnyFilter;
@@ -86,6 +91,23 @@ public void ResettingAuthorToNoneShouldNotTriggerFilter()
8691
prViewModel.PullRequests.Received(2).Filter = AnyFilter;
8792
}
8893

94+
[Theory]
95+
[InlineData("https://github.com/owner/repo", 666, "https://github.com/owner/repo/pull/666")]
96+
public void OpenPullRequestOnGitHubShouldOpenBrowser(string cloneUrl, int pullNumber, string expectUrl)
97+
{
98+
var repositoryHost = CreateRepositoryHost();
99+
var repository = Substitute.For<ILocalRepositoryModel>();
100+
var settings = CreateSettings();
101+
var browser = Substitute.For<IVisualStudioBrowser>();
102+
var prViewModel = new PullRequestListViewModel(repositoryHost, repository, settings, browser);
103+
prViewModel.SelectedRepository = Substitute.For<IRemoteRepositoryModel>();
104+
prViewModel.SelectedRepository.CloneUrl.Returns(new UriString(cloneUrl));
105+
106+
prViewModel.OpenPullRequestOnGitHub.Execute(pullNumber);
107+
108+
browser.ReceivedWithAnyArgs(1).OpenUrl(new Uri(expectUrl));
109+
}
110+
89111
Func<IPullRequestModel, int, IList<IPullRequestModel>, bool> AnyFilter =>
90112
Arg.Any<Func<IPullRequestModel, int, IList<IPullRequestModel>, bool>>();
91113

0 commit comments

Comments
 (0)