feat(updater): add native Windows ARM64 installer
This commit is contained in:
1 parent
9dc058d127
commit
ba2e7eb756
11 files changed
+106
-18
No files matched your search
@@ -535,7 +535,7 @@ jobs:
|
||||
retention-days: 14
|
||||
|
||||
windows-arm64:
|
||||
name: Windows ARM64 stable portable package
|
||||
name: Windows ARM64 stable package
|
||||
if: ${{ !inputs.windows_only }}
|
||||
needs: prepare
|
||||
runs-on: windows-11-arm
|
||||
@@ -580,9 +580,11 @@ jobs:
|
||||
with:
|
||||
path: target/release
|
||||
key: ${{ steps.rust-cache.outputs.cache-key }}
|
||||
- name: Package native ARM64 ZIP
|
||||
- name: Package native ARM64 assets
|
||||
shell: pwsh
|
||||
run: ./scripts/package-release.ps1 -Version $env:PACKAGE_VERSION -Architecture arm64 -OutputDirectory dist -TargetDirectory target
|
||||
run: |
|
||||
./scripts/package-release.ps1 -Version $env:PACKAGE_VERSION -Architecture arm64 -OutputDirectory dist -TargetDirectory target
|
||||
./scripts/build-installer.ps1 -Version $env:PACKAGE_VERSION -Architecture arm64 -OutputDirectory dist -TargetDirectory target -SkipBuild -Force
|
||||
- name: Keep Windows PowerShell alive on the ARM64 runner image
|
||||
shell: pwsh
|
||||
run: ./scripts/conformance/windows_arm64_module_path.ps1
|
||||
@@ -600,7 +602,9 @@ jobs:
|
||||
with:
|
||||
compression-level: 0
|
||||
name: stable-package-windows-arm64
|
||||
path: dist/Pebrel-v${{ needs.prepare.outputs.version }}-windows-arm64.zip
|
||||
path: |
|
||||
dist/Pebrel-v${{ needs.prepare.outputs.version }}-windows-arm64.zip
|
||||
dist/Pebrel-v${{ needs.prepare.outputs.version }}-windows-arm64-setup.exe
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
- name: Upload Windows ARM64 conformance evidence
|
||||
|
||||
+5
-2
@@ -10,6 +10,7 @@ Every release entry is provided in English and Simplified Chinese.
|
||||
|
||||
#### Added
|
||||
|
||||
- Added a native Windows ARM64 installer and in-app automatic installation, alongside the existing ARM64 portable ZIP.
|
||||
- Added in-app updates for packaged macOS applications on Apple Silicon and Intel. Verified updates can install after restart or on the next launch, then restore the saved workspace. Immediate relaunch failure rolls back to the original application. Installation requires a writable application location; copies running from a disk image or App Translocation must first be moved.
|
||||
- Added SSH display names to the Shell picker, Quick Jump and command palette. Named hosts show their configured name alongside the original connection target; unnamed hosts keep the previous display. Search matches both the name and target, and selecting a row still connects to the original destination.
|
||||
- Added a configurable tab-rename shortcut in Settings → Key Bindings → Tabs. The default remains F2; changing or clearing the shortcut lets F2 reach terminal applications such as Codex CLI. Changes apply without restarting, and menu shortcut hints follow the effective binding.
|
||||
@@ -32,12 +33,13 @@ Every release entry is provided in English and Simplified Chinese.
|
||||
- Organized Windows Explorer integration into one normal Pebrel open command and one WSL submenu containing the installed distributions. Installation migrates Pebrel-owned flat entries while preserving unrelated or user-edited commands.
|
||||
- Expanded issue forms with operating-system, shell, pane-program and connection details, and clearer reproduction and evidence fields to make problem reports easier to investigate.
|
||||
|
||||
Windows x64 provides an installer and portable ZIP; Windows ARM64 provides a native portable ZIP. On Windows, the installer and automatic installation remain x64-only; packaged macOS applications support in-app installation. Linux x64 packages and macOS Apple Silicon / Intel DMGs remain Preview releases.
|
||||
Windows x64 and ARM64 provide installers and portable ZIPs. On Windows, automatic installation supports both architectures; packaged macOS applications support in-app installation. Linux x64 packages and macOS Apple Silicon / Intel DMGs remain Preview releases.
|
||||
|
||||
### 中文
|
||||
|
||||
#### 新增
|
||||
|
||||
- 新增原生 Windows ARM64 安装器及应用内自动安装,同时保留 ARM64 便携 ZIP。
|
||||
- 为 Apple Silicon 和 Intel 上的 macOS 打包应用加入应用内更新:校验通过后,可选择重启安装或下次启动时安装,并恢复已保存的工作区;新应用立即重启失败时回滚到原应用。安装位置必须可写,从磁盘映像或 App Translocation 路径运行的副本需先移动到正常安装位置。
|
||||
- 在 Shell 选择器、快速跳转和命令面板中显示 SSH 主机名称:已命名的主机显示名称与原始连接目标,未命名的主机保持原来的显示。搜索同时匹配名称和目标,选择后仍连接原始地址。
|
||||
- 在“设置 → 按键映射 → 标签页”中新增可修改的“重命名标签”快捷键,默认仍为 F2。修改或清除后,F2 可传递给 Codex CLI 等终端程序;设置无需重启即可生效,菜单提示同步显示实际快捷键。
|
||||
@@ -60,7 +62,7 @@ Windows x64 provides an installer and portable ZIP; Windows ARM64 provides a nat
|
||||
- 整理 Windows 资源管理器右键菜单,保留一个普通 Pebrel 打开入口,并将已安装的 WSL 发行版集中到一个子菜单中;安装时迁移 Pebrel 自有的旧平铺入口,保留无关或经过用户编辑的命令。
|
||||
- 完善问题反馈表单,补充操作系统、Shell、面板程序和连接方式等信息,并明确复现步骤与日志、截图要求,便于定位问题。
|
||||
|
||||
Windows x64 提供安装器和 ZIP 便携包,Windows ARM64 提供原生便携 ZIP;Windows 安装器和自动安装仍仅支持 x64;macOS 打包应用支持应用内安装。Linux x64 包及 macOS Apple Silicon/Intel DMG 继续标记为 Preview。
|
||||
Windows x64 与 ARM64 均提供安装器和 ZIP 便携包;Windows 自动安装支持两种架构;macOS 打包应用支持应用内安装。Linux x64 包及 macOS Apple Silicon/Intel DMG 继续标记为 Preview。
|
||||
|
||||
### Contributors
|
||||
|
||||
@@ -84,6 +86,7 @@ Checksums will be filled from the final release artifacts. / 校验值将在最
|
||||
- `Pebrel-v1.9.1-windows-x64.zip`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-x64-setup.exe`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-arm64.zip`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-arm64-setup.exe`: `PENDING FINAL BUILD`
|
||||
|
||||
## 1.9.0 - 2026-09-22
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
# Windows ARM64 installer
|
||||
|
||||
## Status
|
||||
|
||||
Proposed for review on 2026-09-24.
|
||||
|
||||
## Context
|
||||
|
||||
Pebrel already builds and validates a native Windows ARM64 application and portable ZIP,
|
||||
but automatic installation still has no ARM64 installer asset.
|
||||
|
||||
## Decision
|
||||
|
||||
Parameterize the existing Inno installer by architecture instead of creating a second
|
||||
installer path. The ARM64 release job reuses its already-built native payload, validates
|
||||
that payload as ARM64, builds `windows-arm64-setup.exe`, and publishes it beside the ZIP.
|
||||
Release discovery selects that exact asset on ARM64; Windows x64 behavior is unchanged.
|
||||
|
||||
Pebrel 1.9.0 remains the historical ARM64 portable-only release. Later stable manifests
|
||||
require the ARM64 installer.
|
||||
|
||||
## Rejected alternatives
|
||||
|
||||
A separate ARM64 installer script and a second updater transaction were rejected because
|
||||
the existing installer and handoff contracts are architecture-independent once the payload
|
||||
and release asset are native.
|
||||
|
||||
## Validation
|
||||
|
||||
Run the existing packaging tests, stable-release contracts, and native Windows ARM64 CI,
|
||||
including actual Inno installer generation.
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
### Added
|
||||
|
||||
- Added a native Windows ARM64 installer and in-app automatic installation, alongside the existing ARM64 portable ZIP.
|
||||
- Added in-app updates for packaged macOS applications on Apple Silicon and Intel. Verified updates can install after restart or on the next launch, then restore the saved workspace. Immediate relaunch failure rolls back to the original application. Installation requires a writable application location; copies running from a disk image or App Translocation must first be moved.
|
||||
- Added SSH display names to the Shell picker, Quick Jump and command palette. Named hosts show their configured name alongside the original connection target; unnamed hosts keep the previous display. Search matches both the name and target, and selecting a row still connects to the original destination.
|
||||
- Added a configurable tab-rename shortcut in Settings → Key Bindings → Tabs. The default remains F2; changing or clearing the shortcut lets F2 reach terminal applications such as Codex CLI. Changes apply without restarting, and menu shortcut hints follow the effective binding.
|
||||
@@ -26,12 +27,13 @@
|
||||
- Organized Windows Explorer integration into one normal Pebrel open command and one WSL submenu containing the installed distributions. Installation migrates Pebrel-owned flat entries while preserving unrelated or user-edited commands.
|
||||
- Expanded issue forms with operating-system, shell, pane-program and connection details, and clearer reproduction and evidence fields to make problem reports easier to investigate.
|
||||
|
||||
Windows x64 provides an installer and portable ZIP; Windows ARM64 provides a native portable ZIP. On Windows, the installer and automatic installation remain x64-only; packaged macOS applications support in-app installation. Linux x64 packages and macOS Apple Silicon / Intel DMGs remain Preview releases.
|
||||
Windows x64 and ARM64 provide installers and portable ZIPs. On Windows, automatic installation supports both architectures; packaged macOS applications support in-app installation. Linux x64 packages and macOS Apple Silicon / Intel DMGs remain Preview releases.
|
||||
|
||||
## 中文
|
||||
|
||||
### 新增
|
||||
|
||||
- 新增原生 Windows ARM64 安装器及应用内自动安装,同时保留 ARM64 便携 ZIP。
|
||||
- 为 Apple Silicon 和 Intel 上的 macOS 打包应用加入应用内更新:校验通过后,可选择重启安装或下次启动时安装,并恢复已保存的工作区;新应用立即重启失败时回滚到原应用。安装位置必须可写,从磁盘映像或 App Translocation 路径运行的副本需先移动到正常安装位置。
|
||||
- 在 Shell 选择器、快速跳转和命令面板中显示 SSH 主机名称:已命名的主机显示名称与原始连接目标,未命名的主机保持原来的显示。搜索同时匹配名称和目标,选择后仍连接原始地址。
|
||||
- 在“设置 → 按键映射 → 标签页”中新增可修改的“重命名标签”快捷键,默认仍为 F2。修改或清除后,F2 可传递给 Codex CLI 等终端程序;设置无需重启即可生效,菜单提示同步显示实际快捷键。
|
||||
@@ -54,7 +56,7 @@ Windows x64 provides an installer and portable ZIP; Windows ARM64 provides a nat
|
||||
- 整理 Windows 资源管理器右键菜单,保留一个普通 Pebrel 打开入口,并将已安装的 WSL 发行版集中到一个子菜单中;安装时迁移 Pebrel 自有的旧平铺入口,保留无关或经过用户编辑的命令。
|
||||
- 完善问题反馈表单,补充操作系统、Shell、面板程序和连接方式等信息,并明确复现步骤与日志、截图要求,便于定位问题。
|
||||
|
||||
Windows x64 提供安装器和 ZIP 便携包,Windows ARM64 提供原生便携 ZIP;Windows 安装器和自动安装仍仅支持 x64;macOS 打包应用支持应用内安装。Linux x64 包及 macOS Apple Silicon/Intel DMG 继续标记为 Preview。
|
||||
Windows x64 与 ARM64 均提供安装器和 ZIP 便携包;Windows 自动安装支持两种架构;macOS 打包应用支持应用内安装。Linux x64 包及 macOS Apple Silicon/Intel DMG 继续标记为 Preview。
|
||||
|
||||
## Contributors
|
||||
|
||||
@@ -78,3 +80,4 @@ Checksums will be filled from the final release artifacts. / 校验值将在最
|
||||
- `Pebrel-v1.9.1-windows-x64.zip`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-x64-setup.exe`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-arm64.zip`: `PENDING FINAL BUILD`
|
||||
- `Pebrel-v1.9.1-windows-arm64-setup.exe`: `PENDING FINAL BUILD`
|
||||
@@ -14,12 +14,18 @@ pub(crate) fn macos_names(version: &str, architecture: &str) -> Vec<String> {
|
||||
]
|
||||
}
|
||||
|
||||
pub(crate) fn windows_names(version: &str, architecture: &str) -> Vec<String> {
|
||||
match architecture {
|
||||
"x86_64" => super::windows_x64_installer_names(version).to_vec(),
|
||||
"aarch64" => vec![format!("Pebrel-v{version}-windows-arm64-setup.exe")],
|
||||
_ => Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn native_names(version: &str) -> Vec<String> {
|
||||
match Platform::current() {
|
||||
Platform::MacOS => macos_names(version, std::env::consts::ARCH),
|
||||
Platform::Windows if std::env::consts::ARCH == "x86_64" => {
|
||||
super::windows_x64_installer_names(version).to_vec()
|
||||
},
|
||||
Platform::Windows => windows_names(version, std::env::consts::ARCH),
|
||||
_ => Vec::new(),
|
||||
}
|
||||
}
|
||||
@@ -94,6 +100,14 @@ mod tests {
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
fn windows_architectures_are_exact() {
|
||||
assert_eq!(
|
||||
windows_names("1.9.1", "aarch64"),
|
||||
["Pebrel-v1.9.1-windows-arm64-setup.exe"]
|
||||
);
|
||||
assert!(windows_names("1.9.1", "unknown").is_empty());
|
||||
}
|
||||
#[test]
|
||||
fn checksum_manifest_requires_one_exact_valid_entry() {
|
||||
let Some(name) = native_names("1.9.0").into_iter().next() else { return };
|
||||
let entry = format!("{} {name}\n", "a".repeat(64));
|
||||
|
||||
@@ -9,6 +9,9 @@ param(
|
||||
[ValidateSet('NebulaTerminal', 'Pebrel')]
|
||||
[string] $PackageBrand = 'Pebrel',
|
||||
|
||||
[ValidateSet('x64', 'arm64')]
|
||||
[string] $Architecture = 'x64',
|
||||
|
||||
[switch] $SkipBuild,
|
||||
# 与 -SkipBuild 联用:跳过「exe 必须比源码新」的陈旧检查。仅用于脚本
|
||||
# 自测;发布安装包一律走全新构建。
|
||||
@@ -57,7 +60,7 @@ if ([string]::IsNullOrWhiteSpace($TargetDirectory)) {
|
||||
}
|
||||
$cargoTargetRoot = [System.IO.Path]::GetFullPath($TargetDirectory)
|
||||
$targetRoot = Join-Path $cargoTargetRoot $Configuration
|
||||
$setupPath = Join-Path $outputRoot "$PackageBrand-v$Version-windows-x64-setup.exe"
|
||||
$setupPath = Join-Path $outputRoot "$PackageBrand-v$Version-windows-$Architecture-setup.exe"
|
||||
|
||||
$requiredFiles = @(
|
||||
(Join-Path $targetRoot 'pebrel.exe'),
|
||||
@@ -94,6 +97,8 @@ if ($missing.Count -ne 0) {
|
||||
}
|
||||
|
||||
$packagedExe = Join-Path $targetRoot 'pebrel.exe'
|
||||
. (Join-Path $PSScriptRoot 'windows-package-architecture.ps1')
|
||||
Assert-WindowsPackageArchitecture -Root $targetRoot -Architecture $Architecture
|
||||
if ($PackageBrand -eq 'Pebrel' -and (Get-Item -LiteralPath $packagedExe).VersionInfo.ProductName -ne 'Pebrel') {
|
||||
throw 'Pebrel packages require a freshly built Pebrel executable, not renamed Nebula binaries.'
|
||||
}
|
||||
@@ -145,6 +150,7 @@ if ($ValidateOnly) {
|
||||
InstallerScript = $installerScript
|
||||
Version = $Version
|
||||
Configuration = $Configuration
|
||||
Architecture = $Architecture
|
||||
Files = $requiredFiles.Count
|
||||
} | Format-List
|
||||
return
|
||||
@@ -202,7 +208,7 @@ if (-not $translationValid) {
|
||||
|
||||
Push-Location $PSScriptRoot
|
||||
try {
|
||||
& $InnoCompiler "/DAppVersion=$Version" "/DNumericVersion=$numericVersion" "/DConfiguration=$Configuration" "/DPackageBrand=$PackageBrand" "/DBuildRoot=$targetRoot" "/O$outputRoot" $installerScript
|
||||
& $InnoCompiler "/DAppVersion=$Version" "/DNumericVersion=$numericVersion" "/DConfiguration=$Configuration" "/DPackageBrand=$PackageBrand" "/DArchitecture=$Architecture" "/DBuildRoot=$targetRoot" "/O$outputRoot" $installerScript
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Inno Setup compilation failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
#define PackageBrand "Pebrel"
|
||||
#endif
|
||||
|
||||
#ifndef Architecture
|
||||
#define Architecture "x64"
|
||||
#endif
|
||||
|
||||
#define RepoRoot ".."
|
||||
#ifndef BuildRoot
|
||||
#define BuildRoot RepoRoot + "\target\" + Configuration
|
||||
@@ -50,13 +54,17 @@ DisableWelcomePage=no
|
||||
DisableDirPage=no
|
||||
DisableReadyPage=no
|
||||
PrivilegesRequired=lowest
|
||||
#if Architecture == "arm64"
|
||||
ArchitecturesAllowed=arm64
|
||||
#else
|
||||
ArchitecturesAllowed=x64compatible
|
||||
#endif
|
||||
MinVersion=10.0.17763
|
||||
LicenseFile={#RepoRoot}\LICENSE
|
||||
SetupIconFile={#RepoRoot}\nebula_app\windows\nebula.ico
|
||||
UninstallDisplayIcon={app}\pebrel.exe
|
||||
OutputDir={#RepoRoot}\dist
|
||||
OutputBaseFilename={#PackageBrand}-v{#AppVersion}-windows-x64-setup
|
||||
OutputBaseFilename={#PackageBrand}-v{#AppVersion}-windows-{#Architecture}-setup
|
||||
Compression=lzma2/max
|
||||
SolidCompression=yes
|
||||
WizardStyle=modern
|
||||
|
||||
@@ -45,6 +45,8 @@ def expected_asset_names(version: str) -> tuple[str, ...]:
|
||||
)
|
||||
if tuple(map(int, version.split("."))) >= (1, 9, 0):
|
||||
names += (f"Pebrel-v{version}-windows-arm64.zip",)
|
||||
if tuple(map(int, version.split("."))) > (1, 9, 0):
|
||||
names += (f"Pebrel-v{version}-windows-arm64-setup.exe",)
|
||||
# The old-name installer was retired from 1.7.0; retain historical manifests.
|
||||
if tuple(map(int, version.split("."))) < (1, 7, 0):
|
||||
names += (f"NebulaTerminal-{version}-windows-x64-setup.exe",)
|
||||
|
||||
@@ -34,7 +34,8 @@ $requiredPatterns = [ordered]@{
|
||||
'Pebrel display name' = 'AppName=Pebrel'
|
||||
'compatible installer identity' = 'AppId=\{\{61022144-7D0A-4E54-94F2-C329A8F58656\}'
|
||||
'Pebrel default asset name' = '#define PackageBrand "Pebrel"'
|
||||
'explicit package brand' = 'OutputBaseFilename=\{#PackageBrand\}-v\{#AppVersion\}-windows-x64-setup'
|
||||
'architecture-specific package name' = 'OutputBaseFilename=\{#PackageBrand\}-v\{#AppVersion\}-windows-\{#Architecture\}-setup'
|
||||
'native ARM64 gate' = '(?s)#if Architecture == "arm64".*ArchitecturesAllowed=arm64'
|
||||
'localized Chinese context menu label' = 'chinesesimplified\.OpenInPebrel=\S.+'
|
||||
'localized WSL context menu label' = 'english\.OpenInPebrelWsl=Open in Pebrel'
|
||||
'localized Chinese WSL context menu label' = 'chinesesimplified\.OpenInPebrelWsl=\S.+'
|
||||
|
||||
@@ -74,9 +74,14 @@ class PebrelBrandingTests(unittest.TestCase):
|
||||
self.assertIn("Stale binary:", source)
|
||||
installer = self.source("scripts/installer.iss")
|
||||
self.assertIn('#define PackageBrand "Pebrel"', installer)
|
||||
self.assertIn("OutputBaseFilename={#PackageBrand}-v{#AppVersion}-windows-x64-setup", installer)
|
||||
self.assertIn(
|
||||
"OutputBaseFilename={#PackageBrand}-v{#AppVersion}-windows-{#Architecture}-setup",
|
||||
installer,
|
||||
)
|
||||
builder = self.source("scripts/build-installer.ps1")
|
||||
self.assertIn("[ValidateSet('x64', 'arm64')]", builder)
|
||||
self.assertIn('"/DPackageBrand=$PackageBrand"', builder)
|
||||
self.assertIn('"/DArchitecture=$Architecture"', builder)
|
||||
|
||||
def test_update_asset_validation_shares_current_and_legacy_names(self):
|
||||
check = self.source("nebula_app/src/update_check.rs")
|
||||
|
||||
@@ -106,7 +106,8 @@ class StableReleaseTests(unittest.TestCase):
|
||||
arm = workflow.split("\n windows-arm64:\n", 1)[1].split("\n aggregate:\n", 1)[0]
|
||||
for required in ("runs-on: windows-11-arm", "host: aarch64-pc-windows-msvc",
|
||||
"-Architecture arm64", "windows-arm64-report.json",
|
||||
"scripts/build-windows-product.ps1", "--platform windows-aarch64"):
|
||||
"scripts/build-windows-product.ps1", "scripts/build-installer.ps1",
|
||||
"windows-arm64-setup.exe", "--platform windows-aarch64"):
|
||||
self.assertIn(required, arm)
|
||||
self.assertNotIn("continue-on-error", arm)
|
||||
self.assertNotIn("always()", aggregate)
|
||||
@@ -140,7 +141,8 @@ class StableReleaseTests(unittest.TestCase):
|
||||
for version in ("1.7.0", "1.7.1", "1.10.0", "2.0.0"):
|
||||
with self.subTest(version=version):
|
||||
names = expected_asset_names(version)
|
||||
self.assertEqual(len(names), 8 if tuple(map(int, version.split('.'))) >= (1, 9, 0) else 7)
|
||||
parsed = tuple(map(int, version.split('.')))
|
||||
self.assertEqual(len(names), 9 if parsed > (1, 9, 0) else 8 if parsed >= (1, 9, 0) else 7)
|
||||
self.assertIn(f"Pebrel-v{version}-windows-x64-setup.exe", names)
|
||||
self.assertNotIn(f"NebulaTerminal-{version}-windows-x64-setup.exe", names)
|
||||
|
||||
@@ -156,6 +158,15 @@ class StableReleaseTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(StableReleaseError, "missing: Pebrel-v1.9.0-windows-arm64.zip"):
|
||||
validate_assets(root, version)
|
||||
|
||||
def test_post_190_requires_native_windows_arm64_installer(self) -> None:
|
||||
self.assertNotIn("Pebrel-v1.9.0-windows-arm64-setup.exe", expected_asset_names("1.9.0"))
|
||||
for version in ("1.9.1", "1.10.0", "2.0.0"):
|
||||
with self.subTest(version=version):
|
||||
self.assertIn(
|
||||
f"Pebrel-v{version}-windows-arm64-setup.exe",
|
||||
expected_asset_names(version),
|
||||
)
|
||||
|
||||
def test_17_assets_reject_retired_alias_and_missing_installer(self) -> None:
|
||||
version = "1.7.0"
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
|
||||
Reference in new issue
Block a user