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

Commit d131c40

Browse files
committed
SAVEPOINT
1 parent 22c7c76 commit d131c40

File tree

5 files changed

+150
-40
lines changed

5 files changed

+150
-40
lines changed

src/GitHub.InlineReviews/GitHub.InlineReviews.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
<Compile Include="Models\InlineCommentThreadModel.cs" />
8989
<Compile Include="Models\PullRequestSessionLiveFile.cs" />
9090
<Compile Include="Models\PullRequestSessionFile.cs" />
91+
<Compile Include="Services\IPullRequestFilterService.cs" />
92+
<Compile Include="Services\PullRequestFilterService.cs" />
9193
<Compile Include="Services\PullRequestStatusBarManager.cs" />
9294
<Compile Include="Tags\MouseEnterAndLeaveEventRouter.cs" />
9395
<Compile Include="Peek\InlineCommentPeekableItemSource.cs" />

src/GitHub.InlineReviews/PullRequestFilterProvider.cs

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System.Collections.Generic;
22
using System.ComponentModel.Composition;
3-
using System.IO;
43
using System.Threading.Tasks;
4+
using GitHub.InlineReviews.Services;
55
using GitHub.Services;
66
using GitHub.VisualStudio;
77
using Microsoft.Internal.VisualStudio.PlatformUI;
@@ -20,46 +20,34 @@ public static class PullRequestFilterPackageGuids
2020
public class PullRequestFilterProvider : HierarchyTreeFilterProvider
2121
{
2222
private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;
23-
private readonly IGitHubServiceProvider githubServiceProvider;
23+
readonly IGitHubServiceProvider githubServiceProvider;
24+
readonly IPullRequestFilterService pullRequestFilterService;
2425

2526
[ImportingConstructor]
26-
public PullRequestFilterProvider(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider)
27+
public PullRequestFilterProvider(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider, IPullRequestFilterService pullRequestFilterService)
2728
{
2829
this.hierarchyCollectionProvider = hierarchyCollectionProvider;
2930
this.githubServiceProvider = githubServiceProvider;
31+
this.pullRequestFilterService = pullRequestFilterService;
3032
}
3133

3234
protected override HierarchyTreeFilter CreateFilter()
3335
{
34-
return new PullRequestFilter(hierarchyCollectionProvider, githubServiceProvider);
36+
return new PullRequestFilter(hierarchyCollectionProvider, githubServiceProvider, pullRequestFilterService);
3537
}
3638

3739
private sealed class PullRequestFilter : HierarchyTreeFilter
3840
{
3941
private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;
40-
private readonly IGitHubServiceProvider githubServiceProvider;
41-
private IPullRequestSessionManager sessionManager;
42+
readonly IGitHubServiceProvider githubServiceProvider;
43+
readonly IPullRequestFilterService pullRequestFilterService;
4244
private HashSet<string> pullRequestSessionFiles;
4345

44-
public PullRequestFilter(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider)
46+
public PullRequestFilter(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider, IPullRequestFilterService pullRequestFilterService)
4547
{
4648
this.hierarchyCollectionProvider = hierarchyCollectionProvider;
4749
this.githubServiceProvider = githubServiceProvider;
48-
}
49-
50-
IPullRequestSessionManager SessionManager
51-
{
52-
get
53-
{
54-
// Lazily load the pull request session manager to prevent all of our assemblies
55-
// being loaded on VS startup.
56-
if (sessionManager == null)
57-
{
58-
sessionManager = githubServiceProvider.GetService<IPullRequestSessionManager>();
59-
}
60-
61-
return sessionManager;
62-
}
50+
this.pullRequestFilterService = pullRequestFilterService;
6351
}
6452

6553
// Gets the items to be included from this filter provider.
@@ -75,25 +63,12 @@ protected override async Task<IReadOnlyObservableSet> GetIncludedItemsAsync(IEnu
7563
string _;
7664
vsSolution.GetSolutionInfo(out solutionDirectory, out _, out _);
7765

78-
this.pullRequestSessionFiles = new HashSet<string>();
79-
if (SessionManager.CurrentSession != null)
80-
{
81-
var requestSessionFiles = await SessionManager.CurrentSession.GetAllFiles();
82-
requestSessionFiles.ForEach(file => this.pullRequestSessionFiles.Add(BuildAbsolutePath(solutionDirectory, file.RelativePath)));
83-
}
84-
85-
return await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(sourceItems, ShouldIncludeInFilter, CancellationToken);
86-
}
66+
pullRequestSessionFiles = await pullRequestFilterService.GetPullRequestSessionFiles(solutionDirectory);
8767

88-
// Returns true if filters hierarchy item name for given filter; otherwise, false</returns>
89-
private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem)
90-
{
91-
return hierarchyItem?.CanonicalName != null && pullRequestSessionFiles.Contains(hierarchyItem.CanonicalName.ToUpperInvariant());
92-
}
93-
94-
private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath)
95-
{
96-
return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToUpperInvariant();
68+
return
69+
await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(sourceItems,
70+
hierarchyItem => PullRequestFilterService.ShouldIncludeInFilter(pullRequestSessionFiles, hierarchyItem),
71+
CancellationToken);
9772
}
9873
}
9974
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
4+
namespace GitHub.InlineReviews.Services
5+
{
6+
public interface IPullRequestFilterService
7+
{
8+
Task<HashSet<string>> GetPullRequestSessionFiles(string solutionDirectory);
9+
}
10+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System.Collections.Generic;
2+
using System.ComponentModel.Composition;
3+
using System.IO;
4+
using System.Threading.Tasks;
5+
using GitHub.Services;
6+
using Microsoft.VisualStudio.Shell;
7+
8+
namespace GitHub.InlineReviews.Services
9+
{
10+
[Export(typeof(IPullRequestFilterService))]
11+
public class PullRequestFilterService : IPullRequestFilterService
12+
{
13+
readonly IGitHubServiceProvider githubServiceProvider;
14+
private IPullRequestSessionManager sessionManager;
15+
16+
public PullRequestFilterService(IGitHubServiceProvider githubServiceProvider)
17+
{
18+
this.githubServiceProvider = githubServiceProvider;
19+
}
20+
21+
IPullRequestSessionManager SessionManager
22+
{
23+
get
24+
{
25+
// Lazily load the pull request session manager to prevent all of our assemblies
26+
// being loaded on VS startup.
27+
if (sessionManager == null)
28+
{
29+
sessionManager = githubServiceProvider.GetService<IPullRequestSessionManager>();
30+
}
31+
32+
return sessionManager;
33+
}
34+
}
35+
36+
public async Task<HashSet<string>> GetPullRequestSessionFiles(string solutionDirectory)
37+
{
38+
var pullRequestSessionFiles = new HashSet<string>();
39+
40+
if (SessionManager.CurrentSession != null)
41+
{
42+
var requestSessionFiles = await SessionManager.CurrentSession.GetAllFiles();
43+
requestSessionFiles.ForEach(file => pullRequestSessionFiles.Add(BuildAbsolutePath(solutionDirectory, file.RelativePath)));
44+
}
45+
46+
return pullRequestSessionFiles;
47+
}
48+
49+
// Returns true if filters hierarchy item name for given filter; otherwise, false</returns>
50+
public static bool ShouldIncludeInFilter(HashSet<string> hashSet, IVsHierarchyItem hierarchyItem)
51+
{
52+
return hierarchyItem?.CanonicalName != null && hashSet.Contains(hierarchyItem.CanonicalName.ToUpperInvariant());
53+
}
54+
55+
private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath)
56+
{
57+
return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToUpperInvariant();
58+
}
59+
}
60+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using GitHub.InlineReviews.Services;
4+
using GitHub.Models;
5+
using GitHub.Services;
6+
using NSubstitute;
7+
using NUnit.Framework;
8+
9+
namespace GitHub.InlineReviews.UnitTests.Services
10+
{
11+
public class PullRequestFilterServiceTests
12+
{
13+
[Test]
14+
public async Task GetPullRequestSessionFiles()
15+
{
16+
var gitHubServiceProvider = CreateGitHubServiceProvider(new List<IPullRequestSessionFile>());
17+
18+
var pullRequestFilterService = new PullRequestFilterService(gitHubServiceProvider);
19+
20+
var pullRequestSessionFiles = await pullRequestFilterService.GetPullRequestSessionFiles(@"c:\MySolution");
21+
22+
Assert.That(pullRequestSessionFiles, Is.Empty);
23+
}
24+
25+
[Test]
26+
public async Task GetPullRequestSessionFiles2()
27+
{
28+
var pullRequestSessionFilesStub = new List<IPullRequestSessionFile>();
29+
var pullRequestSessionFile = Substitute.For<IPullRequestSessionFile>();
30+
pullRequestSessionFile.RelativePath.Returns("test");
31+
pullRequestSessionFilesStub.Add(pullRequestSessionFile);
32+
33+
var gitHubServiceProvider = CreateGitHubServiceProvider(pullRequestSessionFilesStub);
34+
35+
var pullRequestFilterService = new PullRequestFilterService(gitHubServiceProvider);
36+
37+
var pullRequestSessionFiles = await pullRequestFilterService.GetPullRequestSessionFiles(@"c:\MySolution");
38+
39+
Assert.That(pullRequestSessionFiles, Is.Empty);
40+
}
41+
42+
IGitHubServiceProvider CreateGitHubServiceProvider(List<IPullRequestSessionFile> pullRequestSessionFilesStub)
43+
{
44+
var gitHubServiceProvider = Substitute.For<IGitHubServiceProvider>();
45+
gitHubServiceProvider.GetService<IPullRequestSessionManager>().Returns(_ => CreatePullRequestSessionManager(pullRequestSessionFilesStub));
46+
return gitHubServiceProvider;
47+
}
48+
49+
IPullRequestSessionManager CreatePullRequestSessionManager(List<IPullRequestSessionFile> pullRequestSessionFiles)
50+
{
51+
var pullRequestSessionManager = Substitute.For<IPullRequestSessionManager>();
52+
pullRequestSessionManager.CurrentSession.Returns(_ => CreateCurrentSession(pullRequestSessionFiles));
53+
return pullRequestSessionManager;
54+
}
55+
56+
IPullRequestSession CreateCurrentSession(List<IPullRequestSessionFile> pullRequestSessionFilesStub)
57+
{
58+
var pullRequestSession = Substitute.For<IPullRequestSession>();
59+
pullRequestSession.GetAllFiles().Returns(_ => pullRequestSessionFilesStub);
60+
return pullRequestSession;
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)