This repository was archived by the owner on Jun 21, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathPullRequestFilterProvider.cs
More file actions
100 lines (86 loc) · 4.58 KB
/
PullRequestFilterProvider.cs
File metadata and controls
100 lines (86 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Threading.Tasks;
using GitHub.Services;
using GitHub.VisualStudio;
using Microsoft.Internal.VisualStudio.PlatformUI;
using Microsoft.VisualStudio.Shell;
namespace GitHub.InlineReviews
{
public static class PullRequestFilterPackageGuids
{
public const string GuidPullRequestFilterPackageCmdSetString = "7cde2dfc-43c9-41ff-bf2e-bef41cd99e09";
public const int PullRequestFilterId = 0x0100;
}
[SolutionTreeFilterProvider(PullRequestFilterPackageGuids.GuidPullRequestFilterPackageCmdSetString, PullRequestFilterPackageGuids.PullRequestFilterId)]
[Export]
public class PullRequestFilterProvider : HierarchyTreeFilterProvider
{
private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;
private readonly IGitHubServiceProvider githubServiceProvider;
[ImportingConstructor]
public PullRequestFilterProvider(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider)
{
this.hierarchyCollectionProvider = hierarchyCollectionProvider;
this.githubServiceProvider = githubServiceProvider;
}
protected override HierarchyTreeFilter CreateFilter()
{
return new PullRequestFilter(hierarchyCollectionProvider, githubServiceProvider);
}
private sealed class PullRequestFilter : HierarchyTreeFilter
{
private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;
private readonly IGitHubServiceProvider githubServiceProvider;
private IPullRequestSessionManager sessionManager;
private HashSet<string> pullRequestSessionFiles;
public PullRequestFilter(IVsHierarchyItemCollectionProvider hierarchyCollectionProvider, IGitHubServiceProvider githubServiceProvider)
{
this.hierarchyCollectionProvider = hierarchyCollectionProvider;
this.githubServiceProvider = githubServiceProvider;
}
IPullRequestSessionManager SessionManager
{
get
{
// Lazily load the pull request session manager to prevent all of our assemblies
// being loaded on VS startup.
if (sessionManager == null)
{
sessionManager = githubServiceProvider.GetService<IPullRequestSessionManager>();
}
return sessionManager;
}
}
// Gets the items to be included from this filter provider.
// rootItems is a collection that contains the root of your solution
// Returns a collection of items to be included as part of the filter
protected override async Task<IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable<IVsHierarchyItem> rootItems)
{
var root = HierarchyUtilities.FindCommonAncestor(rootItems);
var sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync(root.HierarchyIdentity.NestedHierarchy, CancellationToken);
var vsSolution = githubServiceProvider.GetSolution();
string solutionDirectory;
string _;
vsSolution.GetSolutionInfo(out solutionDirectory, out _, out _);
this.pullRequestSessionFiles = new HashSet<string>();
if (SessionManager.CurrentSession != null)
{
var requestSessionFiles = await SessionManager.CurrentSession.GetAllFiles();
requestSessionFiles.ForEach(file => this.pullRequestSessionFiles.Add(BuildAbsolutePath(solutionDirectory, file.RelativePath)));
}
return await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(sourceItems, ShouldIncludeInFilter, CancellationToken);
}
// Returns true if filters hierarchy item name for given filter; otherwise, false</returns>
private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem)
{
return hierarchyItem?.CanonicalName != null && pullRequestSessionFiles.Contains(hierarchyItem.CanonicalName.ToUpperInvariant());
}
private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath)
{
return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToUpperInvariant();
}
}
}
}