From 79a8aea0ad5145b567a1cd1f58a8cbecfbbcf9dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Kemp=C3=A9?= Date: Wed, 16 May 2018 08:19:07 +0200 Subject: [PATCH 1/8] Add Pull Request filter button to Visual Studio solution explorer --- .../GitHub.InlineReviews.csproj | 2 + .../InlineReviewsPackage.vsct | 17 +++ .../PullRequestFilterProvider.cs | 98 ++++++++++++++++++ .../Resources/PullRequestFilterCommand.png | Bin 0 -> 1457 bytes 4 files changed, 117 insertions(+) create mode 100644 src/GitHub.InlineReviews/PullRequestFilterProvider.cs create mode 100644 src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png diff --git a/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj b/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj index c743cdc468..6479f354f7 100644 --- a/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj +++ b/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj @@ -76,6 +76,7 @@ + @@ -456,6 +457,7 @@ PreserveNewest + diff --git a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct index 6cb4c884bb..c4645d640a 100644 --- a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct +++ b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct @@ -64,7 +64,19 @@ .GitHub.PreviousComment + + + + @@ -81,6 +93,11 @@ + + + + + diff --git a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs new file mode 100644 index 0000000000..66826e1662 --- /dev/null +++ b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs @@ -0,0 +1,98 @@ +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 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 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(); + } + + 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 GetIncludedItemsAsync(IEnumerable rootItems) + { + var root = HierarchyUtilities.FindCommonAncestor(rootItems); + var sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync(root.HierarchyIdentity.NestedHierarchy, CancellationToken); + + var vsSolution = githubServiceProvider.GetSolution(); + vsSolution.GetSolutionInfo(out var solutionDirectory, out _, out _); + + this.pullRequestSessionFiles = new HashSet(); + 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 + private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem) + { + return hierarchyItem?.CanonicalName != null && pullRequestSessionFiles.Contains(hierarchyItem.CanonicalName); + } + + private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath) + { + return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToLower(); + } + } + } +} diff --git a/src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png b/src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..3b690845d912bc85dedba801172f914cf71b5d4f GIT binary patch literal 1457 zcmV;i1y1^jP)AHIP00004XF*Lt006O% z3;baP00009a7bBm000&w000&w0h<-Z6aWAK7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHvEiZ-v9swFG)l}R9HvFm~TjART#!){BMSSi9WQ#5}2}RDxu4D!m_dVx~XP@VubI&z_i2hd&(%#=+}vEQn>(KbCb7Y%m|uN9A5~RVIT#rkq21kG1W|5v7uw(7KOG8%E-@E^ z!C-`?e@Km;Ez||rqvk_R+ArnOmmXd zy|Yf|KKz?bG6eer0+65Mi7qzgr9dDcOkNMH({^y@A>>NnzE>~?cQuS3eCkob?BzGn zb`xzdnLl6K@XynY$}=?fLIoiR4zL*Qra1v={&R2b3eKGUip%D{DoL&+l9+009oQe# z0LshD3$wDa3cI?x3YwalGTm*-^Ca`0D!xk>)4W3ei(87LAPB4m@yl4IIjO*Wy%q`GXp`|0=LM^wp}}2J zQgV|6XsNEQeo#?S@p)!uCSjXONlCd{UtfPgbhM<7j|E+9>VnvM=H`v&gW%S-SOsjP z_yV~F;qI0Jz--j88njTNn*UJ)2xmTUUa<1=^4!cD_?(}gPsPQ>a3*6{FfB|nT;)6&wYx3_nXx1f@Of`U689UbKLdOfMBsZ?58N=r*iFCOMU5D8su z>ZemvQ`FYhW;7q%n!iOYEiDM(TWgq*DFpC!%d6-s9=cXnTc$aw97h1*LU3MKN>5M! zAUQdiOaImQ`SA4QfgA9?(ooSb^d{EhVus;jG`g@px} zdd?au6fOY1`@L2-hfH$ZAgY=KKAAVZP+z#dezgZkBvL zKMj5|NHsMzG(J8K^S@+V)^Lo!cK^;|q%Fv?|3juZNn{Ao9z#`wRl{XX#d%>V-T@qB zK30Oqot`~?Yi00a8nI9217kPJ?^5Sq8$$5kM{QVz2)U)d$Qf#-67QZbhOji+4&l`xzzEo zzy^ggU;Md&Yc{%Yw3NmJ1c5srM^m)JY=neW{5(B9Z8YCxxGuTHNb|88@G!QTZDIdM z8&(0v$Ubr&c*sg~!yzBchkY}Sg!6*M$4z%xSy_Nz#BMh?H}A8_Pl^T>w}rB^vv2bX z`JDr3e7j_-&THu^CcLbT>X^3D!tz7$pkwkB**i({XOKS!u@fvGT8t?3-6`M_9= zCy)$5HUF>yz;GTD1bmlYvdRaF`=92%eg Date: Wed, 16 May 2018 10:49:27 +0100 Subject: [PATCH 2/8] Fix build for C# 6.0/Visual Studio 2015 Alas `out var` isn't supported. --- src/GitHub.InlineReviews/PullRequestFilterProvider.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs index 66826e1662..be754fd657 100644 --- a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs +++ b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs @@ -71,7 +71,9 @@ protected override async Task GetIncludedItemsAsync(IEnu var sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync(root.HierarchyIdentity.NestedHierarchy, CancellationToken); var vsSolution = githubServiceProvider.GetSolution(); - vsSolution.GetSolutionInfo(out var solutionDirectory, out _, out _); + string solutionDirectory; + string _; + vsSolution.GetSolutionInfo(out solutionDirectory, out _, out _); this.pullRequestSessionFiles = new HashSet(); if (SessionManager.CurrentSession != null) From c3545157ad80347a0434be4aee31523093f92c44 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 16 May 2018 11:19:42 +0100 Subject: [PATCH 3/8] Add IDSymbol for pullrequest Bitmap --- src/GitHub.InlineReviews/InlineReviewsPackage.vsct | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct index c4645d640a..ea80072a9c 100644 --- a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct +++ b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct @@ -75,7 +75,7 @@ - + @@ -99,12 +99,7 @@ - - - - - - + From fa7db93095b55eeb862ad4b85e0bf624c0e8c622 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Wed, 16 May 2018 11:47:52 +0100 Subject: [PATCH 4/8] Keep CA happy by using ToUpperInvariant I think there's a bug in CA where it suggests changing ToLowerInvariant to ToUpperInvariant (I don't think it matters in this case). Make PullRequestFilterPackageGuids a static class. --- src/GitHub.InlineReviews/PullRequestFilterProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs index be754fd657..7a262ac50f 100644 --- a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs +++ b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs @@ -9,7 +9,7 @@ namespace GitHub.InlineReviews { - public class PullRequestFilterPackageGuids + public static class PullRequestFilterPackageGuids { public const string GuidPullRequestFilterPackageCmdSetString = "7cde2dfc-43c9-41ff-bf2e-bef41cd99e09"; public const int PullRequestFilterId = 0x0100; @@ -93,7 +93,7 @@ private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem) private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath) { - return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToLower(); + return Path.Combine(solutionDirectory, fileRelativePath.Replace("/", @"\")).ToUpperInvariant(); } } } From 0b1a752bb3ad898ebdf454a569aec86101e21bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Kemp=C3=A9?= Date: Wed, 16 May 2018 18:34:53 +0200 Subject: [PATCH 5/8] Fix issue introduced in previous commit We need to compare hierarchy items, which come in lower case, to pull request session files in upper case! --- src/GitHub.InlineReviews/PullRequestFilterProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs index 7a262ac50f..f975363610 100644 --- a/src/GitHub.InlineReviews/PullRequestFilterProvider.cs +++ b/src/GitHub.InlineReviews/PullRequestFilterProvider.cs @@ -88,7 +88,7 @@ protected override async Task GetIncludedItemsAsync(IEnu // Returns true if filters hierarchy item name for given filter; otherwise, false private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem) { - return hierarchyItem?.CanonicalName != null && pullRequestSessionFiles.Contains(hierarchyItem.CanonicalName); + return hierarchyItem?.CanonicalName != null && pullRequestSessionFiles.Contains(hierarchyItem.CanonicalName.ToUpperInvariant()); } private static string BuildAbsolutePath(string solutionDirectory, string fileRelativePath) From d54e07281f44904eaba41a74d513d19bca1f2f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Kemp=C3=A9?= Date: Sun, 21 Oct 2018 14:15:03 +0200 Subject: [PATCH 6/8] Try to use the pull request image from GitHub.VisualStudio --- .../GitHub.InlineReviews.csproj | 8 ++++++-- .../GitHub.InlineReviews.imagemanifest | 17 +++++++++++++++++ .../InlineReviewsPackage.vsct | 7 ++----- .../Resources/PullRequestFilterCommand.png | Bin 1457 -> 0 bytes 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 src/GitHub.InlineReviews/GitHub.InlineReviews.imagemanifest delete mode 100644 src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png diff --git a/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj b/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj index a2ccbd1de2..290e2ee97c 100644 --- a/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj +++ b/src/GitHub.InlineReviews/GitHub.InlineReviews.csproj @@ -141,6 +141,11 @@ + + PreserveNewest + true + Designer + Designer @@ -447,7 +452,6 @@ PreserveNewest - @@ -467,7 +471,7 @@ - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct index 022c4981ca..fb36c3f872 100644 --- a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct +++ b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct @@ -66,7 +66,7 @@ - - - @@ -108,7 +105,7 @@ - + diff --git a/src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png b/src/GitHub.InlineReviews/Resources/PullRequestFilterCommand.png deleted file mode 100644 index 3b690845d912bc85dedba801172f914cf71b5d4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1457 zcmV;i1y1^jP)AHIP00004XF*Lt006O% z3;baP00009a7bBm000&w000&w0h<-Z6aWAK7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHvEiZ-v9swFG)l}R9HvFm~TjART#!){BMSSi9WQ#5}2}RDxu4D!m_dVx~XP@VubI&z_i2hd&(%#=+}vEQn>(KbCb7Y%m|uN9A5~RVIT#rkq21kG1W|5v7uw(7KOG8%E-@E^ z!C-`?e@Km;Ez||rqvk_R+ArnOmmXd zy|Yf|KKz?bG6eer0+65Mi7qzgr9dDcOkNMH({^y@A>>NnzE>~?cQuS3eCkob?BzGn zb`xzdnLl6K@XynY$}=?fLIoiR4zL*Qra1v={&R2b3eKGUip%D{DoL&+l9+009oQe# z0LshD3$wDa3cI?x3YwalGTm*-^Ca`0D!xk>)4W3ei(87LAPB4m@yl4IIjO*Wy%q`GXp`|0=LM^wp}}2J zQgV|6XsNEQeo#?S@p)!uCSjXONlCd{UtfPgbhM<7j|E+9>VnvM=H`v&gW%S-SOsjP z_yV~F;qI0Jz--j88njTNn*UJ)2xmTUUa<1=^4!cD_?(}gPsPQ>a3*6{FfB|nT;)6&wYx3_nXx1f@Of`U689UbKLdOfMBsZ?58N=r*iFCOMU5D8su z>ZemvQ`FYhW;7q%n!iOYEiDM(TWgq*DFpC!%d6-s9=cXnTc$aw97h1*LU3MKN>5M! zAUQdiOaImQ`SA4QfgA9?(ooSb^d{EhVus;jG`g@px} zdd?au6fOY1`@L2-hfH$ZAgY=KKAAVZP+z#dezgZkBvL zKMj5|NHsMzG(J8K^S@+V)^Lo!cK^;|q%Fv?|3juZNn{Ao9z#`wRl{XX#d%>V-T@qB zK30Oqot`~?Yi00a8nI9217kPJ?^5Sq8$$5kM{QVz2)U)d$Qf#-67QZbhOji+4&l`xzzEo zzy^ggU;Md&Yc{%Yw3NmJ1c5srM^m)JY=neW{5(B9Z8YCxxGuTHNb|88@G!QTZDIdM z8&(0v$Ubr&c*sg~!yzBchkY}Sg!6*M$4z%xSy_Nz#BMh?H}A8_Pl^T>w}rB^vv2bX z`JDr3e7j_-&THu^CcLbT>X^3D!tz7$pkwkB**i({XOKS!u@fvGT8t?3-6`M_9= zCy)$5HUF>yz;GTD1bmlYvdRaF`=92%eg Date: Mon, 22 Oct 2018 20:07:54 +0200 Subject: [PATCH 7/8] Update src/GitHub.InlineReviews/InlineReviewsPackage.vsct Co-Authored-By: laurentkempe --- src/GitHub.InlineReviews/InlineReviewsPackage.vsct | 1 + 1 file changed, 1 insertion(+) diff --git a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct index fb36c3f872..2ca8e69ccb 100644 --- a/src/GitHub.InlineReviews/InlineReviewsPackage.vsct +++ b/src/GitHub.InlineReviews/InlineReviewsPackage.vsct @@ -67,6 +67,7 @@