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

Commit 3c2d45d

Browse files
committed
Don't open folder when solution part of repository
Don't close solution and open folder view when solution is already in the targeted repository.
1 parent 84fc60e commit 3c2d45d

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

src/GitHub.App/Services/RepositoryCloneService.cs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel.Composition;
4+
using System.IO;
45
using System.Linq;
56
using System.Reactive.Linq;
67
using System.Threading.Tasks;
@@ -37,6 +38,7 @@ public class RepositoryCloneService : IRepositoryCloneService
3738
readonly IGraphQLClientFactory graphqlFactory;
3839
readonly IGitHubContextService gitHubContextService;
3940
readonly IUsageTracker usageTracker;
41+
readonly Lazy<EnvDTE.DTE> dte;
4042
ICompiledQuery<ViewerRepositoriesModel> readViewerRepositories;
4143

4244
[ImportingConstructor]
@@ -46,14 +48,16 @@ public RepositoryCloneService(
4648
ITeamExplorerServices teamExplorerServices,
4749
IGraphQLClientFactory graphqlFactory,
4850
IGitHubContextService gitHubContextService,
49-
IUsageTracker usageTracker)
51+
IUsageTracker usageTracker,
52+
IGitHubServiceProvider sp)
5053
{
5154
this.operatingSystem = operatingSystem;
5255
this.vsGitServices = vsGitServices;
5356
this.teamExplorerServices = teamExplorerServices;
5457
this.graphqlFactory = graphqlFactory;
5558
this.gitHubContextService = gitHubContextService;
5659
this.usageTracker = usageTracker;
60+
dte = new Lazy<EnvDTE.DTE>(() => sp.GetService<EnvDTE.DTE>());
5761

5862
defaultClonePath = GetLocalClonePathFromGitProvider(operatingSystem.Environment.GetUserRepositoriesPath());
5963
}
@@ -127,7 +131,10 @@ public async Task CloneOrOpenRepository(
127131
var isDotCom = HostAddress.IsGitHubDotComUri(repositoryUrl);
128132
if (DestinationDirectoryExists(repositoryPath))
129133
{
130-
teamExplorerServices.OpenRepository(repositoryPath);
134+
if (!IsSolutionInRepository(repositoryPath))
135+
{
136+
teamExplorerServices.OpenRepository(repositoryPath);
137+
}
131138

132139
if (isDotCom)
133140
{
@@ -164,6 +171,29 @@ public async Task CloneOrOpenRepository(
164171
}
165172
}
166173

174+
bool IsSolutionInRepository(string repositoryPath)
175+
{
176+
var solutionPath = dte.Value.Solution.FileName;
177+
if (string.IsNullOrEmpty(solutionPath))
178+
{
179+
return false;
180+
}
181+
182+
var isFolder = operatingSystem.Directory.DirectoryExists(solutionPath);
183+
var solutionDir = isFolder ? solutionPath : Path.GetDirectoryName(solutionPath);
184+
if (string.Equals(repositoryPath, solutionDir, StringComparison.OrdinalIgnoreCase))
185+
{
186+
return true;
187+
}
188+
189+
if (solutionDir.StartsWith(repositoryPath + '\\', StringComparison.OrdinalIgnoreCase))
190+
{
191+
return true;
192+
}
193+
194+
return false;
195+
}
196+
167197
/// <inheritdoc/>
168198
public async Task CloneRepository(
169199
string cloneUrl,

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,36 @@ await usageTracker.Received(numberOfCalls).IncrementCounter(
4646
((MemberExpression)x.Body).Member.Name == counterName));
4747
}
4848

49+
[TestCase(@"c:\repository", "", true, 1)]
50+
[TestCase(@"c:\repository", @"c:\solution", true, 1)]
51+
[TestCase(@"c:\already\open", @"c:\already\open", true, 0)]
52+
[TestCase(@"c:\already\open", @"c:\already\open\nested", true, 0, Description = "Solution folder in repository")]
53+
[TestCase(@"c:\already\open", @"c:\already\open\my.sln", false, 0)]
54+
[TestCase(@"c:\already\open", @"c:\already\open\nested\my.sln", false, 0)]
55+
[TestCase(@"c:\already\open\nested", @"c:\already\open", true, 1, Description = "Repository in solution folder")]
56+
public async Task Skip_OpenRepository_When_Already_Open(string repositoryPath, string solutionPath,
57+
bool isFolder, int openRepository)
58+
{
59+
var repositoryUrl = "https://github.com/owner/repo";
60+
var cloneDialogResult = new CloneDialogResult(repositoryPath, repositoryUrl);
61+
var serviceProvider = Substitutes.GetServiceProvider();
62+
var operatingSystem = serviceProvider.GetOperatingSystem();
63+
operatingSystem.Directory.DirectoryExists(repositoryPath).Returns(true);
64+
var dte = Substitute.For<EnvDTE.DTE>();
65+
serviceProvider.GetService<EnvDTE.DTE>().Returns(dte);
66+
dte.Solution.FileName.Returns(solutionPath);
67+
if (isFolder)
68+
{
69+
operatingSystem.Directory.DirectoryExists(solutionPath).Returns(true);
70+
}
71+
var cloneService = CreateRepositoryCloneService(serviceProvider);
72+
73+
await cloneService.CloneOrOpenRepository(cloneDialogResult);
74+
75+
var teamExplorerServices = serviceProvider.GetTeamExplorerServices();
76+
teamExplorerServices.Received(openRepository).OpenRepository(repositoryPath);
77+
}
78+
4979
[TestCase("https://github.com/foo/bar", false, 1, nameof(UsageModel.MeasuresModel.NumberOfClones))]
5080
[TestCase("https://github.com/foo/bar", false, 1, nameof(UsageModel.MeasuresModel.NumberOfGitHubClones))]
5181
[TestCase("https://github.com/foo/bar", false, 0, nameof(UsageModel.MeasuresModel.NumberOfEnterpriseClones))]
@@ -95,8 +125,7 @@ await usageTracker.Received(numberOfCalls).IncrementCounter(
95125
static RepositoryCloneService CreateRepositoryCloneService(IGitHubServiceProvider sp)
96126
{
97127
return new RepositoryCloneService(sp.GetOperatingSystem(), sp.GetVSGitServices(), sp.GetTeamExplorerServices(),
98-
sp.GetGraphQLClientFactory(), sp.GetGitHubContextService(), sp.GetUsageTracker());
99-
128+
sp.GetGraphQLClientFactory(), sp.GetGitHubContextService(), sp.GetUsageTracker(), sp);
100129
}
101130
}
102131
}

test/GitHub.App.UnitTests/Substitutes.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,15 @@ public static IGitHubServiceProvider GetServiceProvider(
113113
var vsgit = IVSGitServices;
114114
var clone = cloneService ?? new RepositoryCloneService(os, vsgit, Substitute.For<ITeamExplorerServices>(),
115115
Substitute.For<IGraphQLClientFactory>(), Substitute.For<IGitHubContextService>(),
116-
Substitute.For<IUsageTracker>());
116+
Substitute.For<IUsageTracker>(), ret);
117117
var create = creationService ?? new RepositoryCreationService(clone);
118118
avatarProvider = avatarProvider ?? Substitute.For<IAvatarProvider>();
119119
ret.GetService(typeof(IGitService)).Returns(gitservice);
120120
ret.GetService(typeof(IVSServices)).Returns(Substitute.For<IVSServices>());
121121
ret.GetService(typeof(ITeamExplorerServices)).Returns(Substitute.For<ITeamExplorerServices>());
122122
ret.GetService(typeof(IGraphQLClientFactory)).Returns(Substitute.For<IGraphQLClientFactory>());
123123
ret.GetService(typeof(IGitHubContextService)).Returns(Substitute.For<IGitHubContextService>());
124+
ret.GetService(typeof(IVSGitExt)).Returns(Substitute.For<IVSGitExt>());
124125
ret.GetService(typeof(IUsageTracker)).Returns(Substitute.For<IUsageTracker>());
125126
ret.GetService(typeof(IVSGitServices)).Returns(vsgit);
126127
ret.GetService(typeof(IOperatingSystem)).Returns(os);
@@ -156,6 +157,11 @@ public static IGitHubContextService GetGitHubContextService(this IServiceProvide
156157
return provider.GetService(typeof(IGitHubContextService)) as IGitHubContextService;
157158
}
158159

160+
public static IVSGitExt GetVSGitExt(this IServiceProvider provider)
161+
{
162+
return provider.GetService(typeof(IVSGitExt)) as IVSGitExt;
163+
}
164+
159165
public static IUsageTracker GetUsageTracker(this IServiceProvider provider)
160166
{
161167
return provider.GetService(typeof(IUsageTracker)) as IUsageTracker;

test/GitHub.VisualStudio.UnitTests/Substitutes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public static IGitHubServiceProvider GetServiceProvider(
113113
var vsgit = IVSGitServices;
114114
var clone = cloneService ?? new RepositoryCloneService(os, vsgit, Substitute.For<ITeamExplorerServices>(),
115115
Substitute.For<IGraphQLClientFactory>(), Substitute.For<IGitHubContextService>(),
116-
Substitute.For<IUsageTracker>());
116+
Substitute.For<IUsageTracker>(), ret);
117117
var create = creationService ?? new RepositoryCreationService(clone);
118118
avatarProvider = avatarProvider ?? Substitute.For<IAvatarProvider>();
119119
ret.GetService(typeof(IGitService)).Returns(gitservice);

0 commit comments

Comments
 (0)