Skip to content

Commit

Permalink
Yaml manifest schemaheader validation for V.1.10.0 and above (#5126)
Browse files Browse the repository at this point in the history
### Enable schema header validation for YAML manifests from version
1.10.0 onwards.

**YAML Manifest Validation Changes:**

1. Introduce functions to search, parse, and validate schema headers in
YAML manifests.
2. Add/Update structs and enums to support schema header validation. 
3. Add new error messages and validation options, including treating
schema header validation errors as warnings.

Schema Header Validation Includes:
1. Validate presence of Manifest Schema Header.
2. Ensure Schema Header format correctness.
3. Verify Schema Header URL Pattern accuracy.
4. Confirm Schema Header Manifest Type matches ManifestType Property.
5. Check Schema Header Manifest Version matches ManifestVersion
Property.

**WinGet CLI Validation Command Changes:**

- Treat schema header validation errors as warnings for 'winget validate
--manifest <<path>>' command
- Introduced a new option `SchemaHeaderValidationAsWarning` to the
`validateOption` object and set it to `true`.
- This change treats schema header validation issues as warnings instead
of errors, making the validation process more lenient.

[NOTE:]
1. SchemaHeaderValidation errors should be treated as warnings for the
winget CLI validate command.
2. SchemaHeaderValidation errors should be treated as errors for
wingetsvc community manifests.

**[Test Coverage:]**
- Added new test data files to validate various schema header errors in
YAML manifests, including
   - invalid headers,
   -  type mismatches,
   - version mismatches,
   - missing headers, and
   - URL pattern mismatches.
- Added test coverage for WinGet Utils Interop binary and WinGet CLI
Validated command

**[How Validated:]**
- Compiled the AppInstaller end-to-end solution incorporating the
changes.
- Performed the YAML manifest validation tests, WinGet Utils tests, and
WinGet CLI Validate command tests, ensuring all tests passed.
- Locally validated the winget CLI validation command with various
schema header errors, ensuring they are treated as warnings and that no
warnings are reported for a valid manifest.

**[Test Results:]**

YAML Manifest Validation Test Results:

![image](https://github.com/user-attachments/assets/c474a9ab-718c-482e-81fb-7fc385f37190)

WinGet Utils Interop Test Results:

![image](https://github.com/user-attachments/assets/f5033c71-16e1-44a7-a9a7-886066f9e26d)

Validate Command Test Results:

![image](https://github.com/user-attachments/assets/4726022c-7a8b-4885-abba-3f776d3ded4e)


<!-- To check a checkbox place an "x" between the brackets. e.g: [x] -->

- [x] I have signed the [Contributor License
Agreement](https://cla.opensource.microsoft.com/microsoft/winget-pkgs).
- [x] This pull request is related to an issue.

-----

###### Microsoft Reviewers: [Open in
CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/5126)

---------

Co-authored-by: Madhusudhan Gumbalapura Sudarshan <[email protected]>
  • Loading branch information
Madhusudhan-MSFT and Madhusudhan Gumbalapura Sudarshan authored Jan 17, 2025
1 parent f4f8abd commit b1ac622
Show file tree
Hide file tree
Showing 32 changed files with 735 additions and 24 deletions.
1 change: 1 addition & 0 deletions src/AppInstallerCLICore/Commands/ValidateCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ namespace AppInstaller::CLI
{
ManifestValidateOption validateOption;
validateOption.FullValidation = true;
validateOption.SchemaHeaderValidationAsWarning = true;
validateOption.ThrowOnWarning = !(context.Args.Contains(Execution::Args::Type::IgnoreWarnings));
auto manifest = YamlParser::CreateFromPath(inputFile, validateOption);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.singleton.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeader
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest with schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server= $schema=https://aka.ms/winget-manifest.singleton.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderInvalid
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header Invalid
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has an invalid schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderManifestTypeMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header ManifestType Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched ManisfestType in the schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
PackageIdentifier: AppInstallerCliTest.SchemaHeaderNotFound
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header Not Found
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a missing schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest-invalid.singleton.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderURLPatternMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header URL Pattern Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched schema header URL pattern

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.singleton.1.9.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderVersionMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header ManifestVersion Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched ManisfestVersion in the schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
42 changes: 42 additions & 0 deletions src/AppInstallerCLIE2ETests/ValidateCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,47 @@ public void ValidateManifestDoesNotExist()
Assert.AreEqual(Constants.ErrorCode.ERROR_PATH_NOT_FOUND, result.ExitCode);
Assert.True(result.StdOut.Contains("Path does not exist"));
}

/// <summary>
/// Test validate manifest with invalid schema and expect warnings.
/// </summary>
[Test]
public void ValidateManifestV1_10_SchemaHeaderExpectWarnings()
{
var result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestWarningManifestV1_10-SchemaHeaderNotFound.yaml"));
Assert.AreEqual(Constants.ErrorCode.ERROR_MANIFEST_VALIDATION_WARNING, result.ExitCode);
Assert.True(result.StdOut.Contains("Manifest validation succeeded with warnings."));
Assert.True(result.StdOut.Contains("Manifest Warning: Schema header not found."));

result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestWarningManifestV1_10-SchemaHeaderInvalid.yaml"));
Assert.AreEqual(Constants.ErrorCode.ERROR_MANIFEST_VALIDATION_WARNING, result.ExitCode);
Assert.True(result.StdOut.Contains("Manifest validation succeeded with warnings."));
Assert.True(result.StdOut.Contains("Manifest Warning: The schema header is invalid. Please verify that the schema header is present and formatted correctly."));

result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestWarningManifestV1_10-SchemaHeaderURLPatternMismatch.yaml"));
Assert.AreEqual(Constants.ErrorCode.ERROR_MANIFEST_VALIDATION_WARNING, result.ExitCode);
Assert.True(result.StdOut.Contains("Manifest validation succeeded with warnings."));
Assert.True(result.StdOut.Contains("Manifest Warning: The schema header URL does not match the expected pattern"));

result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestWarningManifestV1_10-SchemaHeaderManifestTypeMismatch.yaml"));
Assert.AreEqual(Constants.ErrorCode.ERROR_MANIFEST_VALIDATION_WARNING, result.ExitCode);
Assert.True(result.StdOut.Contains("Manifest validation succeeded with warnings."));
Assert.True(result.StdOut.Contains("Manifest Warning: The manifest type in the schema header does not match the ManifestType property value in the manifest."));

result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestWarningManifestV1_10-SchemaHeaderVersionMismatch.yaml"));
Assert.AreEqual(Constants.ErrorCode.ERROR_MANIFEST_VALIDATION_WARNING, result.ExitCode);
Assert.True(result.StdOut.Contains("Manifest validation succeeded with warnings."));
Assert.True(result.StdOut.Contains("Manifest Warning: The manifest version in the schema header does not match the ManifestVersion property value in the manifest."));
}

/// <summary>
/// Test validate manifest with valid schema header.
/// </summary>
[Test]
public void ValidateManifestV1_10_SchemaHeaderExpectNoWarning()
{
var result = TestCommon.RunAICLICommand("validate", TestCommon.GetTestDataFile("Manifests\\TestGoodManifestV1_10-SchemaHeader.yaml"));
Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode);
}
}
}
85 changes: 82 additions & 3 deletions src/AppInstallerCLIE2ETests/WinGetUtil/WinGetUtilManifest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// <copyright file="WinGetUtilManifest.cs" company="Microsoft Corporation">
// Copyright (c) Microsoft Corporation. Licensed under the MIT License.
// </copyright>
Expand Down Expand Up @@ -80,6 +80,85 @@ public void WinGetUtil_ValidateManifest_Success(WinGetUtilWrapper.CreateManifest

// Close manifest
WinGetUtilWrapper.WinGetCloseManifest(manifestHandle);
}
}
}

/// <summary>
/// Test validate manifest with schema header.
/// </summary>
/// <param name="createManifestOption">Create manifest options.</param>
[Test]
[TestCase(WinGetUtilWrapper.CreateManifestOption.NoValidation)]
[TestCase(WinGetUtilWrapper.CreateManifestOption.SchemaAndSemanticValidation)]
public void WinGetUtil_ValidateManifest_V1_10_WithSchemaHeader_Success(WinGetUtilWrapper.CreateManifestOption createManifestOption)
{
string manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestGoodManifestV1_10-SchemaHeader.yaml");

// Create manifest
WinGetUtilWrapper.WinGetCreateManifest(
manifestsFilePath,
out bool succeeded,
out IntPtr manifestHandle,
out string createFailureMessage,
string.Empty,
createManifestOption);

Assert.True(succeeded);
Assert.AreNotEqual(IntPtr.Zero, manifestHandle);
Assert.IsNull(createFailureMessage);

// Close manifest
WinGetUtilWrapper.WinGetCloseManifest(manifestHandle);
}

/// <summary>
/// Test validate manifest with schema header for failure scenarios.
/// </summary>
/// <param name="createManifestOption">Create manifest options.</param>
[Test]
[TestCase(WinGetUtilWrapper.CreateManifestOption.SchemaAndSemanticValidation)]
public void WinGetUtil_ValidateManifest_V1_10_WithSchemaHeader_Failure(WinGetUtilWrapper.CreateManifestOption createManifestOption)
{
// Schema header not found
string manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestWarningManifestV1_10-SchemaHeaderNotFound.yaml");
string expectedError = "Manifest Error: Schema header not found.";
ValidateSchemaHeaderFailure(manifestsFilePath, createManifestOption, expectedError);

// Schema header invalid
manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestWarningManifestV1_10-SchemaHeaderInvalid.yaml");
expectedError = "Manifest Error: The schema header is invalid. Please verify that the schema header is present and formatted correctly.";
ValidateSchemaHeaderFailure(manifestsFilePath, createManifestOption, expectedError);

// Schema header URL pattern mismatch
manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestWarningManifestV1_10-SchemaHeaderURLPatternMismatch.yaml");
expectedError = "Manifest Error: The schema header URL does not match the expected pattern.";
ValidateSchemaHeaderFailure(manifestsFilePath, createManifestOption, expectedError);

// Schema header manifest type mismatch
manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestWarningManifestV1_10-SchemaHeaderManifestTypeMismatch.yaml");
expectedError = "Manifest Error: The manifest type in the schema header does not match the ManifestType property value in the manifest.";
ValidateSchemaHeaderFailure(manifestsFilePath, createManifestOption, expectedError);

// Schema header version mismatch
manifestsFilePath = TestCommon.GetTestDataFile(@"Manifests\TestWarningManifestV1_10-SchemaHeaderVersionMismatch.yaml");
expectedError = "Manifest Error: The manifest version in the schema header does not match the ManifestVersion property value in the manifest.";
ValidateSchemaHeaderFailure(manifestsFilePath, createManifestOption, expectedError);
}

private static void ValidateSchemaHeaderFailure(string manifestsFilePath, WinGetUtilWrapper.CreateManifestOption createManifestOption, string expectedError)
{
// Create manifest
WinGetUtilWrapper.WinGetCreateManifest(
manifestsFilePath,
out bool succeeded,
out IntPtr manifestHandle,
out string createFailureMessage,
string.Empty,
createManifestOption);

Assert.False(succeeded);
Assert.AreEqual(IntPtr.Zero, manifestHandle);
Assert.IsNotNull(createFailureMessage);
Assert.IsTrue(createFailureMessage.Contains(expectedError));
}
}
}
17 changes: 16 additions & 1 deletion src/AppInstallerCLITests/AppInstallerCLITests.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1033,6 +1033,21 @@
<CopyFileToFolders Include="TestData\ContainsEscapeControlCode.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderInvalid.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderManifestTypeMismatch.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderManifestVersionMismatch.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderNotFound.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderURLPatternMismatch.yaml">
<DeploymentContent>true</DeploymentContent>
</CopyFileToFolders>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AppInstallerCLICore\AppInstallerCLICore.vcxproj">
Expand Down Expand Up @@ -1076,4 +1091,4 @@
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Windows.CppWinRT.2.0.230706.1\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Windows.CppWinRT.2.0.230706.1\build\native\Microsoft.Windows.CppWinRT.props'))" />
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Windows.CppWinRT.2.0.230706.1\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Windows.CppWinRT.2.0.230706.1\build\native\Microsoft.Windows.CppWinRT.targets'))" />
</Target>
</Project>
</Project>
15 changes: 15 additions & 0 deletions src/AppInstallerCLITests/AppInstallerCLITests.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -1044,5 +1044,20 @@
<CopyFileToFolders Include="TestData\ContainsEscapeControlCode.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderInvalid.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderManifestTypeMismatch.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderManifestVersionMismatch.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderNotFound.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="TestData\ManifestV1_10-Bad-SchemaHeaderURLPatternMismatch.yaml">
<Filter>TestData</Filter>
</CopyFileToFolders>
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server= $schema=https://aka.ms/winget-manifest.singleton.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderInvalid
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header Invalid
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has an invalid schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderManifestTypeMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header ManifestType Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched ManisfestType in the schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.singleton.1.9.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderVersionMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header ManifestVersion Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched ManisfestVersion in the schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
PackageIdentifier: AppInstallerCliTest.SchemaHeaderNotFound
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header Not Found
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a missing schema header

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest-invalid.singleton.1.10.0.schema.json
PackageIdentifier: AppInstallerCliTest.SchemaHeaderURLPatternMismatch
PackageVersion: 1.0.0.0
PackageLocale: en-US
PackageName: AppInstaller Test Schema Header URL Pattern Mismatch
Publisher: Microsoft Corporation
License: Test
ShortDescription: This manifest has a mismatched schema header URL pattern

Installers:
- Architecture: x86
InstallerUrl: https://ThisIsNotUsed
InstallerType: msi
InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B
ManifestType: singleton
ManifestVersion: 1.10.0
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.singleton.1.10.0.schema.json
PackageIdentifier: microsoft.msixsdk
PackageVersion: 1.7.32
PackageLocale: en-US
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.10.0.schema.json
PackageIdentifier: microsoft.msixsdk
PackageVersion: 1.7.32
PackageLocale: en-US
Expand Down
Loading

1 comment on commit b1ac622

@AlphaOmega113
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

Please sign in to comment.