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

Commit d1bedd6

Browse files
committed
Merge branch 'release/2.5.8'
2 parents e9ec1e0 + c38cd21 commit d1bedd6

File tree

5 files changed

+70
-54
lines changed

5 files changed

+70
-54
lines changed

src/GitHub.App/Services/RepositoryCloneService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ public async Task CloneOrOpenRepository(
151151
}
152152
}
153153

154+
// Give user a chance to choose a solution
154155
teamExplorerServices.ShowHomePage();
155156
}
156157

src/GitHub.Exports/Services/VSServices.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ public bool TryOpenRepository(string repoPath)
7878
return false;
7979
}
8080

81-
var repoDir = os.Directory.GetDirectory(repoPath);
82-
if (!repoDir.Exists)
81+
var gitPath = Path.Combine(repoPath, ".git");
82+
var gitDir = os.Directory.GetDirectory(gitPath);
83+
if (!gitDir.Exists)
8384
{
8485
return false;
8586
}

src/GitHub.StartPage/StartPagePackage.cs

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.ComponentModel;
32
using System.IO;
43
using System.Runtime.InteropServices;
54
using System.Threading;
@@ -9,7 +8,6 @@
98
using GitHub.Primitives;
109
using GitHub.Services;
1110
using GitHub.VisualStudio;
12-
using Microsoft.TeamFoundation.Controls;
1311
using Microsoft.VisualStudio.Shell;
1412
using Microsoft.VisualStudio.Shell.CodeContainerManagement;
1513
using Microsoft.VisualStudio.Threading;
@@ -59,7 +57,6 @@ async Task<CodeContainer> RunAcquisition(IProgress<ServiceProgressData> download
5957
try
6058
{
6159
var uiProvider = await Task.Run(() => Package.GetGlobalService(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider);
62-
await ShowTeamExplorerPage(uiProvider);
6360
request = await ShowCloneDialog(uiProvider, downloadProgress, repository);
6461
}
6562
catch (Exception e)
@@ -84,35 +81,6 @@ async Task<CodeContainer> RunAcquisition(IProgress<ServiceProgressData> download
8481
lastAccessed: DateTimeOffset.UtcNow);
8582
}
8683

87-
async Task ShowTeamExplorerPage(IGitHubServiceProvider gitHubServiceProvider)
88-
{
89-
var te = gitHubServiceProvider?.GetService(typeof(ITeamExplorer)) as ITeamExplorer;
90-
91-
if (te != null)
92-
{
93-
var page = te.NavigateToPage(new Guid(TeamExplorerPageIds.Connect), null);
94-
95-
if (page == null)
96-
{
97-
var tcs = new TaskCompletionSource<ITeamExplorerPage>();
98-
PropertyChangedEventHandler handler = null;
99-
100-
handler = new PropertyChangedEventHandler((s, e) =>
101-
{
102-
if (e.PropertyName == "CurrentPage")
103-
{
104-
tcs.SetResult(te.CurrentPage);
105-
te.PropertyChanged -= handler;
106-
}
107-
});
108-
109-
te.PropertyChanged += handler;
110-
111-
page = await tcs.Task;
112-
}
113-
}
114-
}
115-
11684
async Task<CloneDialogResult> ShowCloneDialog(
11785
IGitHubServiceProvider gitHubServiceProvider,
11886
IProgress<ServiceProgressData> progress,

src/GitHub.TeamFoundation.14/Services/VSGitServices.cs

Lines changed: 64 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#endif
66

77
using System;
8+
using System.Threading;
89
using System.Collections.Generic;
910
using System.Diagnostics.CodeAnalysis;
1011
using System.ComponentModel.Composition;
11-
using System.Globalization;
1212
using System.Linq;
1313
using System.Reactive.Linq;
1414
using System.Threading.Tasks;
@@ -17,15 +17,12 @@
1717
using GitHub.Models;
1818
using GitHub.TeamFoundation;
1919
using GitHub.VisualStudio;
20-
#if TEAMEXPLORER14
20+
using Microsoft.TeamFoundation.Controls;
2121
using Microsoft.TeamFoundation.Git.Controls.Extensibility;
22-
using ReactiveUI;
23-
#else
24-
using Microsoft.VisualStudio.Shell.Interop;
25-
using System.Threading;
26-
#endif
2722
using Microsoft.VisualStudio.TeamFoundation.Git.Extensibility;
23+
using ReactiveUI;
2824
using Serilog;
25+
using Microsoft;
2926

3027
namespace GitHub.Services
3128
{
@@ -39,6 +36,8 @@ public class VSGitServices : IVSGitServices
3936

4037
[SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used in VS2017")]
4138
readonly Lazy<IStatusBarNotificationService> statusBar;
39+
[SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used in VS2015")]
40+
readonly Lazy<IVSServices> vsServices;
4241

4342
/// <summary>
4443
/// This MEF export requires specific versions of TeamFoundation. IGitExt is declared here so
@@ -49,10 +48,13 @@ public class VSGitServices : IVSGitServices
4948
IGitExt gitExtService;
5049

5150
[ImportingConstructor]
52-
public VSGitServices(IGitHubServiceProvider serviceProvider, Lazy<IStatusBarNotificationService> statusBar)
51+
public VSGitServices(IGitHubServiceProvider serviceProvider,
52+
Lazy<IStatusBarNotificationService> statusBar,
53+
Lazy<IVSServices> vsServices)
5354
{
5455
this.serviceProvider = serviceProvider;
5556
this.statusBar = statusBar;
57+
this.vsServices = vsServices;
5658
}
5759

5860
// The Default Repository Path that VS uses is hidden in an internal
@@ -81,25 +83,68 @@ public async Task Clone(
8183
bool recurseSubmodules,
8284
object progress = null)
8385
{
84-
#if TEAMEXPLORER14
85-
var gitExt = serviceProvider.GetService<IGitRepositoriesExt>();
86-
gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None);
86+
var teamExplorer = serviceProvider.TryGetService<ITeamExplorer>();
87+
Assumes.Present(teamExplorer);
8788

88-
// The operation will have completed when CanClone goes false and then true again.
89-
await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1);
90-
await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1);
89+
#if TEAMEXPLORER14
90+
await StartClonenOnConnectPageAsync(teamExplorer, cloneUrl, clonePath, recurseSubmodules);
91+
NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home
92+
await WaitForCloneOnHomePageAsync(teamExplorer);
93+
vsServices.Value.TryOpenRepository(clonePath); // Show the repository on Team Explorer - Home
9194
#else
9295
var gitExt = serviceProvider.GetService<IGitActionsExt>();
9396
var typedProgress = ((Progress<ServiceProgressData>)progress) ?? new Progress<ServiceProgressData>();
97+
typedProgress.ProgressChanged += (s, e) => statusBar.Value.ShowMessage(e.ProgressText);
98+
var cloneTask = gitExt.CloneAsync(cloneUrl, clonePath, recurseSubmodules, default(CancellationToken), typedProgress);
9499

95-
await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(async () =>
96-
{
97-
typedProgress.ProgressChanged += (s, e) => statusBar.Value.ShowMessage(e.ProgressText);
98-
await gitExt.CloneAsync(cloneUrl, clonePath, recurseSubmodules, default(CancellationToken), typedProgress);
99-
});
100+
NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home
101+
await cloneTask;
100102
#endif
101103
}
102104

105+
static async Task StartClonenOnConnectPageAsync(
106+
ITeamExplorer teamExplorer, string cloneUrl, string clonePath, bool recurseSubmodules)
107+
{
108+
var connectPage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Connect));
109+
Assumes.Present(connectPage);
110+
var gitExt = connectPage.GetService<IGitRepositoriesExt>();
111+
Assumes.Present(gitExt);
112+
113+
gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None);
114+
}
115+
116+
static async Task WaitForCloneOnHomePageAsync(ITeamExplorer teamExplorer)
117+
{
118+
// The clone progress bar appears on the GettingStartedSection of the Home page,
119+
// so we wait for this to be hidden before continuing.
120+
var sectionId = new Guid("d0200918-c025-4cc3-9dee-4f5e89d0c918"); // GettingStartedSection
121+
await teamExplorer
122+
.WhenAnyValue(x => x.CurrentPage)
123+
.Where(p => p.GetId() == new Guid(TeamExplorerPageIds.Home))
124+
.Select(p => p.GetSection(sectionId))
125+
.Where(s => s != null)
126+
.Select(s => s.WhenAnyValue(x => x.IsVisible))
127+
.Switch() // Watch the topmost section
128+
.StartWith(false) // If no events arrive default to invisible
129+
.Throttle(TimeSpan.FromSeconds(1)) // Ignore glitch where section starts invisible
130+
.Any(x => x == false);
131+
}
132+
133+
static void NavigateToHomePage(ITeamExplorer teamExplorer)
134+
{
135+
teamExplorer.NavigateToPage(new Guid(TeamExplorerPageIds.Home), null);
136+
}
137+
138+
static async Task<ITeamExplorerPage> NavigateToPageAsync(ITeamExplorer teamExplorer, Guid pageId)
139+
{
140+
teamExplorer.NavigateToPage(pageId, null);
141+
var page = await teamExplorer
142+
.WhenAnyValue(x => x.CurrentPage)
143+
.Where(x => x?.GetId() == pageId)
144+
.Take(1);
145+
return page;
146+
}
147+
103148
IGitRepositoryInfo GetRepoFromVS()
104149
{
105150
gitExtService = serviceProvider.GetService<IGitExt>();

test/GitHub.Exports.UnitTests/VSServicesTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,10 @@ VSServices CreateVSServices(string repoDir, IOperatingSystem os = null, DTE dte
9292

9393
if (repoDir != null)
9494
{
95+
var gitDir = Path.Combine(repoDir, ".git");
9596
var directoryInfo = Substitute.For<IDirectoryInfo>();
9697
directoryInfo.Exists.Returns(repoDirExists);
97-
os.Directory.GetDirectory(repoDir).Returns(directoryInfo);
98+
os.Directory.GetDirectory(gitDir).Returns(directoryInfo);
9899
}
99100

100101
var provider = Substitute.For<IGitHubServiceProvider>();

0 commit comments

Comments
 (0)