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

Commit f56d217

Browse files
authored
Merge branch 'master' into jcansdale/dont-spam-log
2 parents 37c491e + a0d9ad2 commit f56d217

File tree

9 files changed

+79
-62
lines changed

9 files changed

+79
-62
lines changed

src/GitHub.Api/LoginManager.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class LoginManager : ILoginManager
1414
{
1515
readonly string[] scopes = { "user", "repo", "gist", "write:public_key" };
1616
readonly IKeychain keychain;
17-
readonly ITwoFactorChallengeHandler twoFactorChallengeHandler;
17+
readonly Lazy<ITwoFactorChallengeHandler> twoFactorChallengeHandler;
1818
readonly string clientId;
1919
readonly string clientSecret;
2020
readonly string authorizationNote;
@@ -31,7 +31,7 @@ public class LoginManager : ILoginManager
3131
/// <param name="fingerprint">The machine fingerprint.</param>
3232
public LoginManager(
3333
IKeychain keychain,
34-
ITwoFactorChallengeHandler twoFactorChallengeHandler,
34+
Lazy<ITwoFactorChallengeHandler> twoFactorChallengeHandler,
3535
string clientId,
3636
string clientSecret,
3737
string authorizationNote = null,
@@ -194,7 +194,7 @@ async Task<ApplicationAuthorization> HandleTwoFactorAuthorization(
194194
{
195195
for (;;)
196196
{
197-
var challengeResult = await twoFactorChallengeHandler.HandleTwoFactorException(exception);
197+
var challengeResult = await twoFactorChallengeHandler.Value.HandleTwoFactorException(exception);
198198

199199
if (challengeResult == null)
200200
{
@@ -218,7 +218,7 @@ async Task<ApplicationAuthorization> HandleTwoFactorAuthorization(
218218
}
219219
catch (Exception e)
220220
{
221-
await twoFactorChallengeHandler.ChallengeFailed(e);
221+
await twoFactorChallengeHandler.Value.ChallengeFailed(e);
222222
await keychain.Delete(hostAddress).ConfigureAwait(false);
223223
throw;
224224
}

src/GitHub.InlineReviews/InlineCommentMarginProvider.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,43 @@ internal sealed class InlineCommentMarginProvider : IWpfTextViewMarginProvider
2828
const string MarginName = "InlineComment";
2929
const string MarginPropertiesName = "Indicator Margin"; // Same background color as Glyph margin
3030

31+
readonly IGitHubServiceProvider serviceProvider;
3132
readonly IEditorFormatMapService editorFormatMapService;
3233
readonly IViewTagAggregatorFactoryService tagAggregatorFactory;
3334
readonly IInlineCommentPeekService peekService;
34-
readonly IPullRequestSessionManager sessionManager;
3535
readonly IPackageSettings packageSettings;
36+
IPullRequestSessionManager sessionManager;
3637

3738
[ImportingConstructor]
3839
public InlineCommentMarginProvider(
40+
IGitHubServiceProvider serviceProvider,
3941
IEditorFormatMapService editorFormatMapService,
4042
IViewTagAggregatorFactoryService tagAggregatorFactory,
4143
IInlineCommentPeekService peekService,
42-
IPullRequestSessionManager sessionManager,
4344
IPackageSettings packageSettings)
4445
{
46+
this.serviceProvider = serviceProvider;
4547
this.editorFormatMapService = editorFormatMapService;
4648
this.tagAggregatorFactory = tagAggregatorFactory;
4749
this.peekService = peekService;
48-
this.sessionManager = sessionManager;
4950
this.packageSettings = packageSettings;
5051
}
5152

53+
IPullRequestSessionManager SessionManager
54+
{
55+
get
56+
{
57+
// Lazily load the pull request session manager to prevent all of our assemblies
58+
// being loaded on VS startup.
59+
if (sessionManager == null)
60+
{
61+
sessionManager = serviceProvider.GetService<IPullRequestSessionManager>();
62+
}
63+
64+
return sessionManager;
65+
}
66+
}
67+
5268
public IWpfTextViewMargin CreateMargin(IWpfTextViewHost wpfTextViewHost, IWpfTextViewMargin parent)
5369
{
5470
if (IsMarginDisabled(wpfTextViewHost))
@@ -95,7 +111,7 @@ void TrackCommentGlyph(IWpfTextViewHost host, UIElement marginElement)
95111

96112
bool IsMarginVisible(ITextBuffer buffer)
97113
{
98-
if (sessionManager.GetTextBufferInfo(buffer) != null)
114+
if (SessionManager.GetTextBufferInfo(buffer) != null)
99115
{
100116
return true;
101117
}

src/GitHub.TeamFoundation.14/Connect/GitHubConnectSection.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ public class GitHubConnectSection : TeamExplorerSectionBase, IGitHubConnectSecti
3232
readonly IPackageSettings packageSettings;
3333
readonly IVSServices vsServices;
3434
readonly int sectionIndex;
35-
readonly IDialogService dialogService;
36-
readonly IRepositoryCloneService cloneService;
3735
readonly ILocalRepositories localRepositories;
3836

3937
bool isCloning;
@@ -100,8 +98,6 @@ public GitHubConnectSection(IGitHubServiceProvider serviceProvider,
10098
IConnectionManager manager,
10199
IPackageSettings packageSettings,
102100
IVSServices vsServices,
103-
IRepositoryCloneService cloneService,
104-
IDialogService dialogService,
105101
ILocalRepositories localRepositories,
106102
int index)
107103
: base(serviceProvider, apiFactory, holder, manager)
@@ -111,8 +107,6 @@ public GitHubConnectSection(IGitHubServiceProvider serviceProvider,
111107
Guard.ArgumentNotNull(manager, nameof(manager));
112108
Guard.ArgumentNotNull(packageSettings, nameof(packageSettings));
113109
Guard.ArgumentNotNull(vsServices, nameof(vsServices));
114-
Guard.ArgumentNotNull(cloneService, nameof(cloneService));
115-
Guard.ArgumentNotNull(dialogService, nameof(dialogService));
116110
Guard.ArgumentNotNull(localRepositories, nameof(localRepositories));
117111

118112
Title = "GitHub";
@@ -123,8 +117,6 @@ public GitHubConnectSection(IGitHubServiceProvider serviceProvider,
123117

124118
this.packageSettings = packageSettings;
125119
this.vsServices = vsServices;
126-
this.cloneService = cloneService;
127-
this.dialogService = dialogService;
128120
this.localRepositories = localRepositories;
129121

130122
Clone = CreateAsyncCommandHack(DoClone);
@@ -136,13 +128,15 @@ public GitHubConnectSection(IGitHubServiceProvider serviceProvider,
136128

137129
async Task DoClone()
138130
{
131+
var dialogService = ServiceProvider.GetService<IDialogService>();
139132
var result = await dialogService.ShowCloneDialog(SectionConnection);
140133

141134
if (result != null)
142135
{
143136
try
144137
{
145138
ServiceProvider.GitServiceProvider = TEServiceProvider;
139+
var cloneService = ServiceProvider.GetService<IRepositoryCloneService>();
146140
await cloneService.CloneRepository(
147141
result.Repository.CloneUrl,
148142
result.Repository.Name,
@@ -381,6 +375,7 @@ async Task RefreshRepositories()
381375

382376
public void DoCreate()
383377
{
378+
var dialogService = ServiceProvider.GetService<IDialogService>();
384379
dialogService.ShowCreateRepositoryDialog(SectionConnection);
385380
}
386381

@@ -391,6 +386,7 @@ public void SignOut()
391386

392387
public void Login()
393388
{
389+
var dialogService = ServiceProvider.GetService<IDialogService>();
394390
dialogService.ShowLoginDialog();
395391
}
396392

src/GitHub.TeamFoundation.14/Connect/GitHubConnectSection0.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ public GitHubConnectSection0(IGitHubServiceProvider serviceProvider,
2020
IConnectionManager manager,
2121
IPackageSettings settings,
2222
IVSServices vsServices,
23-
IRepositoryCloneService cloneService,
24-
IDialogService dialogService,
2523
ILocalRepositories localRepositories)
26-
: base(serviceProvider, apiFactory, holder, manager, settings, vsServices, cloneService, dialogService, localRepositories, 0)
24+
: base(serviceProvider, apiFactory, holder, manager, settings, vsServices, localRepositories, 0)
2725
{
2826
}
2927
}

src/GitHub.TeamFoundation.14/Connect/GitHubConnectSection1.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ public GitHubConnectSection1(IGitHubServiceProvider serviceProvider,
2020
IConnectionManager manager,
2121
IPackageSettings settings,
2222
IVSServices vsServices,
23-
IRepositoryCloneService cloneService,
24-
IDialogService dialogService,
2523
ILocalRepositories localRepositories)
26-
: base(serviceProvider, apiFactory, holder, manager, settings, vsServices, cloneService, dialogService, localRepositories, 1)
24+
: base(serviceProvider, apiFactory, holder, manager, settings, vsServices, localRepositories, 1)
2725
{
2826
}
2927
}

src/GitHub.TeamFoundation.14/Home/GitHubHomeSection.cs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
using System;
22
using System.ComponentModel.Composition;
3+
using System.Diagnostics;
4+
using System.Windows.Input;
5+
using GitHub.Api;
6+
using GitHub.Extensions;
7+
using GitHub.Info;
8+
using GitHub.Primitives;
9+
using GitHub.Services;
10+
using GitHub.Settings;
311
using GitHub.UI;
412
using GitHub.VisualStudio.Base;
513
using GitHub.VisualStudio.Helpers;
14+
using GitHub.VisualStudio.UI;
615
using GitHub.VisualStudio.UI.Views;
716
using Microsoft.TeamFoundation.Controls;
8-
using GitHub.Services;
9-
using GitHub.Api;
10-
using GitHub.Primitives;
11-
using System.Threading.Tasks;
12-
using System.Diagnostics;
13-
using GitHub.Extensions;
14-
using System.Windows.Input;
15-
using ReactiveUI;
16-
using GitHub.VisualStudio.UI;
17-
using GitHub.Settings;
18-
using System.Windows.Threading;
19-
using GitHub.Info;
2017

2118
namespace GitHub.VisualStudio.TeamExplorer.Home
2219
{
@@ -32,7 +29,6 @@ public class GitHubHomeSection : TeamExplorerSectionBase, IGitHubHomeSection
3229
readonly ITeamExplorerServices teamExplorerServices;
3330
readonly IPackageSettings settings;
3431
readonly IUsageTracker usageTracker;
35-
readonly IDialogService dialogService;
3632

3733
[ImportingConstructor]
3834
public GitHubHomeSection(IGitHubServiceProvider serviceProvider,
@@ -41,8 +37,7 @@ public GitHubHomeSection(IGitHubServiceProvider serviceProvider,
4137
IVisualStudioBrowser visualStudioBrowser,
4238
ITeamExplorerServices teamExplorerServices,
4339
IPackageSettings settings,
44-
IUsageTracker usageTracker,
45-
IDialogService dialogService)
40+
IUsageTracker usageTracker)
4641
: base(serviceProvider, apiFactory, holder)
4742
{
4843
Title = "GitHub";
@@ -52,10 +47,8 @@ public GitHubHomeSection(IGitHubServiceProvider serviceProvider,
5247
this.teamExplorerServices = teamExplorerServices;
5348
this.settings = settings;
5449
this.usageTracker = usageTracker;
55-
this.dialogService = dialogService;
5650

57-
var openOnGitHub = ReactiveCommand.Create();
58-
openOnGitHub.Subscribe(_ => DoOpenOnGitHub());
51+
var openOnGitHub = new RelayCommand(_ => DoOpenOnGitHub());
5952
OpenOnGitHub = openOnGitHub;
6053
}
6154

@@ -118,6 +111,7 @@ static Octicon GetIcon(bool isPrivate, bool isHosted, bool isFork)
118111

119112
public void Login()
120113
{
114+
var dialogService = ServiceProvider.GetService<IDialogService>();
121115
dialogService.ShowLoginDialog();
122116
}
123117

src/GitHub.VisualStudio/GitHubPackage.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.ComponentModel.Composition;
33
using System.Diagnostics;
4+
using System.Reflection;
45
using System.Runtime.InteropServices;
56
using System.Threading;
67
using System.Threading.Tasks;
@@ -211,11 +212,20 @@ async Task<object> CreateService(IAsyncServiceContainer container, CancellationT
211212
{
212213
var serviceProvider = await GetServiceAsync(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider;
213214
var keychain = serviceProvider.GetService<IKeychain>();
214-
var twoFaHandler = serviceProvider.GetService<ITwoFactorChallengeHandler>();
215+
216+
// HACK: We need to make sure this is run on the main thread. We really
217+
// shouldn't be injecting a view model concern into LoginManager - this
218+
// needs to be refactored. See #1398.
219+
var lazy2Fa = new Lazy<ITwoFactorChallengeHandler>(() =>
220+
ThreadHelper.JoinableTaskFactory.Run(async () =>
221+
{
222+
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
223+
return serviceProvider.GetService<ITwoFactorChallengeHandler>();
224+
}));
215225

216226
return new LoginManager(
217227
keychain,
218-
twoFaHandler,
228+
lazy2Fa,
219229
ApiClientConfiguration.ClientId,
220230
ApiClientConfiguration.ClientSecret,
221231
ApiClientConfiguration.AuthorizationNote,

src/GitHub.VisualStudio/Services/GitHubServiceProvider.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Diagnostics.CodeAnalysis;
88
using System.Globalization;
99
using System.Linq;
10-
using System.Reactive.Disposables;
1110
using GitHub.Logging;
1211
using GitHub.Models;
1312
using GitHub.Exports;
@@ -89,11 +88,11 @@ class OwnedComposablePart
8988
}
9089

9190
static readonly ILogger log = LogManager.ForContext<GitHubServiceProvider>();
92-
CompositeDisposable disposables = new CompositeDisposable();
9391
readonly IServiceProviderPackage asyncServiceProvider;
9492
readonly IServiceProvider syncServiceProvider;
9593
readonly Dictionary<string, OwnedComposablePart> tempParts;
9694
readonly Version currentVersion;
95+
List<IDisposable> disposables = new List<IDisposable>();
9796
bool initialized = false;
9897

9998
public ExportProvider ExportProvider { get; private set; }
@@ -290,7 +289,13 @@ protected void Dispose(bool disposing)
290289
if (disposed) return;
291290

292291
if (disposables != null)
293-
disposables.Dispose();
292+
{
293+
foreach (var disposable in disposables)
294+
{
295+
disposable.Dispose();
296+
}
297+
}
298+
294299
disposables = null;
295300
if (tempContainer != null)
296301
tempContainer.Dispose();

0 commit comments

Comments
 (0)