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

Commit e96f0b8

Browse files
authored
Merge pull request #2212 from github/fixes/2211-signal-complete-when-opening-from-start-page
Signal completion when opening repository using Get to Code
2 parents 86bb524 + db35dd1 commit e96f0b8

File tree

6 files changed

+159
-5
lines changed

6 files changed

+159
-5
lines changed

GitHubVS.sln

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Octokit.GraphQL.Core", "sub
141141
EndProject
142142
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Octokit.GraphQL", "submodules\octokit.graphql.net\Octokit.GraphQL\Octokit.GraphQL.csproj", "{791B408C-0ABC-465B-9EB1-A2422D67F418}"
143143
EndProject
144+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitHub.StartPage.UnitTests", "test\GitHub.StartPage.UnitTests\GitHub.StartPage.UnitTests.csproj", "{B467682B-9F0E-42D8-8A20-1DE78F798793}"
145+
EndProject
144146
Global
145147
GlobalSection(SolutionConfigurationPlatforms) = preSolution
146148
Debug|Any CPU = Debug|Any CPU
@@ -493,6 +495,14 @@ Global
493495
{791B408C-0ABC-465B-9EB1-A2422D67F418}.Release|Any CPU.Build.0 = Release|Any CPU
494496
{791B408C-0ABC-465B-9EB1-A2422D67F418}.ReleaseWithoutVsix|Any CPU.ActiveCfg = Release|Any CPU
495497
{791B408C-0ABC-465B-9EB1-A2422D67F418}.ReleaseWithoutVsix|Any CPU.Build.0 = Release|Any CPU
498+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
499+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.Debug|Any CPU.Build.0 = Debug|Any CPU
500+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.DebugWithoutVsix|Any CPU.ActiveCfg = Debug|Any CPU
501+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.DebugWithoutVsix|Any CPU.Build.0 = Debug|Any CPU
502+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.Release|Any CPU.ActiveCfg = Release|Any CPU
503+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.Release|Any CPU.Build.0 = Release|Any CPU
504+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.ReleaseWithoutVsix|Any CPU.ActiveCfg = Release|Any CPU
505+
{B467682B-9F0E-42D8-8A20-1DE78F798793}.ReleaseWithoutVsix|Any CPU.Build.0 = Release|Any CPU
496506
EndGlobalSection
497507
GlobalSection(SolutionProperties) = preSolution
498508
HideSolutionNode = FALSE
@@ -527,6 +537,7 @@ Global
527537
{65542DEE-D3BE-4810-B85A-08E970413A21} = {8A7DA2E7-262B-4581-807A-1C45CE79CDFD}
528538
{3321CE72-26ED-4D1E-A8F5-6901FB783007} = {1E7F7253-A6AF-43C4-A955-37BEDDA01AC0}
529539
{791B408C-0ABC-465B-9EB1-A2422D67F418} = {1E7F7253-A6AF-43C4-A955-37BEDDA01AC0}
540+
{B467682B-9F0E-42D8-8A20-1DE78F798793} = {8A7DA2E7-262B-4581-807A-1C45CE79CDFD}
530541
EndGlobalSection
531542
GlobalSection(ExtensibilityGlobals) = postSolution
532543
SolutionGuid = {556014CF-5B35-4CE5-B3EF-6AB0007001AC}

scripts/test.ps1

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ if (!$?) {
9797
$exitcode = 11
9898
}
9999

100+
Write-Output "Running GitHub.StartPage.UnitTests..."
101+
Run-NUnit test GitHub.StartPage.UnitTests $TimeoutDuration $config
102+
if (!$?) {
103+
$exitcode = 12
104+
}
105+
100106
if ($exitcode -ne 0) {
101107
$host.SetShouldExit($exitcode)
102108
}

src/GitHub.StartPage/GitHub.StartPage.csproj

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@
9999
<PackageReference Include="Microsoft.VisualStudio.SDK.Analyzers">
100100
<Version>15.8.33</Version>
101101
</PackageReference>
102-
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers">
103-
<Version>15.8.122</Version>
104-
</PackageReference>
105102
<PackageReference Include="Microsoft.VSSDK.BuildTools">
106103
<Version>15.8.3252</Version>
107104
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>

src/GitHub.StartPage/StartPagePackage.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,20 @@ public class GitHubContainerProvider : ICodeContainerProvider
3636
{
3737
static readonly ILogger log = LogManager.ForContext<GitHubContainerProvider>();
3838

39-
public async Task<CodeContainer> AcquireCodeContainerAsync(IProgress<ServiceProgressData> downloadProgress, CancellationToken cancellationToken)
39+
readonly Lazy<IGitHubServiceProvider> gitHubServiceProvider;
40+
41+
public GitHubContainerProvider() : this(
42+
new Lazy<IGitHubServiceProvider>(() => Package.GetGlobalService(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider))
43+
{
44+
}
45+
46+
public GitHubContainerProvider(Lazy<IGitHubServiceProvider> gitHubServiceProvider)
4047
{
48+
this.gitHubServiceProvider = gitHubServiceProvider;
49+
}
4150

51+
public async Task<CodeContainer> AcquireCodeContainerAsync(IProgress<ServiceProgressData> downloadProgress, CancellationToken cancellationToken)
52+
{
4253
return await RunAcquisition(downloadProgress, null, cancellationToken);
4354
}
4455

@@ -55,7 +66,7 @@ async Task<CodeContainer> RunAcquisition(IProgress<ServiceProgressData> download
5566

5667
try
5768
{
58-
var uiProvider = await Task.Run(() => Package.GetGlobalService(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider);
69+
var uiProvider = await Task.Run(() => gitHubServiceProvider.Value);
5970
request = await ShowCloneDialog(uiProvider, downloadProgress, cancellationToken, repository);
6071
}
6172
catch (Exception e)
@@ -68,6 +79,10 @@ async Task<CodeContainer> RunAcquisition(IProgress<ServiceProgressData> download
6879

6980
var uri = request.Url.ToRepositoryUrl();
7081
var repositoryName = request.Url.RepositoryName;
82+
83+
// Report all steps complete before returning a CodeContainer
84+
downloadProgress.Report(new ServiceProgressData(string.Empty, string.Empty, 1, 1));
85+
7186
return new CodeContainer(
7287
localProperties: new CodeContainerLocalProperties(request.Path, CodeContainerType.Folder,
7388
new CodeContainerSourceControlProperties(repositoryName, request.Path, new Guid(Guids.GitSccProviderId))),
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net46</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<Compile Include="..\Helpers\GlobalSuppressions.cs" Link="GlobalSuppressions.cs" />
9+
</ItemGroup>
10+
11+
<ItemGroup>
12+
<ProjectReference Include="..\..\src\GitHub.StartPage\GitHub.StartPage.csproj" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<PackageReference Include="NSubstitute" Version="2.0.3" />
17+
<PackageReference Include="NUnit" version="3.9.0" />
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading;
4+
using GitHub.Models;
5+
using GitHub.Services;
6+
using GitHub.StartPage;
7+
using Microsoft.VisualStudio.Shell.CodeContainerManagement;
8+
using NSubstitute;
9+
using NUnit.Framework;
10+
using Task = System.Threading.Tasks.Task;
11+
using ServiceProgressData = Microsoft.VisualStudio.Shell.ServiceProgressData;
12+
13+
public class GitHubContainerProviderTests
14+
{
15+
public class TheAcquireCodeContainerAsyncMethod
16+
{
17+
[Test]
18+
public async Task CloneOrOpenRepository_CloneDialogResult_Returned_By_ShowCloneDialog()
19+
{
20+
var downloadProgress = Substitute.For<IProgress<ServiceProgressData>>();
21+
var cancellationToken = CancellationToken.None;
22+
var dialogService = Substitute.For<IDialogService>();
23+
var result = new CloneDialogResult(@"x:\repo", "https://github.com/owner/repo");
24+
dialogService.ShowCloneDialog(null).ReturnsForAnyArgs(result);
25+
var cloneService = Substitute.For<IRepositoryCloneService>();
26+
var target = CreateGitHubContainerProvider(dialogService: dialogService, cloneService: cloneService);
27+
28+
await target.AcquireCodeContainerAsync(downloadProgress, cancellationToken);
29+
30+
await cloneService.Received(1).CloneOrOpenRepository(result, downloadProgress, cancellationToken);
31+
}
32+
33+
[Test]
34+
public async Task Pass_DisplayUrl_To_ShowCloneDialog()
35+
{
36+
var displayUrl = "https://github.com/owner/displayUrl";
37+
var browseOnlineUrl = "https://github.com/owner/browseOnlineUrl";
38+
var remoteCodeContainer = new RemoteCodeContainer("Name", Guid.NewGuid(), new Uri(displayUrl), new Uri(browseOnlineUrl),
39+
DateTimeOffset.Now, new Dictionary<string, string>());
40+
var downloadProgress = Substitute.For<IProgress<ServiceProgressData>>();
41+
var cancellationToken = CancellationToken.None;
42+
var dialogService = Substitute.For<IDialogService>();
43+
var result = new CloneDialogResult(@"x:\repo", "https://github.com/owner/repo");
44+
dialogService.ShowCloneDialog(null).ReturnsForAnyArgs(result);
45+
var cloneService = Substitute.For<IRepositoryCloneService>();
46+
var target = CreateGitHubContainerProvider(dialogService: dialogService, cloneService: cloneService);
47+
48+
await target.AcquireCodeContainerAsync(remoteCodeContainer, downloadProgress, cancellationToken);
49+
50+
await dialogService.Received(1).ShowCloneDialog(Arg.Any<IConnection>(), displayUrl);
51+
}
52+
53+
[Test]
54+
public async Task Completes_When_Returning_CodeContainer()
55+
{
56+
var downloadProgress = Substitute.For<IProgress<ServiceProgressData>>();
57+
var cancellationToken = CancellationToken.None;
58+
var dialogService = Substitute.For<IDialogService>();
59+
var result = new CloneDialogResult(@"x:\repo", "https://github.com/owner/repo");
60+
dialogService.ShowCloneDialog(null).ReturnsForAnyArgs(result);
61+
var cloneService = Substitute.For<IRepositoryCloneService>();
62+
var target = CreateGitHubContainerProvider(dialogService: dialogService, cloneService: cloneService);
63+
64+
var codeContainer = await target.AcquireCodeContainerAsync(downloadProgress, cancellationToken);
65+
66+
Assert.That(codeContainer, Is.Not.Null);
67+
downloadProgress.Received(1).Report(
68+
Arg.Is<ServiceProgressData>(x => x.TotalSteps > 0 && x.CurrentStep == x.TotalSteps));
69+
}
70+
71+
[Test]
72+
public async Task Does_Not_Complete_When_CloneDialog_Canceled()
73+
{
74+
var downloadProgress = Substitute.For<IProgress<ServiceProgressData>>();
75+
var cancellationToken = CancellationToken.None;
76+
var dialogService = Substitute.For<IDialogService>();
77+
var result = (CloneDialogResult)null;
78+
dialogService.ShowCloneDialog(null).ReturnsForAnyArgs(result);
79+
var cloneService = Substitute.For<IRepositoryCloneService>();
80+
var target = CreateGitHubContainerProvider(dialogService: dialogService, cloneService: cloneService);
81+
82+
var codeContainer = await target.AcquireCodeContainerAsync(downloadProgress, cancellationToken);
83+
84+
await cloneService.ReceivedWithAnyArgs(0).CloneOrOpenRepository(null, null, null);
85+
downloadProgress.ReceivedWithAnyArgs(0).Report(null);
86+
Assert.That(codeContainer, Is.Null);
87+
}
88+
89+
static GitHubContainerProvider CreateGitHubContainerProvider(IDialogService dialogService = null,
90+
IRepositoryCloneService cloneService = null, IUsageTracker usageTracker = null)
91+
{
92+
dialogService = dialogService ?? Substitute.For<IDialogService>();
93+
cloneService = cloneService ?? Substitute.For<IRepositoryCloneService>();
94+
usageTracker = usageTracker ?? Substitute.For<IUsageTracker>();
95+
96+
var sp = Substitute.For<IGitHubServiceProvider>();
97+
sp.GetService<IDialogService>().Returns(dialogService);
98+
sp.GetService<IRepositoryCloneService>().Returns(cloneService);
99+
sp.GetService<IUsageTracker>().Returns(usageTracker);
100+
101+
var gitHubServiceProvider = new Lazy<IGitHubServiceProvider>(() => sp);
102+
return new GitHubContainerProvider(gitHubServiceProvider);
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)