From dea9a204d8dfbb3fe3e4dbfe54bf94251a4d8bfe Mon Sep 17 00:00:00 2001 From: Ryan Fu <69221034+ryfu-msft@users.noreply.github.com> Date: Tue, 5 Jul 2022 15:34:35 -0700 Subject: [PATCH] Schema additions for Zip support (#2288) --- .../v1.3.0/manifest.installer.1.3.0.json | 51 +++++++++++++ .../v1.3.0/manifest.singleton.1.3.0.json | 51 +++++++++++++ .../AppInstallerCLITests.vcxproj | 12 ++++ .../AppInstallerCLITests.vcxproj.filters | 12 ++++ ...fest-Bad-AppsAndFeaturesEntriesOnMSIX.yaml | 2 +- .../TestData/Manifest-Bad-ArchInvalid.yaml | 4 +- .../TestData/Manifest-Bad-ArchMissing.yaml | 4 +- .../Manifest-Bad-Channel-NotSupported.yaml | 4 +- .../Manifest-Bad-DifferentCase-UPPER.yaml | 4 +- .../Manifest-Bad-DifferentCase-camelCase.yaml | 4 +- .../Manifest-Bad-DifferentCase-lower.yaml | 4 +- ...-Bad-DuplicateKey-DifferentCase-lower.yaml | 6 +- ...nifest-Bad-DuplicateKey-DifferentCase.yaml | 6 +- .../TestData/Manifest-Bad-DuplicateKey.yaml | 4 +- .../TestData/Manifest-Bad-IdInvalid.yaml | 4 +- .../TestData/Manifest-Bad-IdMissing.yaml | 4 +- ...anifest-Bad-InstallerTypeExe-NoSilent.yaml | 2 +- ...est-Bad-InstallerTypeExe-NoSilentRoot.yaml | 2 +- ...est-Bad-InstallerTypeExeRoot-NoSilent.yaml | 2 +- ...Bad-InstallerTypeExeRoot-NoSilentRoot.yaml | 2 +- .../Manifest-Bad-InstallerTypeInvalid.yaml | 2 +- .../Manifest-Bad-InstallerTypeMissing.yaml | 2 +- ...tallerTypeZip-MissingRelativeFilePath.yaml | 20 ++++++ ...allerTypeZip-MultipleNestedInstallers.yaml | 23 ++++++ ...nstallerTypeZip-NoNestedInstallerFile.yaml | 18 +++++ ...nstallerTypeZip-NoNestedInstallerType.yaml | 20 ++++++ ...-Bad-InstallerUniqueness-DefaultScope.yaml | 6 +- ...Bad-InstallerUniqueness-DefaultValues.yaml | 6 +- ...fest-Bad-InstallerUniqueness-SameLang.yaml | 6 +- .../Manifest-Bad-InstallerUniqueness.yaml | 6 +- .../Manifest-Bad-InstallersMissing.yaml | 2 +- .../TestData/Manifest-Bad-InvalidLocale.yaml | 4 +- ...ifest-Bad-InvalidManifestVersionValue.yaml | 4 +- .../Manifest-Bad-InvalidUpdateBehavior.yaml | 2 +- .../TestData/Manifest-Bad-LicenseMissing.yaml | 4 +- .../TestData/Manifest-Bad-NameMissing.yaml | 4 +- .../Manifest-Bad-PackageFamilyNameOnMSI.yaml | 2 +- .../Manifest-Bad-ProductCodeOnMSIX.yaml | 2 +- .../Manifest-Bad-PublisherMissing.yaml | 2 +- .../TestData/Manifest-Bad-Sha256Invalid.yaml | 4 +- .../TestData/Manifest-Bad-Sha256Missing.yaml | 4 +- .../TestData/Manifest-Bad-SwitchInvalid.yaml | 4 +- .../Manifest-Bad-UnknownProperty.yaml | 4 +- .../Manifest-Bad-UnsupportedVersion.yaml | 4 +- .../TestData/Manifest-Bad-UrlInvalid.yaml | 2 +- .../TestData/Manifest-Bad-UrlMissing.yaml | 2 +- .../TestData/Manifest-Bad-VersionInvalid.yaml | 4 +- .../TestData/Manifest-Bad-VersionMissing.yaml | 4 +- .../TestData/Manifest-Encoding-ANSI.yaml | 4 +- .../Manifest-Encoding-UTF16BE-BOM.yaml | Bin 642 -> 532 bytes .../TestData/Manifest-Encoding-UTF16BE.yaml | Bin 640 -> 532 bytes .../Manifest-Encoding-UTF16LE-BOM.yaml | Bin 642 -> 532 bytes .../TestData/Manifest-Encoding-UTF16LE.yaml | Bin 640 -> 532 bytes .../TestData/Manifest-Encoding-UTF8-BOM.yaml | 4 +- .../TestData/Manifest-Encoding-UTF8.yaml | 4 +- ...st-Good-InstallerUniqueness-DiffScope.yaml | 6 +- ...-Good-Installeruniqueness-DefaultLang.yaml | 6 +- ...st-Good-Installeruniqueness-DiffLangs.yaml | 6 +- .../Manifest-Good-Minimum-InstallerType.yaml | 4 +- .../TestData/Manifest-Good-Minimum.yaml | 4 +- .../TestData/Manifest-Good-Switches.yaml | 4 +- .../TestData/ManifestV1_3-Singleton.yaml | 4 ++ .../ManifestV1_3-MultiFile-Installer.yaml | 20 +++++- src/AppInstallerCLITests/YamlManifest.cpp | 40 ++++++++++- .../Manifest/ManifestCommon.cpp | 5 ++ .../Manifest/ManifestValidation.cpp | 24 +++++++ .../Manifest/ManifestYamlPopulator.cpp | 68 ++++++++++++++++++ .../Public/winget/ManifestCommon.h | 9 +++ .../Public/winget/ManifestInstaller.h | 4 ++ .../Public/winget/ManifestValidation.h | 1 + .../Public/winget/ManifestYamlPopulator.h | 6 +- 71 files changed, 476 insertions(+), 98 deletions(-) create mode 100644 src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MissingRelativeFilePath.yaml create mode 100644 src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MultipleNestedInstallers.yaml create mode 100644 src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerFile.yaml create mode 100644 src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerType.yaml diff --git a/schemas/JSON/manifests/v1.3.0/manifest.installer.1.3.0.json b/schemas/JSON/manifests/v1.3.0/manifest.installer.1.3.0.json index a8ae91c8a6..963caddbd0 100644 --- a/schemas/JSON/manifests/v1.3.0/manifest.installer.1.3.0.json +++ b/schemas/JSON/manifests/v1.3.0/manifest.installer.1.3.0.json @@ -69,6 +69,45 @@ ], "description": "Enumeration of supported installer types. InstallerType is required in either root level or individual Installer level" }, + "NestedInstallerType": { + "type": [ "string", "null" ], + "enum": [ + "msix", + "msi", + "appx", + "exe", + "inno", + "nullsoft", + "wix", + "burn", + "portable" + ], + "description": "Enumeration of supported nested installer types contained inside an archive file" + }, + "NestedInstallerFiles": { + "type": [ "array", "null" ], + "items": { + "type": "object", + "title": "NestedInstallerFile", + "properties": { + "RelativeFilePath": { + "type": "string", + "minLength": 1, + "maxLength": 512, + "description": "The relative path to the nested installer file" + }, + "PortableCommandAlias": { + "type": [ "string", "null" ], + "minLength": 1, + "maxLength": 40, + "description": "The command alias to be used for calling the package. Only applies to the nested portable package" + } + }, + "description": "A nested installer file contained inside an archive" + }, + "maxItems": 1024, + "description": "List of nested installer files contained inside an archive" + }, "Architecture": { "type": "string", "enum": [ @@ -492,6 +531,12 @@ "InstallerType": { "$ref": "#/definitions/InstallerType" }, + "NestedInstallerType": { + "$ref": "#/definitions/NestedInstallerType" + }, + "NestedInstallerFiles": { + "$ref": "#/definitions/NestedInstallerFiles" + }, "Scope": { "$ref": "#/definitions/Scope" }, @@ -611,6 +656,12 @@ "InstallerType": { "$ref": "#/definitions/InstallerType" }, + "NestedInstallerType": { + "$ref": "#/definitions/NestedInstallerType" + }, + "NestedInstallerFiles": { + "$ref": "#/definitions/NestedInstallerFiles" + }, "Scope": { "$ref": "#/definitions/Scope" }, diff --git a/schemas/JSON/manifests/v1.3.0/manifest.singleton.1.3.0.json b/schemas/JSON/manifests/v1.3.0/manifest.singleton.1.3.0.json index c631b7c44f..d1f7a65a65 100644 --- a/schemas/JSON/manifests/v1.3.0/manifest.singleton.1.3.0.json +++ b/schemas/JSON/manifests/v1.3.0/manifest.singleton.1.3.0.json @@ -111,6 +111,45 @@ ], "description": "Enumeration of supported installer types. InstallerType is required in either root level or individual Installer level" }, + "NestedInstallerType": { + "type": [ "string", "null" ], + "enum": [ + "msix", + "msi", + "appx", + "exe", + "inno", + "nullsoft", + "wix", + "burn", + "portable" + ], + "description": "Enumeration of supported nested installer types contained inside an archive file" + }, + "NestedInstallerFiles": { + "type": [ "array", "null" ], + "items": { + "type": "object", + "title": "NestedInstallerFile", + "properties": { + "RelativeFilePath": { + "type": "string", + "minLength": 1, + "maxLength": 512, + "description": "The relative path to the nested installer file" + }, + "PortableCommandAlias": { + "type": [ "string", "null" ], + "minLength": 1, + "maxLength": 40, + "description": "The command alias to be used for calling the package. Only applies to the nested portable package" + } + }, + "description": "A nested installer file contained inside an archive" + }, + "maxItems": 1024, + "description": "List of nested installer files contained inside an archive" + }, "Architecture": { "type": "string", "enum": [ @@ -533,6 +572,12 @@ "InstallerType": { "$ref": "#/definitions/InstallerType" }, + "NestedInstallerType": { + "$ref": "#/definitions/NestedInstallerType" + }, + "NestedInstallerFiles": { + "$ref": "#/definitions/NestedInstallerFiles" + }, "Scope": { "$ref": "#/definitions/Scope" }, @@ -765,6 +810,12 @@ "InstallerType": { "$ref": "#/definitions/InstallerType" }, + "NestedInstallerType": { + "$ref": "#/definitions/NestedInstallerType" + }, + "NestedInstallerFiles": { + "$ref": "#/definitions/NestedInstallerFiles" + }, "Scope": { "$ref": "#/definitions/Scope" }, diff --git a/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj b/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj index 642d14030b..34f17bc187 100644 --- a/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj +++ b/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj @@ -409,6 +409,18 @@ true + + true + + + true + + + true + + + true + true diff --git a/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj.filters b/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj.filters index d7db2a17cd..80686d89bf 100644 --- a/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj.filters +++ b/src/AppInstallerCLITests/AppInstallerCLITests.vcxproj.filters @@ -294,6 +294,18 @@ TestData + + TestData + + + TestData + + + TestData + + + TestData + TestData diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-AppsAndFeaturesEntriesOnMSIX.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-AppsAndFeaturesEntriesOnMSIX.yaml index 719f288050..d2c7e29b86 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-AppsAndFeaturesEntriesOnMSIX.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-AppsAndFeaturesEntriesOnMSIX.yaml @@ -9,7 +9,7 @@ PackageLocale: en-US Installers: - Architecture: x86 InstallerType: MSIX - InstallerUrl: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + InstallerUrl: https://ThisIsNotUsed InstallerSha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD AppsAndFeaturesEntries: - DisplayName: DisplayName diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchInvalid.yaml index 338e447dbe..310b0d841b 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchInvalid.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: NotAnArch - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchMissing.yaml index c514011567..d4ba2eb6a1 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-ArchMissing.yaml @@ -3,9 +3,9 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + - Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-Channel-NotSupported.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-Channel-NotSupported.yaml index 3cdf47cda6..5d2748c5a1 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-Channel-NotSupported.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-Channel-NotSupported.yaml @@ -3,10 +3,10 @@ Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft Channel: release -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-UPPER.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-UPPER.yaml index d7d669de22..1db62610e3 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-UPPER.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-UPPER.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -INSTALLERTYPE: Zip +INSTALLERTYPE: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-camelCase.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-camelCase.yaml index 781db3c0af..0d68a95786 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-camelCase.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-camelCase.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -installerType: Zip +installerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-lower.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-lower.yaml index cd7a0d1926..d4a98be628 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-lower.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DifferentCase-lower.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -installertype: Zip +installertype: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase-lower.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase-lower.yaml index 22d28bef38..d686c4fdf7 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase-lower.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase-lower.yaml @@ -3,11 +3,11 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip -installertype: Zip +InstallerType: Msi +installertype: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase.yaml index 7bd20feae5..f81ae3137b 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey-DifferentCase.yaml @@ -3,11 +3,11 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip -installerType: Zip +InstallerType: Msi +installerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey.yaml index cd06d8884a..6767697cb5 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-DuplicateKey.yaml @@ -4,10 +4,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-IdInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-IdInvalid.yaml index f103b820de..bb3e4564f3 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-IdInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-IdInvalid.yaml @@ -2,11 +2,11 @@ Id: m i c rosoft.msixsdk Name: MSIX SDK Version: 1.7.32 -InstallerType: Zip +InstallerType: Msi Publisher: Microsoft License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-IdMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-IdMissing.yaml index e6332b9215..5c10e375f8 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-IdMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-IdMissing.yaml @@ -1,11 +1,11 @@ # Bad manifest. No Id Name: MSIX SDK Version: 1.7.32 -InstallerType: Zip +InstallerType: Msi Publisher: Microsoft License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilent.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilent.yaml index 2d92cf4459..c00b11c0ce 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilent.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilent.yaml @@ -6,7 +6,7 @@ Publisher: Microsoft License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD InstallerType: Exe Switches: diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilentRoot.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilentRoot.yaml index f1afa2f35c..19649eed42 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilentRoot.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExe-NoSilentRoot.yaml @@ -8,7 +8,7 @@ Switches: Interactive: /i Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD InstallerType: Exe ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilent.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilent.yaml index dfea9f69b1..e65c0cc252 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilent.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilent.yaml @@ -7,7 +7,7 @@ InstallerType: Exe License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Switches: Interactive: /i diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilentRoot.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilentRoot.yaml index 821b7a3cbb..2008b97788 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilentRoot.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeExeRoot-NoSilentRoot.yaml @@ -9,6 +9,6 @@ Switches: Interactive: /i Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeInvalid.yaml index 946b8b17d5..ebb91b2574 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeInvalid.yaml @@ -7,6 +7,6 @@ InstallerType: NotAType License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeMissing.yaml index fa5b41b33b..74d406ba0f 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeMissing.yaml @@ -6,6 +6,6 @@ Publisher: Microsoft License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MissingRelativeFilePath.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MissingRelativeFilePath.yaml new file mode 100644 index 0000000000..09512a4d39 --- /dev/null +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MissingRelativeFilePath.yaml @@ -0,0 +1,20 @@ +# Bad manifest. A nested installer file must have a RelativeFilePath specified. +PackageIdentifier: microsoft.msixsdk +PackageVersion: 1.0.0.0 +PackageLocale: en-US +PackageName: AppInstaller Test Installer +Publisher: Microsoft Corporation +Moniker: AICLITestExe +License: Test +ShortDescription: Test installer for zip without RelativeFilePath specified +Scope: User +Installers: + - Architecture: x64 + InstallerUrl: https://ThisIsNotUsed + InstallerType: zip + InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B + NestedInstallerType: exe + NestedInstallerFiles: + - PortableCommandAlias: portableCommandAlias +ManifestType: singleton +ManifestVersion: 1.3.0 \ No newline at end of file diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MultipleNestedInstallers.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MultipleNestedInstallers.yaml new file mode 100644 index 0000000000..327aad97f4 --- /dev/null +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-MultipleNestedInstallers.yaml @@ -0,0 +1,23 @@ +# Bad manifest. Installer type zip should have exactly one NestedInstaller specified. +PackageIdentifier: microsoft.msixsdk +PackageVersion: 1.0.0.0 +PackageLocale: en-US +PackageName: AppInstaller Test Installer +Publisher: Microsoft Corporation +Moniker: AICLITestExe +License: Test +ShortDescription: Test installer for zip with too many nestedInstallers specified. +Scope: User +Installers: + - Architecture: x64 + InstallerUrl: https://ThisIsNotUsed + InstallerType: zip + InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B + NestedInstallerType: msi + NestedInstallerFiles: + - RelativeFilePath: relativeFilePath1 + PortableCommandAlias: portableCommandAlias1 + - RelativeFilePath: relativeFilePath2 + PortableCommandAlias: portableCommandAlias2 +ManifestType: singleton +ManifestVersion: 1.3.0 \ No newline at end of file diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerFile.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerFile.yaml new file mode 100644 index 0000000000..186563fc60 --- /dev/null +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerFile.yaml @@ -0,0 +1,18 @@ +# Bad manifest. Installer type zip should have exactly one NestedInstaller specified. +PackageIdentifier: microsoft.msixsdk +PackageVersion: 1.0.0.0 +PackageLocale: en-US +PackageName: AppInstaller Test Installer +Publisher: Microsoft Corporation +Moniker: AICLITestExe +License: Test +ShortDescription: Test installer for zip without nestedInstallers specified +Scope: User +Installers: + - Architecture: x64 + InstallerUrl: https://ThisIsNotUsed + InstallerType: zip + InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B + NestedInstallerType: exe +ManifestType: singleton +ManifestVersion: 1.3.0 \ No newline at end of file diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerType.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerType.yaml new file mode 100644 index 0000000000..835a367822 --- /dev/null +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerTypeZip-NoNestedInstallerType.yaml @@ -0,0 +1,20 @@ +# Bad manifest. Installer type zip should have exactly one NestedInstaller specified. +PackageIdentifier: microsoft.msixsdk +PackageVersion: 1.0.0.0 +PackageLocale: en-US +PackageName: AppInstaller Test Installer +Publisher: Microsoft Corporation +Moniker: AICLITestExe +License: Test +ShortDescription: Test installer for zip without nestedInstallers specified +Scope: User +Installers: + - Architecture: x64 + InstallerUrl: https://ThisIsNotUsed + InstallerType: zip + InstallerSha256: 65DB2F2AC2686C7F2FD69D4A4C6683B888DC55BFA20A0E32CA9F838B51689A3B + NestedInstallerFiles: + - RelativeFilePath: relativeFilePath + PortableCommandAlias: portableCommandAlias +ManifestType: singleton +ManifestVersion: 1.3.0 \ No newline at end of file diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultScope.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultScope.yaml index 1b14ac8bb0..6d4d240601 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultScope.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultScope.yaml @@ -3,14 +3,14 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Scope: user ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultValues.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultValues.yaml index 02e2f3fda9..a90a700edb 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultValues.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-DefaultValues.yaml @@ -3,13 +3,13 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-SameLang.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-SameLang.yaml index f60d9c4826..4a151a3df4 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-SameLang.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness-SameLang.yaml @@ -3,15 +3,15 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Language: en-US - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Language: en-US ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness.yaml index 273b0c148b..41a7e47040 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallerUniqueness.yaml @@ -3,16 +3,16 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Language: en-US Scope: user - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Language: en-US Scope: user diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallersMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallersMissing.yaml index bdadd2330f..f1c14fa923 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallersMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InstallersMissing.yaml @@ -2,7 +2,7 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 -InstallerType: Zip +InstallerType: Msi Publisher: Microsoft License: Test ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidLocale.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidLocale.yaml index 4b8363c7b0..b871d8bb53 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidLocale.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidLocale.yaml @@ -3,12 +3,12 @@ PackageIdentifier: microsoft.msixsdk PackageVersion: 1.0.0 PackageName: MSIX SDK Publisher: Microsoft -InstallerType: zip +InstallerType: msi License: Test ShortDescription: Test invalid locale Installers: - Architecture: x86 - InstallerUrl: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + InstallerUrl: https://ThisIsNotUsed InstallerSha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD PackageLocale: In-val-id-Lo-ca-le diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidManifestVersionValue.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidManifestVersionValue.yaml index 0578e1242c..442fca2dc0 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidManifestVersionValue.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidManifestVersionValue.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.0.0.0 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0-invalid diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidUpdateBehavior.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidUpdateBehavior.yaml index 6ecf5e5caf..971601639e 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidUpdateBehavior.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-InvalidUpdateBehavior.yaml @@ -3,7 +3,7 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-LicenseMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-LicenseMissing.yaml index 9bbe42ba29..370d03c710 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-LicenseMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-LicenseMissing.yaml @@ -2,9 +2,9 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.07.32-beta Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-NameMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-NameMissing.yaml index f57bac3e37..1ffe93dccd 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-NameMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-NameMissing.yaml @@ -2,10 +2,10 @@ Id: microsoft.msixsdk Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-PackageFamilyNameOnMSI.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-PackageFamilyNameOnMSI.yaml index b8de09b515..793f9d5b52 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-PackageFamilyNameOnMSI.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-PackageFamilyNameOnMSI.yaml @@ -8,5 +8,5 @@ Installers: - Arch: x86 InstallerType: MSI PackageFamilyName: Foo_123456789abcd - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-ProductCodeOnMSIX.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-ProductCodeOnMSIX.yaml index 02b008dd2b..5eca4e7beb 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-ProductCodeOnMSIX.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-ProductCodeOnMSIX.yaml @@ -8,5 +8,5 @@ Installers: - Arch: x86 InstallerType: MSIX ProductCode: "{FOO}" - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-PublisherMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-PublisherMissing.yaml index 6baf3801cf..4b8fe3de26 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-PublisherMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-PublisherMissing.yaml @@ -6,6 +6,6 @@ InstallerType: Zip License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Invalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Invalid.yaml index 88caeb0a48..6257794f00 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Invalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Invalid.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B6 ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Missing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Missing.yaml index 524c08ef5e..8b1a4ec9af 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Missing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-Sha256Missing.yaml @@ -3,9 +3,9 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-SwitchInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-SwitchInvalid.yaml index c1e0408a99..ff9b8f3bff 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-SwitchInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-SwitchInvalid.yaml @@ -3,12 +3,12 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Exe License: Test Switches: NotASwitch: /fakeswitch Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-UnknownProperty.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-UnknownProperty.yaml index cfce89ea23..e93ca84426 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-UnknownProperty.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-UnknownProperty.yaml @@ -3,11 +3,11 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Exe License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD Fake: this is Fake ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-UnsupportedVersion.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-UnsupportedVersion.yaml index 78441d58c5..1333205904 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-UnsupportedVersion.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-UnsupportedVersion.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.0.0.0 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 1000.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlInvalid.yaml index 74fa43f46e..f017954688 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlInvalid.yaml @@ -3,7 +3,7 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlMissing.yaml index 50f158753a..ab94ad361e 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-UrlMissing.yaml @@ -3,7 +3,7 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.7.32 Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionInvalid.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionInvalid.yaml index 076e01adf4..691de47460 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionInvalid.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionInvalid.yaml @@ -3,10 +3,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Version: 1.0.9-/ Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionMissing.yaml b/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionMissing.yaml index 7437dabb85..ebb97a976c 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionMissing.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Bad-VersionMissing.yaml @@ -2,10 +2,10 @@ Id: microsoft.msixsdk Name: MSIX SDK Publisher: Microsoft -InstallerType: Zip +InstallerType: Msi License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Encoding-ANSI.yaml b/src/AppInstallerCLITests/TestData/Manifest-Encoding-ANSI.yaml index 0f99271971..c455f5450b 100644 --- a/src/AppInstallerCLITests/TestData/Manifest-Encoding-ANSI.yaml +++ b/src/AppInstallerCLITests/TestData/Manifest-Encoding-ANSI.yaml @@ -1,11 +1,11 @@ Id: microsoft.msixsdk Name: MSIX SDK� Version: 1.7.32 -InstallerType: Zip +InstallerType: Msi Publisher: Microsoft License: Test Installers: - Arch: x86 - Url: https://rubengustorage.blob.core.windows.net/publiccontainer/msixsdk-x86.zip + Url: https://ThisIsNotUsed Sha256: 98B67758CEAFFCBB3FE47838FD0A8D7BD581C2650842D6B2B0E0D49A23270CCD ManifestVersion: 0.1.0 diff --git a/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16BE-BOM.yaml b/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16BE-BOM.yaml index 86d564d2f7f1063b856e85cec3a7c601a43d6406..9bf20e165f683a9366778b854ce5c6f99c281565 100644 GIT binary patch delta 45 xcmZo-ox(Dqm(`b{m?3lGr1_E|3>gfWK#nI6`!VD*lrV$>S*Z*ulXozl0stP-3~~Sf delta 156 zcmW-ZOA3Ne7=^ze!Of_%a1AY?nU70|cDtBjI1!u&SxX>z7m{YYSb2KG|7Sguk%11%l7oFP`z$QM$j&;Qw^S4$;7iI1g?z7m{YYSfmVwn}r)8Z9Q= WMb|uZD{h>mGSWx`PsMIK2j3t39wFNR diff --git a/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16LE-BOM.yaml b/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16LE-BOM.yaml index 5f94b302a1f2d726960c1d1036307763ca29b0a1..1c8da8dca8559fbae4c0f49bce7288bc70d932a7 100644 GIT binary patch delta 45 xcmZo-ox(Dqht-#%m?3lG#QBmT3>gfWK#nI6`!VD*lrV$>S*Z*uleaUT1^^z13~&Gd delta 156 zcmW-ZI|_q96h%)Uf}2r0aSLuCou45{bTSylU?W(kh{Qe%%BFIi=5asg-Tk}kR8EL42S+V=%r{5p>;UU@p diff --git a/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16LE.yaml b/src/AppInstallerCLITests/TestData/Manifest-Encoding-UTF16LE.yaml index 8cccbdb0e3984abe2e33c94822764aa404cfc6a1..1c8da8dca8559fbae4c0f49bce7288bc70d932a7 100644 GIT binary patch delta 48 zcmZo*ox;NO|KEfzR$qo= ManifestVer{ s_ManifestVersionV1_3 }) + { + REQUIRE(manifest.DefaultInstallerInfo.NestedInstallerType == InstallerTypeEnum::Msi); + REQUIRE(manifest.DefaultInstallerInfo.NestedInstallerFiles.size() == 1); + REQUIRE(manifest.DefaultInstallerInfo.NestedInstallerFiles.at(0).RelativeFilePath == "RelativeFilePath"); + REQUIRE(manifest.DefaultInstallerInfo.NestedInstallerFiles.at(0).PortableCommandAlias == "PortableCommandAlias"); + } + if (isSingleton) { REQUIRE(manifest.Installers.size() == 1); } else { - if (manifestVer >= ManifestVer{ s_ManifestVersionV1_2 }) + if (manifestVer >= ManifestVer{ s_ManifestVersionV1_3 }) + { + REQUIRE(manifest.Installers.size() == 4); + } + else if (manifestVer == ManifestVer{ s_ManifestVersionV1_2 }) { REQUIRE(manifest.Installers.size() == 3); } @@ -550,6 +566,13 @@ void VerifyV1ManifestContent(const Manifest& manifest, bool isSingleton, Manifes REQUIRE(installer1.UnsupportedArguments.at(0) == UnsupportedArgumentEnum::Location); } + if (manifestVer >= ManifestVer{ s_ManifestVersionV1_3 }) + { + // NestedInstaller metadata should not be populated unless the InstallerType is zip. + REQUIRE(installer1.NestedInstallerType == InstallerTypeEnum::Unknown); + REQUIRE(installer1.NestedInstallerFiles.size() == 0); + } + if (!isSingleton) { ManifestInstaller installer2 = manifest.Installers.at(1); @@ -597,6 +620,21 @@ void VerifyV1ManifestContent(const Manifest& manifest, bool isSingleton, Manifes REQUIRE(installer3.UnsupportedArguments.at(0) == UnsupportedArgumentEnum::Log); } + if (manifestVer >= ManifestVer{ s_ManifestVersionV1_3 }) + { + ManifestInstaller installer4 = manifest.Installers.at(3); + REQUIRE(installer4.InstallerType == InstallerTypeEnum::Zip); + REQUIRE(installer4.Arch == Architecture::X64); + REQUIRE(installer4.Url == "https://www.microsoft.com/msixsdk/msixsdkx64.exe"); + REQUIRE(installer4.Sha256 == SHA256::ConvertToBytes("69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82")); + REQUIRE(installer4.NestedInstallerType == InstallerTypeEnum::Portable); + REQUIRE(installer4.NestedInstallerFiles.size() == 2); + REQUIRE(installer4.NestedInstallerFiles.at(0).RelativeFilePath == "relativeFilePath1"); + REQUIRE(installer4.NestedInstallerFiles.at(0).PortableCommandAlias == "portableAlias1"); + REQUIRE(installer4.NestedInstallerFiles.at(1).RelativeFilePath == "relativeFilePath2"); + REQUIRE(installer4.NestedInstallerFiles.at(1).PortableCommandAlias == "portableAlias2"); + } + // Localization REQUIRE(manifest.Localizations.size() == 1); ManifestLocalization localization1 = manifest.Localizations.at(0); diff --git a/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp b/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp index 90c85a1bd2..10b59cdad1 100644 --- a/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp +++ b/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp @@ -460,6 +460,11 @@ namespace AppInstaller::Manifest ); } + bool IsArchiveType(InstallerTypeEnum installerType) + { + return (installerType == InstallerTypeEnum::Zip); + } + bool IsInstallerTypeCompatible(InstallerTypeEnum type1, InstallerTypeEnum type2) { // Unknown type cannot be compatible with any other diff --git a/src/AppInstallerCommonCore/Manifest/ManifestValidation.cpp b/src/AppInstallerCommonCore/Manifest/ManifestValidation.cpp index 0b53161481..45dfce434f 100644 --- a/src/AppInstallerCommonCore/Manifest/ManifestValidation.cpp +++ b/src/AppInstallerCommonCore/Manifest/ManifestValidation.cpp @@ -175,6 +175,30 @@ namespace AppInstaller::Manifest } } + if (IsArchiveType(installer.InstallerType)) + { + if (installer.NestedInstallerType == InstallerTypeEnum::Unknown) + { + resultErrors.emplace_back(ManifestError::RequiredFieldMissing, "NestedInstallerType"); + } + if (installer.NestedInstallerFiles.size() == 0) + { + resultErrors.emplace_back(ManifestError::RequiredFieldMissing, "NestedInstallerFiles"); + } + if (installer.NestedInstallerType != InstallerTypeEnum::Portable && installer.NestedInstallerFiles.size() != 1) + { + resultErrors.emplace_back(ManifestError::ExceededNestedInstallerFilesLimit, "NestedInstallerFiles"); + } + + for (const auto& nestedInstallerFile : installer.NestedInstallerFiles) + { + if (nestedInstallerFile.RelativeFilePath.empty()) + { + resultErrors.emplace_back(ManifestError::RequiredFieldMissing, "RelativeFilePath"); + } + } + } + // Check empty string before calling IsValidUrl to avoid duplicate error reporting. if (!installer.Url.empty() && IsValidURL(NULL, Utility::ConvertToUTF16(installer.Url).c_str(), 0) == S_FALSE) { diff --git a/src/AppInstallerCommonCore/Manifest/ManifestYamlPopulator.cpp b/src/AppInstallerCommonCore/Manifest/ManifestYamlPopulator.cpp index 2cacce455c..1f7e1764b9 100644 --- a/src/AppInstallerCommonCore/Manifest/ManifestYamlPopulator.cpp +++ b/src/AppInstallerCommonCore/Manifest/ManifestYamlPopulator.cpp @@ -307,6 +307,17 @@ namespace AppInstaller::Manifest std::move(fields_v1_2.begin(), fields_v1_2.end(), std::inserter(result, result.end())); } + + if (manifestVersion >= ManifestVer{ s_ManifestVersionV1_3 }) + { + std::vector fields_v1_3 = + { + { "NestedInstallerType", [this](const YAML::Node& value)->ValidationErrors { m_p_installer->NestedInstallerType = ConvertToInstallerTypeEnum(value.as()); return {}; } }, + { "NestedInstallerFiles", [this](const YAML::Node& value)->ValidationErrors { return ProcessNestedInstallerFilesNode(value); } }, + }; + + std::move(fields_v1_3.begin(), fields_v1_3.end(), std::inserter(result, result.end())); + } } return result; @@ -559,6 +570,22 @@ namespace AppInstaller::Manifest return result; } + std::vector ManifestYamlPopulator::GetNestedInstallerFileFieldProcessInfo(const ManifestVer& manifestVersion) + { + std::vector result = {}; + + if (manifestVersion >= ManifestVer{ s_ManifestVersionV1_3 }) + { + result = + { + { "RelativeFilePath", [this](const YAML::Node& value)->ValidationErrors { m_p_nestedInstallerFile->RelativeFilePath = Utility::Trim(value.as()); return {}; } }, + { "PortableCommandAlias", [this](const YAML::Node& value)->ValidationErrors { m_p_nestedInstallerFile->PortableCommandAlias = Utility::Trim(value.as()); return {}; } }, + }; + } + + return result; + } + ValidationErrors ManifestYamlPopulator::ValidateAndProcessFields( const YAML::Node& rootNode, const std::vector& fieldInfos) @@ -753,6 +780,30 @@ namespace AppInstaller::Manifest return resultErrors; } + ValidationErrors ManifestYamlPopulator::ProcessNestedInstallerFilesNode(const YAML::Node& nestedInstallerFilesNode) + { + THROW_HR_IF(E_INVALIDARG, !nestedInstallerFilesNode.IsSequence()); + + ValidationErrors resultErrors; + std::vector nestedInstallerFiles; + + for (auto const& entry : nestedInstallerFilesNode.Sequence()) + { + NestedInstallerFile nestedInstallerFile; + m_p_nestedInstallerFile = &nestedInstallerFile; + auto errors = ValidateAndProcessFields(entry, NestedInstallerFileFieldInfos); + std::move(errors.begin(), errors.end(), std::inserter(resultErrors, resultErrors.end())); + nestedInstallerFiles.emplace_back(std::move(nestedInstallerFile)); + } + + if (!nestedInstallerFiles.empty()) + { + m_p_installer->NestedInstallerFiles = nestedInstallerFiles; + } + + return resultErrors; + } + ValidationErrors ManifestYamlPopulator::PopulateManifestInternal( const YAML::Node& rootNode, Manifest& manifest, @@ -777,6 +828,7 @@ namespace AppInstaller::Manifest MarketsFieldInfos = GetMarketsFieldProcessInfo(manifestVersion); AppsAndFeaturesEntryFieldInfos = GetAppsAndFeaturesEntryFieldProcessInfo(manifestVersion); DocumentationFieldInfos = GetDocumentationFieldProcessInfo(manifestVersion); + NestedInstallerFileFieldInfos = GetNestedInstallerFileFieldProcessInfo(manifestVersion); // Populate root m_p_manifest = &manifest; @@ -800,6 +852,9 @@ namespace AppInstaller::Manifest installer.AppsAndFeaturesEntries.clear(); // Clear dependencies as installer overrides root dependencies installer.Dependencies.Clear(); + // Clear nested installers as it should only be copied for zip installerType. + installer.NestedInstallerType = InstallerTypeEnum::Unknown; + installer.NestedInstallerFiles.clear(); m_p_installer = &installer; auto errors = ValidateAndProcessFields(entry, InstallerFieldInfos); @@ -821,6 +876,19 @@ namespace AppInstaller::Manifest installer.AppsAndFeaturesEntries = manifest.DefaultInstallerInfo.AppsAndFeaturesEntries; } + if (IsArchiveType(installer.InstallerType)) + { + if (installer.NestedInstallerFiles.empty()) + { + installer.NestedInstallerFiles = manifest.DefaultInstallerInfo.NestedInstallerFiles; + } + + if (installer.NestedInstallerType == InstallerTypeEnum::Unknown) + { + installer.NestedInstallerType = manifest.DefaultInstallerInfo.NestedInstallerType; + } + } + // If there are no dependencies on installer use default ones if (!installer.Dependencies.HasAny()) { diff --git a/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h b/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h index fe440f9142..6eb8d78af0 100644 --- a/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h +++ b/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h @@ -247,6 +247,12 @@ namespace AppInstaller::Manifest std::vector ExcludedMarkets; }; + struct NestedInstallerFile + { + string_t RelativeFilePath; + string_t PortableCommandAlias; + }; + InstallerTypeEnum ConvertToInstallerTypeEnum(const std::string& in); UpdateBehaviorEnum ConvertToUpdateBehaviorEnum(const std::string& in); @@ -281,6 +287,9 @@ namespace AppInstaller::Manifest // Gets a value indicating whether the given installer type supports ARP version range. bool DoesInstallerTypeSupportArpVersionRange(InstallerTypeEnum installerType); + // Gets a value indicating whether the given installer type is an archive. + bool IsArchiveType(InstallerTypeEnum installerType); + // Checks whether 2 installer types are compatible. E.g. inno and exe are update compatible bool IsInstallerTypeCompatible(InstallerTypeEnum type1, InstallerTypeEnum type2); diff --git a/src/AppInstallerCommonCore/Public/winget/ManifestInstaller.h b/src/AppInstallerCommonCore/Public/winget/ManifestInstaller.h index d02a3847c7..ed84cd3eb8 100644 --- a/src/AppInstallerCommonCore/Public/winget/ManifestInstaller.h +++ b/src/AppInstallerCommonCore/Public/winget/ManifestInstaller.h @@ -42,6 +42,10 @@ namespace AppInstaller::Manifest // If present, has more precedence than root InstallerTypeEnum InstallerType = InstallerTypeEnum::Unknown; + InstallerTypeEnum NestedInstallerType = InstallerTypeEnum::Unknown; + + std::vector NestedInstallerFiles; + ScopeEnum Scope = ScopeEnum::Unknown; std::vector InstallModes; diff --git a/src/AppInstallerCommonCore/Public/winget/ManifestValidation.h b/src/AppInstallerCommonCore/Public/winget/ManifestValidation.h index 86599c1b3e..47d8da5d5d 100644 --- a/src/AppInstallerCommonCore/Public/winget/ManifestValidation.h +++ b/src/AppInstallerCommonCore/Public/winget/ManifestValidation.h @@ -58,6 +58,7 @@ namespace AppInstaller::Manifest const char* const ApproximateVersionNotAllowed = "Approximate version not allowed."; const char* const ArpVersionOverlapWithIndex = "DisplayVersion declared in the manifest has overlap with existing DisplayVersion range in the index. Existing DisplayVersion range in index: "; const char* const ArpVersionValidationInternalError = "Internal error while validating DisplayVersion against index."; + const char* const ExceededNestedInstallerFilesLimit = "Only one entry for NestedInstallerFiles can be specified for non-portable InstallerTypes."; } struct ValidationError diff --git a/src/AppInstallerCommonCore/Public/winget/ManifestYamlPopulator.h b/src/AppInstallerCommonCore/Public/winget/ManifestYamlPopulator.h index 16323d7464..53606a7d5e 100644 --- a/src/AppInstallerCommonCore/Public/winget/ManifestYamlPopulator.h +++ b/src/AppInstallerCommonCore/Public/winget/ManifestYamlPopulator.h @@ -42,6 +42,7 @@ namespace AppInstaller::Manifest std::vector MarketsFieldInfos; std::vector AppsAndFeaturesEntryFieldInfos; std::vector DocumentationFieldInfos; + std::vector NestedInstallerFileFieldInfos; // These pointers are referenced in the processing functions in manifest field process info table. AppInstaller::Manifest::Manifest* m_p_manifest = nullptr; @@ -55,6 +56,7 @@ namespace AppInstaller::Manifest AppInstaller::Manifest::MarketsInfo* m_p_markets = nullptr; AppInstaller::Manifest::AppsAndFeaturesEntry* m_p_appsAndFeaturesEntry = nullptr; AppInstaller::Manifest::Documentation* m_p_documentation = nullptr; + AppInstaller::Manifest::NestedInstallerFile* m_p_nestedInstallerFile = nullptr; // Cache of Installers node and Localization node YAML::Node const* m_p_installersNode = nullptr; @@ -71,6 +73,7 @@ namespace AppInstaller::Manifest std::vector GetMarketsFieldProcessInfo(const ManifestVer& manifestVersion); std::vector GetAppsAndFeaturesEntryFieldProcessInfo(const ManifestVer& manifestVersion); std::vector GetDocumentationFieldProcessInfo(const ManifestVer& manifestVersion); + std::vector GetNestedInstallerFileFieldProcessInfo(const ManifestVer& manifestVersion); // This method takes YAML root node and list of manifest field info. // Yaml lib does not support case insensitive search and it allows duplicate keys. If duplicate keys exist, @@ -86,7 +89,8 @@ namespace AppInstaller::Manifest std::vector ProcessMarketsNode(const YAML::Node& marketsNode); std::vector ProcessAppsAndFeaturesEntriesNode(const YAML::Node& appsAndFeaturesEntriesNode); std::vector ProcessExpectedReturnCodesNode(const YAML::Node& returnCodesNode); - std::vector ProcessDocumentationsNode(const YAML::Node& documentations); + std::vector ProcessDocumentationsNode(const YAML::Node& documentationsNode); + std::vector ProcessNestedInstallerFilesNode(const YAML::Node& nestedInstallerFilesNode); std::vector PopulateManifestInternal( const YAML::Node& rootNode,