From 1db61f03d19d3e0469571754ae9e804d72a622d1 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 11:46:13 +0100 Subject: [PATCH 01/13] Add method to find IGitRepositoriesExt Stop relying on the state of IGitHubServiceProvider to locate IGitRepositoriesExt. --- .../Services/VSGitServices.cs | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index cb1b9adfca..a08b2c01c3 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -5,10 +5,10 @@ #endif using System; +using System.Threading; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.ComponentModel.Composition; -using System.Globalization; using System.Linq; using System.Reactive.Linq; using System.Threading.Tasks; @@ -17,15 +17,12 @@ using GitHub.Models; using GitHub.TeamFoundation; using GitHub.VisualStudio; -#if TEAMEXPLORER14 +using Microsoft.TeamFoundation.Controls; using Microsoft.TeamFoundation.Git.Controls.Extensibility; -using ReactiveUI; -#else -using Microsoft.VisualStudio.Shell.Interop; -using System.Threading; -#endif using Microsoft.VisualStudio.TeamFoundation.Git.Extensibility; +using ReactiveUI; using Serilog; +using Microsoft; namespace GitHub.Services { @@ -81,8 +78,11 @@ public async Task Clone( bool recurseSubmodules, object progress = null) { + var teamExplorer = serviceProvider.TryGetService(); + Assumes.Present(teamExplorer); + #if TEAMEXPLORER14 - var gitExt = serviceProvider.GetService(); + var gitExt = await GetGitRepositoriesExtAsync(teamExplorer); gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); // The operation will have completed when CanClone goes false and then true again. @@ -100,6 +100,25 @@ await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(asy #endif } + static async Task GetGitRepositoriesExtAsync(ITeamExplorer teamExplorer) + { + var connectPage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Connect)); + Assumes.Present(connectPage); + var gitExt = connectPage.GetService(); + Assumes.Present(gitExt); + return gitExt; + } + + static async Task NavigateToPageAsync(ITeamExplorer teamExplorer, Guid pageId) + { + teamExplorer.NavigateToPage(pageId, null); + var page = await teamExplorer + .WhenAnyValue(x => x.CurrentPage) + .Where(x => x?.GetId() == pageId) + .Take(1); + return page; + } + IGitRepositoryInfo GetRepoFromVS() { gitExtService = serviceProvider.GetService(); From b1a01716c47610f097af036cfc956fc42bb9926c Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 12:04:39 +0100 Subject: [PATCH 02/13] Don't show Connect when Start Page button clicked There's no more need to explicitly show the Team Explorer - Connect page when the Start Page GitHub button is clicked. This will happen automatically before cloning. --- src/GitHub.StartPage/StartPagePackage.cs | 32 ------------------------ 1 file changed, 32 deletions(-) diff --git a/src/GitHub.StartPage/StartPagePackage.cs b/src/GitHub.StartPage/StartPagePackage.cs index fc543b560a..245746f08a 100644 --- a/src/GitHub.StartPage/StartPagePackage.cs +++ b/src/GitHub.StartPage/StartPagePackage.cs @@ -1,5 +1,4 @@ using System; -using System.ComponentModel; using System.IO; using System.Runtime.InteropServices; using System.Threading; @@ -9,7 +8,6 @@ using GitHub.Primitives; using GitHub.Services; using GitHub.VisualStudio; -using Microsoft.TeamFoundation.Controls; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.CodeContainerManagement; using Microsoft.VisualStudio.Threading; @@ -59,7 +57,6 @@ async Task RunAcquisition(IProgress download try { var uiProvider = await Task.Run(() => Package.GetGlobalService(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider); - await ShowTeamExplorerPage(uiProvider); request = await ShowCloneDialog(uiProvider, downloadProgress, repository); } catch (Exception e) @@ -84,35 +81,6 @@ async Task RunAcquisition(IProgress download lastAccessed: DateTimeOffset.UtcNow); } - async Task ShowTeamExplorerPage(IGitHubServiceProvider gitHubServiceProvider) - { - var te = gitHubServiceProvider?.GetService(typeof(ITeamExplorer)) as ITeamExplorer; - - if (te != null) - { - var page = te.NavigateToPage(new Guid(TeamExplorerPageIds.Connect), null); - - if (page == null) - { - var tcs = new TaskCompletionSource(); - PropertyChangedEventHandler handler = null; - - handler = new PropertyChangedEventHandler((s, e) => - { - if (e.PropertyName == "CurrentPage") - { - tcs.SetResult(te.CurrentPage); - te.PropertyChanged -= handler; - } - }); - - te.PropertyChanged += handler; - - page = await tcs.Task; - } - } - } - async Task ShowCloneDialog( IGitHubServiceProvider gitHubServiceProvider, IProgress progress, From a5a2b1ad6335cef11c93c8e9b5f55c14a009738d Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 12:26:16 +0100 Subject: [PATCH 03/13] Show clone progress on Team Explorer - Home A clone progress bar and option to cancel appears on Team Explorer - Home while cloning. Navigate to Team Explorer - Home, when clone operation is about to start. --- src/GitHub.App/Services/RepositoryCloneService.cs | 2 -- .../Services/VSGitServices.cs | 13 +++++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/GitHub.App/Services/RepositoryCloneService.cs b/src/GitHub.App/Services/RepositoryCloneService.cs index e67a669146..81da33a150 100644 --- a/src/GitHub.App/Services/RepositoryCloneService.cs +++ b/src/GitHub.App/Services/RepositoryCloneService.cs @@ -150,8 +150,6 @@ public async Task CloneOrOpenRepository( await usageTracker.IncrementCounter(x => x.NumberOfEnterpriseClones); } } - - teamExplorerServices.ShowHomePage(); } /// diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index a08b2c01c3..b0360949e1 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -86,12 +86,16 @@ public async Task Clone( gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); // The operation will have completed when CanClone goes false and then true again. - await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1); - await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1); + await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1); // Wait until started + NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home + await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1); // Wait until completed #else var gitExt = serviceProvider.GetService(); var typedProgress = ((Progress)progress) ?? new Progress(); + // Show progress on Team Explorer - Home + NavigateToHomePage(teamExplorer); + await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(async () => { typedProgress.ProgressChanged += (s, e) => statusBar.Value.ShowMessage(e.ProgressText); @@ -100,6 +104,11 @@ await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(asy #endif } + static void NavigateToHomePage(ITeamExplorer teamExplorer) + { + teamExplorer.NavigateToPage(new Guid(TeamExplorerPageIds.Home), null); + } + static async Task GetGitRepositoriesExtAsync(ITeamExplorer teamExplorer) { var connectPage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Connect)); From 8952f96693c2ea4239d064bf81734f7ab21c42a0 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 15:00:48 +0100 Subject: [PATCH 04/13] TryOpenRepository when clone completes on VS 2015 We want the Clone behavior to be as similar as possible on Visual Studio 2015 and 2017. --- .../Services/VSGitServices.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index b0360949e1..be35c763d3 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -36,6 +36,7 @@ public class VSGitServices : IVSGitServices [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used in VS2017")] readonly Lazy statusBar; + readonly Lazy vsServices; /// /// This MEF export requires specific versions of TeamFoundation. IGitExt is declared here so @@ -46,10 +47,13 @@ public class VSGitServices : IVSGitServices IGitExt gitExtService; [ImportingConstructor] - public VSGitServices(IGitHubServiceProvider serviceProvider, Lazy statusBar) + public VSGitServices(IGitHubServiceProvider serviceProvider, + Lazy statusBar, + Lazy vsServices) { this.serviceProvider = serviceProvider; this.statusBar = statusBar; + this.vsServices = vsServices; } // The Default Repository Path that VS uses is hidden in an internal @@ -86,9 +90,15 @@ public async Task Clone( gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); // The operation will have completed when CanClone goes false and then true again. + // It looks like the CanClone property is only live as long as the Connect page is visible. await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1); // Wait until started - NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1); // Wait until completed + + // Show progress on Team Explorer - Home + NavigateToHomePage(teamExplorer); + + // Open cloned repository in Team Explorer + vsServices.Value.TryOpenRepository(clonePath); #else var gitExt = serviceProvider.GetService(); var typedProgress = ((Progress)progress) ?? new Progress(); From 43b504e50fd2e4153a2156c389dcf302ed3e9649 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 15:39:13 +0100 Subject: [PATCH 05/13] Show Team Explorer - Home after clone This gives user an opportunity to choose a solution. --- src/GitHub.App/Services/RepositoryCloneService.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/GitHub.App/Services/RepositoryCloneService.cs b/src/GitHub.App/Services/RepositoryCloneService.cs index 81da33a150..a8bde09b5b 100644 --- a/src/GitHub.App/Services/RepositoryCloneService.cs +++ b/src/GitHub.App/Services/RepositoryCloneService.cs @@ -150,6 +150,9 @@ public async Task CloneOrOpenRepository( await usageTracker.IncrementCounter(x => x.NumberOfEnterpriseClones); } } + + // Give user a chance to choose a solution + teamExplorerServices.ShowHomePage(); } /// From 4ce685268ec1dfc4a83d3375f9bba05a871ecbb5 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Tue, 9 Oct 2018 16:25:24 +0100 Subject: [PATCH 06/13] TryOpenRepository on empty target folder If the user navigates away from the Connect page, the CanClone property will stop updating and the Clone method won't return. Point Team Explorer at the target folder when clone starts incase this happens. --- src/GitHub.TeamFoundation.14/Services/VSGitServices.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index be35c763d3..82ddebeb78 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -89,16 +89,15 @@ public async Task Clone( var gitExt = await GetGitRepositoriesExtAsync(teamExplorer); gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); + // First open the target folder in case the user navigates away from the Connect page. + vsServices.Value.TryOpenRepository(clonePath); + // The operation will have completed when CanClone goes false and then true again. - // It looks like the CanClone property is only live as long as the Connect page is visible. await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1); // Wait until started await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1); // Wait until completed - // Show progress on Team Explorer - Home + // Navigate when clone completes, otherwise we'll stop receiving updates to CanClone property. NavigateToHomePage(teamExplorer); - - // Open cloned repository in Team Explorer - vsServices.Value.TryOpenRepository(clonePath); #else var gitExt = serviceProvider.GetService(); var typedProgress = ((Progress)progress) ?? new Progress(); From c793d901872ed2e189fe0fba5bf5b26d888e81bf Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 10 Oct 2018 12:27:42 +0100 Subject: [PATCH 07/13] Detect completion using visibility of progress bar Detect when a clone completes by waiting for the clone progress bar on the Team Explorer Home page to be hidden. --- .../Services/VSGitServices.cs | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index 82ddebeb78..b4e04257fb 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -86,18 +86,11 @@ public async Task Clone( Assumes.Present(teamExplorer); #if TEAMEXPLORER14 - var gitExt = await GetGitRepositoriesExtAsync(teamExplorer); - gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); + await StartClonenOnConnectPageAsync(teamExplorer, cloneUrl, clonePath, recurseSubmodules); + await WaitForCloneOnHomePageAsync(teamExplorer); - // First open the target folder in case the user navigates away from the Connect page. + // Show the repository on Team Explorer - Home vsServices.Value.TryOpenRepository(clonePath); - - // The operation will have completed when CanClone goes false and then true again. - await gitExt.WhenAnyValue(x => x.CanClone).Where(x => !x).Take(1); // Wait until started - await gitExt.WhenAnyValue(x => x.CanClone).Where(x => x).Take(1); // Wait until completed - - // Navigate when clone completes, otherwise we'll stop receiving updates to CanClone property. - NavigateToHomePage(teamExplorer); #else var gitExt = serviceProvider.GetService(); var typedProgress = ((Progress)progress) ?? new Progress(); @@ -113,18 +106,34 @@ await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(asy #endif } - static void NavigateToHomePage(ITeamExplorer teamExplorer) - { - teamExplorer.NavigateToPage(new Guid(TeamExplorerPageIds.Home), null); - } - - static async Task GetGitRepositoriesExtAsync(ITeamExplorer teamExplorer) + static async Task StartClonenOnConnectPageAsync( + ITeamExplorer teamExplorer, string cloneUrl, string clonePath, bool recurseSubmodules) { var connectPage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Connect)); Assumes.Present(connectPage); var gitExt = connectPage.GetService(); Assumes.Present(gitExt); - return gitExt; + + gitExt.Clone(cloneUrl, clonePath, recurseSubmodules ? CloneOptions.RecurseSubmodule : CloneOptions.None); + } + + static async Task WaitForCloneOnHomePageAsync(ITeamExplorer teamExplorer) + { + var homePage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Home)); + Assumes.Present(homePage); + var gettingStartedSection = homePage.GetSection(new Guid("d0200918-c025-4cc3-9dee-4f5e89d0c918")); + Assumes.Present(gettingStartedSection); + + // The clone progress bar appears on the GettingStarted section, so we wait for + // this to be hidden before continuing. + await gettingStartedSection + .WhenAnyValue(x => x.IsVisible) + .Any(x => x == false); + } + + static void NavigateToHomePage(ITeamExplorer teamExplorer) + { + teamExplorer.NavigateToPage(new Guid(TeamExplorerPageIds.Home), null); } static async Task NavigateToPageAsync(ITeamExplorer teamExplorer, Guid pageId) From 38a754aebcab0eea3f0dd2fa7d3a02c33cd0d1e8 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 10 Oct 2018 13:02:00 +0100 Subject: [PATCH 08/13] Look for progress bar on any Home page Look for clone progress bar on any Team Explorer Home page that the user navigates to. The Home page will need to be the topmost page on Team Explorer for the clone to complete. --- .../Services/VSGitServices.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index b4e04257fb..8ebcc3b3ee 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -119,15 +119,16 @@ static async Task StartClonenOnConnectPageAsync( static async Task WaitForCloneOnHomePageAsync(ITeamExplorer teamExplorer) { - var homePage = await NavigateToPageAsync(teamExplorer, new Guid(TeamExplorerPageIds.Home)); - Assumes.Present(homePage); - var gettingStartedSection = homePage.GetSection(new Guid("d0200918-c025-4cc3-9dee-4f5e89d0c918")); - Assumes.Present(gettingStartedSection); - - // The clone progress bar appears on the GettingStarted section, so we wait for - // this to be hidden before continuing. - await gettingStartedSection - .WhenAnyValue(x => x.IsVisible) + NavigateToHomePage(teamExplorer); + + // The clone progress bar appears on the GettingStartedSection of the Home page, + // so we wait for this to be hidden before continuing. + var sectionId = new Guid("d0200918-c025-4cc3-9dee-4f5e89d0c918"); // GettingStartedSection + await teamExplorer + .WhenAnyValue(x => x.CurrentPage) + .Where(p => p.GetId() == new Guid(TeamExplorerPageIds.Home)) + .Select(p => p.GetSection(sectionId)) + .SelectMany(s => s.WhenAnyValue(x => x.IsVisible)) .Any(x => x == false); } From fc2d2c1a29d9c5165486b4bf75e934b5d7d3e730 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 10 Oct 2018 14:41:00 +0100 Subject: [PATCH 09/13] Navigate to Home after clone starts on 2017 - Be consistent between 2015 and 2017 by navigating to Home page after clone starts. - There's no need to use JoinableTaskFactory.RunAsync when a task is being awaited. --- .../Services/VSGitServices.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index 8ebcc3b3ee..84b7198399 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -88,21 +88,15 @@ public async Task Clone( #if TEAMEXPLORER14 await StartClonenOnConnectPageAsync(teamExplorer, cloneUrl, clonePath, recurseSubmodules); await WaitForCloneOnHomePageAsync(teamExplorer); - - // Show the repository on Team Explorer - Home - vsServices.Value.TryOpenRepository(clonePath); + vsServices.Value.TryOpenRepository(clonePath); // Show the repository on Team Explorer - Home #else var gitExt = serviceProvider.GetService(); var typedProgress = ((Progress)progress) ?? new Progress(); + typedProgress.ProgressChanged += (s, e) => statusBar.Value.ShowMessage(e.ProgressText); + var cloneTask = gitExt.CloneAsync(cloneUrl, clonePath, recurseSubmodules, default(CancellationToken), typedProgress); - // Show progress on Team Explorer - Home - NavigateToHomePage(teamExplorer); - - await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.RunAsync(async () => - { - typedProgress.ProgressChanged += (s, e) => statusBar.Value.ShowMessage(e.ProgressText); - await gitExt.CloneAsync(cloneUrl, clonePath, recurseSubmodules, default(CancellationToken), typedProgress); - }); + NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home + await cloneTask; #endif } From 4f527e73120a56a38dcd47716e45c21706a90535 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 10 Oct 2018 14:51:15 +0100 Subject: [PATCH 10/13] Suppress CA1823 for IVSServices used in VS2015 --- src/GitHub.TeamFoundation.14/Services/VSGitServices.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index 84b7198399..e38798537e 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -36,6 +36,7 @@ public class VSGitServices : IVSGitServices [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used in VS2017")] readonly Lazy statusBar; + [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used in VS2015")] readonly Lazy vsServices; /// From 567d490a3bc9a5419a58f430bb1fd8ea75ceed10 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 10 Oct 2018 16:05:03 +0100 Subject: [PATCH 11/13] Move StartClonenOnConnectPageAsync into Clone Move NavigateToHomePage out of WaitForCloneOnHomePageAsync to show the stages more clearly. --- src/GitHub.TeamFoundation.14/Services/VSGitServices.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index e38798537e..cfa1cf12ab 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -88,6 +88,7 @@ public async Task Clone( #if TEAMEXPLORER14 await StartClonenOnConnectPageAsync(teamExplorer, cloneUrl, clonePath, recurseSubmodules); + NavigateToHomePage(teamExplorer); // Show progress on Team Explorer - Home await WaitForCloneOnHomePageAsync(teamExplorer); vsServices.Value.TryOpenRepository(clonePath); // Show the repository on Team Explorer - Home #else @@ -114,8 +115,6 @@ static async Task StartClonenOnConnectPageAsync( static async Task WaitForCloneOnHomePageAsync(ITeamExplorer teamExplorer) { - NavigateToHomePage(teamExplorer); - // The clone progress bar appears on the GettingStartedSection of the Home page, // so we wait for this to be hidden before continuing. var sectionId = new Guid("d0200918-c025-4cc3-9dee-4f5e89d0c918"); // GettingStartedSection From 9885baddc3f072f3cef8c60d870756eb5c226aea Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Thu, 11 Oct 2018 11:43:01 +0100 Subject: [PATCH 12/13] Ignore glitch where section starts invisible If no events arrive default to invisible. Watch the topmost section. --- src/GitHub.TeamFoundation.14/Services/VSGitServices.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs index cfa1cf12ab..b51862deb1 100644 --- a/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs +++ b/src/GitHub.TeamFoundation.14/Services/VSGitServices.cs @@ -122,7 +122,11 @@ await teamExplorer .WhenAnyValue(x => x.CurrentPage) .Where(p => p.GetId() == new Guid(TeamExplorerPageIds.Home)) .Select(p => p.GetSection(sectionId)) - .SelectMany(s => s.WhenAnyValue(x => x.IsVisible)) + .Where(s => s != null) + .Select(s => s.WhenAnyValue(x => x.IsVisible)) + .Switch() // Watch the topmost section + .StartWith(false) // If no events arrive default to invisible + .Throttle(TimeSpan.FromSeconds(1)) // Ignore glitch where section starts invisible .Any(x => x == false); } From dd94727ec7f1a295c6b7460f36a1f2f10a6c63a3 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Thu, 11 Oct 2018 11:54:49 +0100 Subject: [PATCH 13/13] Only open repository when .git directory exists We don't want to change context when a clone operation has failed. --- src/GitHub.Exports/Services/VSServices.cs | 5 +++-- test/GitHub.Exports.UnitTests/VSServicesTests.cs | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/GitHub.Exports/Services/VSServices.cs b/src/GitHub.Exports/Services/VSServices.cs index 01a811eb38..1bb1920cba 100644 --- a/src/GitHub.Exports/Services/VSServices.cs +++ b/src/GitHub.Exports/Services/VSServices.cs @@ -78,8 +78,9 @@ public bool TryOpenRepository(string repoPath) return false; } - var repoDir = os.Directory.GetDirectory(repoPath); - if (!repoDir.Exists) + var gitPath = Path.Combine(repoPath, ".git"); + var gitDir = os.Directory.GetDirectory(gitPath); + if (!gitDir.Exists) { return false; } diff --git a/test/GitHub.Exports.UnitTests/VSServicesTests.cs b/test/GitHub.Exports.UnitTests/VSServicesTests.cs index 9094551dad..1e7c7a010e 100644 --- a/test/GitHub.Exports.UnitTests/VSServicesTests.cs +++ b/test/GitHub.Exports.UnitTests/VSServicesTests.cs @@ -92,9 +92,10 @@ VSServices CreateVSServices(string repoDir, IOperatingSystem os = null, DTE dte if (repoDir != null) { + var gitDir = Path.Combine(repoDir, ".git"); var directoryInfo = Substitute.For(); directoryInfo.Exists.Returns(repoDirExists); - os.Directory.GetDirectory(repoDir).Returns(directoryInfo); + os.Directory.GetDirectory(gitDir).Returns(directoryInfo); } var provider = Substitute.For();