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

Commit eafe7a1

Browse files
Merge pull request #449 from microsoft/staging
Release - 9/17/24
2 parents 24b786f + 7474c8d commit eafe7a1

15 files changed

Lines changed: 117 additions & 151 deletions

build/azure-pipelines.yml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ parameters:
2020
- release
2121

2222
variables:
23-
MSIXVersion: '0.1700'
23+
MSIXVersion: '0.1800'
2424
solution: '**/GitHubExtension.sln'
2525
appxPackageDir: 'AppxPackages'
2626
testOutputArtifactDir: 'TestResults'
@@ -38,6 +38,12 @@ extends:
3838
sdl:
3939
roslyn:
4040
enabled: true
41+
binskim:
42+
break: false
43+
scanOutputDirectoryOnly: true
44+
policheck:
45+
break: false
46+
severity: Note
4147
arrow:
4248
serviceConnection: DevHome Build VM Generation
4349
baseline:
@@ -145,6 +151,16 @@ extends:
145151
filePath: 'build/scripts/Build.ps1'
146152
arguments: -Platform "${{ platform }}" -Configuration "${{ configuration }}" -Version $(MSIXVersion) -BuildStep "msix" -AzureBuildingBranch "$(BuildingBranch)" -IsAzurePipelineBuild -ClientId $(GitHubClientId) -ClientSecret $(GitHubClientSecret)
147153

154+
- task: PowerShell@2
155+
displayName: Copy Binaries for Artifact Publishing
156+
inputs:
157+
targetType: inline
158+
script: >-
159+
New-Item -Path '$(Build.ArtifactStagingDirectory)\rawBinaries' -ItemType Directory
160+
161+
Get-ChildItem -Path "$(Build.SourcesDirectory)\buildoutput\*" -Include *.dll,*.exe,*.pdb -Recurse | Copy-Item -Destination "$(Build.ArtifactStagingDirectory)\rawBinaries" -verbose
162+
pwsh: true
163+
148164
- template: ./build/templates/EsrpSigning-Steps.yml@self
149165
parameters:
150166
displayName: Submit *.msix to ESRP for code signing
@@ -267,6 +283,10 @@ extends:
267283
targetPath: $(appxPackageDir)\${{ configuration }}
268284
sbomPackageName: devhomegithubextension.msixpackage
269285
sbomPackageVersion: $(MSIXVersion)
286+
- output: pipelineArtifact
287+
displayName: 'Publish Binaries'
288+
artifactName: binaries_${{ platform }}_${{ configuration }}
289+
targetPath: $(Build.ArtifactStagingDirectory)\rawBinaries
270290

271291
- stage: Build_MsixBundle
272292
dependsOn: Build_Msix

build/scripts/CreateBuildInfo.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Param(
55
)
66

77
$Major = "0"
8-
$Minor = "17"
8+
$Minor = "18"
99
$Patch = "99" # default to 99 for local builds
1010

1111
$versionSplit = $Version.Split(".");

src/GitHubExtension/DataManager/GitHubDataManager.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,16 @@ private async Task UpdateDataStoreAsync(DataStoreOperationParameters parameters,
251251
PruneObsoleteData();
252252
SetLastUpdatedInMetaData();
253253
}
254+
catch (HttpRequestException httpEx)
255+
{
256+
// HttpRequestExceptions can happen when internet connection is
257+
// down or various other network issues.
258+
_log.Warning($"Http Request Exception: {httpEx.Message}");
259+
tx.Rollback();
260+
261+
// Rethrow so clients can catch/display appropriate UX.
262+
throw;
263+
}
254264
catch (Exception ex)
255265
{
256266
_log.Error(ex, $"Failed Updating DataStore for: {parameters}");
@@ -331,6 +341,12 @@ private async Task UpdateDataForRepositoryAsync(DataStoreOperationParameters par
331341
PruneObsoleteData();
332342
SetLastUpdatedInMetaData();
333343
}
344+
catch (HttpRequestException)
345+
{
346+
// Higher layer will catch and log this. Suppress logging an error for this to keep log clean.
347+
tx.Rollback();
348+
throw;
349+
}
334350
catch (Exception ex)
335351
{
336352
// This is for catching any other unexpected error as well as any we throw.

src/GitHubExtension/DataManager/GitHubDataManagerUpdate.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ public static async Task Update()
2525
{
2626
await UpdateDeveloperPullRequests();
2727
}
28+
catch (HttpRequestException httpEx)
29+
{
30+
// HttpRequestExceptions can happen when internet connection is
31+
// down or various other network issues unrelated to this update.
32+
// This is not an error in the extension or anything we can
33+
// address. Log a warning so it is understood why the update did
34+
// not occur, but otherwise keep the log clean.
35+
_log.Warning($"Http Request Exception: {httpEx.Message}");
36+
}
2837
catch (Exception ex)
2938
{
3039
_log.Error(ex, "Update failed unexpectedly.");

src/GitHubExtension/Widgets/GitHubIssuesWidget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public override void LoadContentData()
152152

153153
issuesData.Add("issues", issuesArray);
154154
issuesData.Add("selected_repo", repository?.FullName ?? string.Empty);
155-
issuesData.Add("widgetTitle", WidgetTitle);
155+
issuesData.Add("widgetTitle", GetActualTitle());
156156
issuesData.Add("is_loading_data", DataState == WidgetDataState.Unknown);
157157
issuesData.Add("issues_icon_data", _issuesIconData);
158158

src/GitHubExtension/Widgets/GitHubPullsWidget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public override void LoadContentData()
123123

124124
pullsData.Add("pulls", pullsArray);
125125
pullsData.Add("selected_repo", repository?.FullName ?? string.Empty);
126-
pullsData.Add("widgetTitle", WidgetTitle);
126+
pullsData.Add("widgetTitle", GetActualTitle());
127127
pullsData.Add("is_loading_data", DataState == WidgetDataState.Unknown);
128128
pullsData.Add("pulls_icon_data", _pullsIconData);
129129

src/GitHubExtension/Widgets/GitHubReleasesWidget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public override void LoadContentData()
121121

122122
releasesData.Add("releases", releasesArray);
123123
releasesData.Add("selected_repo", repository?.FullName ?? string.Empty);
124-
releasesData.Add("widgetTitle", WidgetTitle);
124+
releasesData.Add("widgetTitle", GetActualTitle());
125125
releasesData.Add("is_loading_data", DataState == WidgetDataState.Unknown);
126126
releasesData.Add("releases_icon_data", _releasesIconData);
127127

src/GitHubExtension/Widgets/GitHubRepositoryWidget.cs

Lines changed: 41 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Text.Json.Nodes;
66
using GitHubExtension.Client;
77
using GitHubExtension.DataManager;
8-
using GitHubExtension.Helpers;
98
using GitHubExtension.Widgets.Enums;
109
using Microsoft.Windows.Widgets.Providers;
1110

@@ -15,6 +14,8 @@ public abstract class GitHubRepositoryWidget : GitHubWidget
1514
{
1615
protected string RepositoryUrl { get; set; } = string.Empty;
1716

17+
private string? _message;
18+
1819
public GitHubRepositoryWidget()
1920
: base()
2021
{
@@ -66,14 +67,14 @@ public override void OnActionInvoked(WidgetActionInvokedArgs actionInvokedArgs)
6667

6768
switch (verb)
6869
{
69-
case WidgetAction.CheckUrl:
70-
HandleCheckUrl(actionInvokedArgs);
71-
break;
72-
7370
case WidgetAction.Save:
74-
UpdateTitle(JsonNode.Parse(actionInvokedArgs.Data));
75-
base.OnActionInvoked(actionInvokedArgs);
76-
CorrectUrl();
71+
if (HandleCheckUrl(actionInvokedArgs))
72+
{
73+
UpdateTitle(JsonNode.Parse(actionInvokedArgs.Data));
74+
base.OnActionInvoked(actionInvokedArgs);
75+
CorrectUrl();
76+
}
77+
7778
break;
7879

7980
default:
@@ -142,10 +143,11 @@ private void UpdateTitle(JsonNode? dataObj)
142143
}
143144

144145
GetTitleFromDataObject(dataObj);
145-
if (string.IsNullOrEmpty(WidgetTitle))
146-
{
147-
WidgetTitle = GetRepositoryFromUrl(RepositoryUrl).FullName;
148-
}
146+
}
147+
148+
protected string GetActualTitle()
149+
{
150+
return string.IsNullOrEmpty(WidgetTitle) ? GetRepositoryFromUrl(RepositoryUrl).FullName : WidgetTitle;
149151
}
150152

151153
protected override void ResetWidgetInfoFromState()
@@ -207,7 +209,7 @@ public override void OnCustomizationRequested(WidgetCustomizationRequestedArgs c
207209
base.OnCustomizationRequested(customizationRequestedArgs);
208210
}
209211

210-
private void HandleCheckUrl(WidgetActionInvokedArgs args)
212+
private bool HandleCheckUrl(WidgetActionInvokedArgs args)
211213
{
212214
// Set loading page while we fetch data from GitHub.
213215
Page = WidgetPageState.Loading;
@@ -223,7 +225,19 @@ private void HandleCheckUrl(WidgetActionInvokedArgs args)
223225
RepositoryUrl = dataObject["url"]?.GetValue<string>() ?? string.Empty;
224226
UpdateTitle(dataObject);
225227

226-
ConfigurationData = data;
228+
var isGoodToSave = true;
229+
230+
try
231+
{
232+
GetRepositoryFromUrl(RepositoryUrl);
233+
ConfigurationData = data;
234+
_message = null;
235+
}
236+
catch (Exception ex)
237+
{
238+
_message = ex.Message;
239+
isGoodToSave = false;
240+
}
227241

228242
var updateRequestOptions = new WidgetUpdateRequestOptions(Id)
229243
{
@@ -233,71 +247,29 @@ private void HandleCheckUrl(WidgetActionInvokedArgs args)
233247
};
234248

235249
WidgetManager.GetDefault().UpdateWidget(updateRequestOptions);
250+
251+
// Already shown error message while updating above,
252+
// can reset it to null here.
253+
_message = null;
254+
return isGoodToSave;
236255
}
256+
257+
UpdateWidget();
258+
259+
return false;
237260
}
238261

239262
public string GetConfiguration(string dataUrl)
240263
{
241264
var configurationData = new JsonObject
242265
{
243-
{ "submitIcon", IconLoader.GetIconAsBase64("arrow.png") },
244266
{ "widgetTitle", WidgetTitle },
267+
{ "url", dataUrl },
268+
{ "savedRepositoryUrl", SavedConfigurationData },
269+
{ "errorMessage", _message },
245270
};
246271

247-
if (dataUrl == string.Empty)
248-
{
249-
configurationData.Add("hasConfiguration", false);
250-
var repositoryData = new JsonObject
251-
{
252-
{ "url", string.Empty },
253-
};
254-
255-
configurationData.Add("configuration", repositoryData);
256-
configurationData.Add("savedRepositoryUrl", SavedConfigurationData);
257-
configurationData.Add("saveEnabled", false);
258-
259-
return configurationData.ToString();
260-
}
261-
else
262-
{
263-
try
264-
{
265-
var repository = GetRepositoryFromUrl(dataUrl);
266-
var repositoryData = new JsonObject
267-
{
268-
{ "name", repository.FullName },
269-
{ "label", repository.Name },
270-
{ "owner", repository.Owner.Login },
271-
{ "milestone", string.Empty },
272-
{ "project", repository.Description },
273-
{ "url", RepositoryUrl },
274-
{ "query", GetUnescapedIssueQuery() },
275-
};
276-
277-
configurationData.Add("hasConfiguration", true);
278-
configurationData.Add("configuration", repositoryData);
279-
configurationData.Add("savedRepositoryUrl", SavedConfigurationData);
280-
configurationData.Add("saveEnabled", true);
281-
}
282-
catch (Exception ex)
283-
{
284-
Log.Error(ex, $"Failed getting configuration information for input url: {dataUrl}");
285-
configurationData.Add("hasConfiguration", false);
286-
287-
var repositoryData = new JsonObject
288-
{
289-
{ "url", RepositoryUrl },
290-
};
291-
292-
configurationData.Add("errorMessage", ex.Message);
293-
configurationData.Add("configuration", repositoryData);
294-
configurationData.Add("saveEnabled", false);
295-
296-
return configurationData.ToString();
297-
}
298-
299-
return configurationData.ToJsonString();
300-
}
272+
return configurationData.ToJsonString();
301273
}
302274

303275
public override string GetData(WidgetPageState page)

src/GitHubExtension/Widgets/GitHubReviewWidget.cs

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,25 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
33

4-
using System.Text.Json.Nodes;
5-
using GitHubExtension.DataManager;
64
using GitHubExtension.Helpers;
7-
using Microsoft.Windows.Widgets.Providers;
85
using Octokit;
96

107
namespace GitHubExtension.Widgets;
118

129
internal sealed class GitHubReviewWidget : GitHubUserWidget
1310
{
14-
public GitHubReviewWidget()
15-
: base()
16-
{
17-
// This widget does not allow customization, so this value will not change.
18-
ShowCategory = SearchCategory.PullRequests;
19-
}
20-
21-
public override void RequestContentData()
22-
{
23-
var request = new SearchIssuesRequest($"review-requested:{UserName}");
24-
25-
RequestContentData(request);
26-
}
11+
protected override string DefaultShowCategory => "PullRequests";
2712

2813
protected override string GetTitleIconData()
2914
{
3015
return IconLoader.GetIconAsBase64("pulls.png");
3116
}
3217

33-
// This widget does not have "ShowCategory" as a variable.
34-
// So we override this method to not care about this data.
35-
protected override void ResetWidgetInfoFromState()
36-
{
37-
base.ResetWidgetInfoFromState();
38-
ShowCategory = SearchCategory.PullRequests;
39-
}
40-
41-
// Overriding this method because this widget only cares about the account.
42-
public override void OnActionInvoked(WidgetActionInvokedArgs actionInvokedArgs)
18+
public override void RequestContentData()
4319
{
44-
if (actionInvokedArgs.Verb == "Submit")
45-
{
46-
var data = actionInvokedArgs.Data;
47-
var dataObject = JsonNode.Parse(data);
48-
49-
if (dataObject == null)
50-
{
51-
return;
52-
}
53-
54-
DeveloperLoginId = dataObject["account"]?.GetValue<string>() ?? string.Empty;
55-
UpdateTitle(dataObject);
56-
57-
ConfigurationData = data;
20+
var request = new SearchIssuesRequest($"review-requested:{UserName}");
5821

59-
// If we got here during the customization flow, we need to LoadContentData again
60-
// so we can show the loading page rather than stale data.
61-
LoadContentData();
62-
UpdateActivityState();
63-
}
64-
else
65-
{
66-
base.OnActionInvoked(actionInvokedArgs);
67-
}
22+
RequestContentData(request);
6823
}
6924

7025
public override string GetTemplatePath(WidgetPageState page)

0 commit comments

Comments
 (0)