From 790d4b33e08dabdb005ce45cd1b2b9fb43dc2309 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 11 Dec 2018 10:23:18 -0500 Subject: [PATCH 1/5] Adding appropriate null checks --- src/GitHub.App/Services/PullRequestService.cs | 14 ++++--- .../Services/PullRequestSessionService.cs | 38 ++++++++++++------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/GitHub.App/Services/PullRequestService.cs b/src/GitHub.App/Services/PullRequestService.cs index 55a85b7d98..0ed0edc728 100644 --- a/src/GitHub.App/Services/PullRequestService.cs +++ b/src/GitHub.App/Services/PullRequestService.cs @@ -168,12 +168,14 @@ public async Task> ReadPullRequests( LastCommit = pr.Commits(null, null, 1, null).Nodes.Select(commit => new LastCommitSummaryAdapter { - Statuses = commit.Commit.Status - .Select(context => - context.Contexts.Select(statusContext => new StatusSummaryModel - { - State = statusContext.State.FromGraphQl(), - }).ToList() + Statuses = commit.Commit.Status.Select(context => + context == null + ? null + : context.Contexts + .Select(statusContext => new StatusSummaryModel + { + State = statusContext.State.FromGraphQl() + }).ToList() ).SingleOrDefault() }).ToList().FirstOrDefault(), Author = new ActorModel diff --git a/src/GitHub.InlineReviews/Services/PullRequestSessionService.cs b/src/GitHub.InlineReviews/Services/PullRequestSessionService.cs index 5043b96d8c..e82ec9dbe3 100644 --- a/src/GitHub.InlineReviews/Services/PullRequestSessionService.cs +++ b/src/GitHub.InlineReviews/Services/PullRequestSessionService.cs @@ -364,11 +364,19 @@ public virtual async Task ReadPullRequestDetail(HostAddr var files = await apiClient.GetPullRequestFiles(owner, name, number).ToList(); var lastCommitModel = await GetPullRequestLastCommitAdapter(address, owner, name, number); - result.Statuses = lastCommitModel.Statuses; - result.CheckSuites = lastCommitModel.CheckSuites; - foreach (var checkSuite in result.CheckSuites) + result.Statuses = (IReadOnlyList) lastCommitModel.Statuses ?? Array.Empty(); + + if (lastCommitModel.CheckSuites == null) { - checkSuite.HeadSha = lastCommitModel.HeadSha; + result.CheckSuites = Array.Empty(); + } + else + { + result.CheckSuites = lastCommitModel.CheckSuites; + foreach (var checkSuite in result.CheckSuites) + { + checkSuite.HeadSha = lastCommitModel.HeadSha; + } } result.ChangedFiles = files.Select(file => new PullRequestFileModel @@ -829,16 +837,18 @@ async Task GetPullRequestLastCommitAdapter(HostAddress addres .PullRequest(Var(nameof(number))).Commits(last: 1).Nodes.Select( commit => new LastCommitAdapter { - Statuses = commit.Commit.Status - .Select(context => - context.Contexts.Select(statusContext => new StatusModel - { - State = statusContext.State.FromGraphQl(), - Context = statusContext.Context, - TargetUrl = statusContext.TargetUrl, - Description = statusContext.Description, - }).ToList() - ).SingleOrDefault() + Statuses = commit.Commit.Status == null ? null : commit.Commit.Status + .Select(context => context == null + ? null + : context.Contexts + .Select(statusContext => new StatusModel + { + State = statusContext.State.FromGraphQl(), + Context = statusContext.Context, + TargetUrl = statusContext.TargetUrl, + Description = statusContext.Description, + }).ToList() + ).SingleOrDefault() } ).Compile(); } From f3635e99b8c2a186747e83b1c55f40d201b74d5b Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 11 Dec 2018 10:34:50 -0500 Subject: [PATCH 2/5] Hiding the checks section if there are no checks to display --- .../SampleData/PullRequestDetailViewModelDesigner.cs | 2 ++ .../ViewModels/GitHubPane/PullRequestDetailViewModel.cs | 9 +++++++++ .../ViewModels/GitHubPane/IPullRequestDetailViewModel.cs | 5 +++++ .../Views/GitHubPane/PullRequestDetailView.xaml | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs b/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs index 9f1ad0262a..f6c2a8110d 100644 --- a/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs +++ b/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs @@ -98,6 +98,7 @@ public PullRequestDetailViewModelDesigner() Files = new PullRequestFilesViewModelDesigner(); Checks = Array.Empty(); + HasChecks = false; } public PullRequestDetailModel Model { get; } @@ -129,6 +130,7 @@ public PullRequestDetailViewModelDesigner() public ReactiveCommand ShowAnnotations { get; } public IReadOnlyList Checks { get; } + public bool HasChecks { get; } public Task InitializeAsync(LocalRepositoryModel localRepository, IConnection connection, string owner, string repo, int number) => Task.CompletedTask; diff --git a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs index ef5d29d7ff..c905c8a838 100644 --- a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs +++ b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs @@ -58,6 +58,7 @@ public sealed class PullRequestDetailViewModel : PanePageViewModelBase, IPullReq Uri webUrl; IDisposable sessionSubscription; IReadOnlyList checks; + bool hasChecks; /// /// Initializes a new instance of the class. @@ -282,6 +283,13 @@ public IReadOnlyList Checks private set { this.RaiseAndSetIfChanged(ref checks, value); } } + /// + public bool HasChecks + { + get { return hasChecks; } + private set { this.RaiseAndSetIfChanged(ref hasChecks, value); } + } + /// public async Task InitializeAsync( LocalRepositoryModel localRepository, @@ -351,6 +359,7 @@ public async Task Load(PullRequestDetailModel pullRequest) Reviews = PullRequestReviewSummaryViewModel.BuildByUser(Session.User, pullRequest).ToList(); Checks = PullRequestCheckViewModel.Build(viewViewModelFactory, pullRequest)?.ToList(); + HasChecks = Checks?.Any() ?? false; await Files.InitializeAsync(Session); diff --git a/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs index 52384df726..b1b1f7497b 100644 --- a/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs +++ b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs @@ -191,6 +191,11 @@ public interface IPullRequestDetailViewModel : IPanePageViewModel, IOpenInBrowse /// IReadOnlyList Checks { get; } + /// + /// Flag that indicates if there are checks or statuses to display. + /// + bool HasChecks { get; } + /// /// Initializes the view model. /// diff --git a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml index cdfdae874e..5282ddf822 100644 --- a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml +++ b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml @@ -248,7 +248,8 @@ HeaderText="Checks" IsExpanded="True" Margin="0 8 0 0" - ghfvs:ScrollingVerticalStackPanel.IsFixed="true"> + ghfvs:ScrollingVerticalStackPanel.IsFixed="true" + Visibility="{Binding HasChecks, Converter={ghfvs:BooleanToVisibilityConverter}}"> From eaef6c687586c3b24dd9042409b99d5ea3fbe7d1 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 11 Dec 2018 12:22:27 -0500 Subject: [PATCH 3/5] Revert "Hiding the checks section if there are no checks to display" This reverts commit f3635e99b8c2a186747e83b1c55f40d201b74d5b. --- .../SampleData/PullRequestDetailViewModelDesigner.cs | 2 -- .../ViewModels/GitHubPane/PullRequestDetailViewModel.cs | 9 --------- .../ViewModels/GitHubPane/IPullRequestDetailViewModel.cs | 5 ----- .../Views/GitHubPane/PullRequestDetailView.xaml | 3 +-- 4 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs b/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs index f6c2a8110d..9f1ad0262a 100644 --- a/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs +++ b/src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs @@ -98,7 +98,6 @@ public PullRequestDetailViewModelDesigner() Files = new PullRequestFilesViewModelDesigner(); Checks = Array.Empty(); - HasChecks = false; } public PullRequestDetailModel Model { get; } @@ -130,7 +129,6 @@ public PullRequestDetailViewModelDesigner() public ReactiveCommand ShowAnnotations { get; } public IReadOnlyList Checks { get; } - public bool HasChecks { get; } public Task InitializeAsync(LocalRepositoryModel localRepository, IConnection connection, string owner, string repo, int number) => Task.CompletedTask; diff --git a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs index c905c8a838..ef5d29d7ff 100644 --- a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs +++ b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs @@ -58,7 +58,6 @@ public sealed class PullRequestDetailViewModel : PanePageViewModelBase, IPullReq Uri webUrl; IDisposable sessionSubscription; IReadOnlyList checks; - bool hasChecks; /// /// Initializes a new instance of the class. @@ -283,13 +282,6 @@ public IReadOnlyList Checks private set { this.RaiseAndSetIfChanged(ref checks, value); } } - /// - public bool HasChecks - { - get { return hasChecks; } - private set { this.RaiseAndSetIfChanged(ref hasChecks, value); } - } - /// public async Task InitializeAsync( LocalRepositoryModel localRepository, @@ -359,7 +351,6 @@ public async Task Load(PullRequestDetailModel pullRequest) Reviews = PullRequestReviewSummaryViewModel.BuildByUser(Session.User, pullRequest).ToList(); Checks = PullRequestCheckViewModel.Build(viewViewModelFactory, pullRequest)?.ToList(); - HasChecks = Checks?.Any() ?? false; await Files.InitializeAsync(Session); diff --git a/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs index b1b1f7497b..52384df726 100644 --- a/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs +++ b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestDetailViewModel.cs @@ -191,11 +191,6 @@ public interface IPullRequestDetailViewModel : IPanePageViewModel, IOpenInBrowse /// IReadOnlyList Checks { get; } - /// - /// Flag that indicates if there are checks or statuses to display. - /// - bool HasChecks { get; } - /// /// Initializes the view model. /// diff --git a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml index 5282ddf822..cdfdae874e 100644 --- a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml +++ b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml @@ -248,8 +248,7 @@ HeaderText="Checks" IsExpanded="True" Margin="0 8 0 0" - ghfvs:ScrollingVerticalStackPanel.IsFixed="true" - Visibility="{Binding HasChecks, Converter={ghfvs:BooleanToVisibilityConverter}}"> + ghfvs:ScrollingVerticalStackPanel.IsFixed="true"> From 94fc76b9d1a202c68992bdc8ecef75edc920233c Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 11 Dec 2018 12:22:43 -0500 Subject: [PATCH 4/5] Using the count instead --- .../ViewModels/GitHubPane/PullRequestDetailViewModel.cs | 4 ++-- .../Views/GitHubPane/PullRequestDetailView.xaml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs index ef5d29d7ff..d198f028b1 100644 --- a/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs +++ b/src/GitHub.App/ViewModels/GitHubPane/PullRequestDetailViewModel.cs @@ -57,7 +57,7 @@ public sealed class PullRequestDetailViewModel : PanePageViewModelBase, IPullReq bool refreshOnActivate; Uri webUrl; IDisposable sessionSubscription; - IReadOnlyList checks; + IReadOnlyList checks = Array.Empty(); /// /// Initializes a new instance of the class. @@ -350,7 +350,7 @@ public async Task Load(PullRequestDetailModel pullRequest) Body = !string.IsNullOrWhiteSpace(pullRequest.Body) ? pullRequest.Body : Resources.NoDescriptionProvidedMarkdown; Reviews = PullRequestReviewSummaryViewModel.BuildByUser(Session.User, pullRequest).ToList(); - Checks = PullRequestCheckViewModel.Build(viewViewModelFactory, pullRequest)?.ToList(); + Checks = (IReadOnlyList) PullRequestCheckViewModel.Build(viewViewModelFactory, pullRequest)?.ToList() ?? Array.Empty(); await Files.InitializeAsync(Session); diff --git a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml index cdfdae874e..de4b2c633b 100644 --- a/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml +++ b/src/GitHub.VisualStudio.UI/Views/GitHubPane/PullRequestDetailView.xaml @@ -248,7 +248,8 @@ HeaderText="Checks" IsExpanded="True" Margin="0 8 0 0" - ghfvs:ScrollingVerticalStackPanel.IsFixed="true"> + ghfvs:ScrollingVerticalStackPanel.IsFixed="true" + Visibility="{Binding Checks.Count, Converter={ghfvs:CountToVisibilityConverter}}"> From 2018d61af986fe1d3393572f08cbefaded103a0e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 12 Dec 2018 12:09:23 +0100 Subject: [PATCH 5/5] Bumped version to 2.6.1. --- Directory.Build.Props | 4 ++-- appveyor.yml | 2 +- src/GitHub.VisualStudio/source.extension.vsixmanifest | 4 ++-- src/common/SolutionInfo.cs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Directory.Build.Props b/Directory.Build.Props index a741d0a358..ba4204d0f5 100644 --- a/Directory.Build.Props +++ b/Directory.Build.Props @@ -1,8 +1,8 @@ GitHub Extension for Visual Studio - 2.6.0.0 + 2.6.1.0 Copyright © GitHub, Inc. 2014-2018 7.3 - + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 2df8aa2316..f3a2be1840 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ os: Visual Studio 2017 -version: '2.6.0.{build}' +version: '2.6.1.{build}' skip_tags: true install: - ps: | diff --git a/src/GitHub.VisualStudio/source.extension.vsixmanifest b/src/GitHub.VisualStudio/source.extension.vsixmanifest index c7563189a2..e62285fa8e 100644 --- a/src/GitHub.VisualStudio/source.extension.vsixmanifest +++ b/src/GitHub.VisualStudio/source.extension.vsixmanifest @@ -1,7 +1,7 @@  - + GitHub Extension for Visual Studio A Visual Studio Extension that brings the GitHub Flow into Visual Studio. GitHub.VisualStudio @@ -45,4 +45,4 @@ - + \ No newline at end of file diff --git a/src/common/SolutionInfo.cs b/src/common/SolutionInfo.cs index 07aa5148f4..fc412444c3 100644 --- a/src/common/SolutionInfo.cs +++ b/src/common/SolutionInfo.cs @@ -18,6 +18,6 @@ namespace System { internal static class AssemblyVersionInformation { - internal const string Version = "2.6.0.0"; + internal const string Version = "2.6.1.0"; } }