diff --git a/qt/aqt/about.py b/qt/aqt/about.py
index 828506fa6..586225b73 100644
--- a/qt/aqt/about.py
+++ b/qt/aqt/about.py
@@ -73,7 +73,7 @@ def show(mw: aqt.AnkiQt) -> QDialog:
abouttext += ("Python %s Qt %s Chromium %s
") % (
platform.python_version(),
qVersion(),
- qWebEngineChromiumVersion().split(".")[0],
+ (qWebEngineChromiumVersion() or "").split(".")[0],
)
abouttext += (
without_unicode_isolation(tr.about_visit_website(val=aqt.appWebsite))
diff --git a/qt/launcher/lin/build.sh b/qt/launcher/lin/build.sh
index 7bd78c27d..f38f6defe 100755
--- a/qt/launcher/lin/build.sh
+++ b/qt/launcher/lin/build.sh
@@ -13,7 +13,8 @@ HOST_ARCH=$(uname -m)
# Define output paths
OUTPUT_DIR="../../../out/launcher"
-LAUNCHER_DIR="$OUTPUT_DIR/anki-linux"
+ANKI_VERSION=$(cat ../../../.version | tr -d '\n')
+LAUNCHER_DIR="$OUTPUT_DIR/anki-launcher-$ANKI_VERSION-linux"
# Clean existing output directory
rm -rf "$LAUNCHER_DIR"
@@ -77,8 +78,8 @@ chmod +x \
chmod -R a+r "$LAUNCHER_DIR"
ZSTD="zstd -c --long -T0 -18"
-TRANSFORM="s%^.%anki-linux%S"
-TARBALL="$OUTPUT_DIR/anki-linux.tar.zst"
+TRANSFORM="s%^.%anki-launcher-$ANKI_VERSION-linux%S"
+TARBALL="$OUTPUT_DIR/anki-launcher-$ANKI_VERSION-linux.tar.zst"
tar -I "$ZSTD" --transform "$TRANSFORM" -cf "$TARBALL" -C "$LAUNCHER_DIR" .
diff --git a/qt/launcher/mac/Info.plist b/qt/launcher/mac/Info.plist
index ac0ab2f09..a48960208 100644
--- a/qt/launcher/mac/Info.plist
+++ b/qt/launcher/mac/Info.plist
@@ -5,7 +5,7 @@
CFBundleDisplayName
Anki
CFBundleShortVersionString
- 1.0
+ ANKI_VERSION
LSMinimumSystemVersion
12
LSApplicationCategoryType
diff --git a/qt/launcher/mac/build.sh b/qt/launcher/mac/build.sh
index 470b5cd25..d521e155b 100755
--- a/qt/launcher/mac/build.sh
+++ b/qt/launcher/mac/build.sh
@@ -31,7 +31,8 @@ lipo -create \
cp "$OUTPUT_DIR/uv" "$APP_LAUNCHER/Contents/MacOS/"
# Copy support files
-cp Info.plist "$APP_LAUNCHER/Contents/"
+ANKI_VERSION=$(cat ../../../.version | tr -d '\n')
+sed "s/ANKI_VERSION/$ANKI_VERSION/g" Info.plist > "$APP_LAUNCHER/Contents/Info.plist"
cp icon/Assets.car "$APP_LAUNCHER/Contents/Resources/"
cp ../pyproject.toml "$APP_LAUNCHER/Contents/Resources/"
cp ../../../.python-version "$APP_LAUNCHER/Contents/Resources/"
diff --git a/qt/launcher/mac/dmg/build.sh b/qt/launcher/mac/dmg/build.sh
index 16b48c06a..7eeba9948 100755
--- a/qt/launcher/mac/dmg/build.sh
+++ b/qt/launcher/mac/dmg/build.sh
@@ -6,7 +6,8 @@ set -e
# base folder with Anki.app in it
output="$1"
dist="$1/tmp"
-dmg_path="$output/Anki.dmg"
+ANKI_VERSION=$(cat ../../../.version | tr -d '\n')
+dmg_path="$output/anki-launcher-$ANKI_VERSION-mac.dmg"
if [ -d "/Volumes/Anki" ]
then
diff --git a/qt/launcher/src/bin/build_win.rs b/qt/launcher/src/bin/build_win.rs
index 96688f190..4c2ca4413 100644
--- a/qt/launcher/src/bin/build_win.rs
+++ b/qt/launcher/src/bin/build_win.rs
@@ -22,6 +22,11 @@ const NSIS_PATH: &str = "C:\\Program Files (x86)\\NSIS\\makensis.exe";
fn main() -> Result<()> {
println!("Building Windows launcher...");
+ // Read version early so it can be used throughout the build process
+ let version = std::fs::read_to_string("../../../.version")?
+ .trim()
+ .to_string();
+
let output_dir = PathBuf::from(OUTPUT_DIR);
let launcher_exe_dir = PathBuf::from(LAUNCHER_EXE_DIR);
let nsis_dir = PathBuf::from(NSIS_DIR);
@@ -31,16 +36,20 @@ fn main() -> Result<()> {
extract_nsis_plugins()?;
copy_files(&output_dir)?;
sign_binaries(&output_dir)?;
- copy_nsis_files(&nsis_dir)?;
+ copy_nsis_files(&nsis_dir, &version)?;
build_uninstaller(&output_dir, &nsis_dir)?;
sign_file(&output_dir.join("uninstall.exe"))?;
generate_install_manifest(&output_dir)?;
build_installer(&output_dir, &nsis_dir)?;
- sign_file(&PathBuf::from("../../../out/launcher_exe/anki-install.exe"))?;
+
+ let installer_filename = format!("anki-launcher-{version}-windows.exe");
+ let installer_path = PathBuf::from("../../../out/launcher_exe").join(&installer_filename);
+
+ sign_file(&installer_path)?;
println!("Build completed successfully!");
println!("Output directory: {}", output_dir.display());
- println!("Installer: ../../../out/launcher_exe/anki-install.exe");
+ println!("Installer: ../../../out/launcher_exe/{installer_filename}");
Ok(())
}
@@ -235,11 +244,13 @@ fn generate_install_manifest(output_dir: &Path) -> Result<()> {
Ok(())
}
-fn copy_nsis_files(nsis_dir: &Path) -> Result<()> {
+fn copy_nsis_files(nsis_dir: &Path, version: &str) -> Result<()> {
println!("Copying NSIS support files...");
- // Copy anki.template.nsi as anki.nsi
- copy_file("anki.template.nsi", nsis_dir.join("anki.nsi"))?;
+ // Copy anki.template.nsi as anki.nsi and substitute version placeholders
+ let template_content = std::fs::read_to_string("anki.template.nsi")?;
+ let substituted_content = template_content.replace("ANKI_VERSION", version);
+ write_file(nsis_dir.join("anki.nsi"), substituted_content)?;
// Copy fileassoc.nsh
copy_file("fileassoc.nsh", nsis_dir.join("fileassoc.nsh"))?;
diff --git a/qt/launcher/win/anki.template.nsi b/qt/launcher/win/anki.template.nsi
index 84dedf9c8..36b32a893 100644
--- a/qt/launcher/win/anki.template.nsi
+++ b/qt/launcher/win/anki.template.nsi
@@ -24,7 +24,7 @@ Name "Anki"
Unicode true
; The file to write (relative to nsis directory)
-OutFile "..\launcher_exe\anki-install.exe"
+OutFile "..\launcher_exe\anki-launcher-ANKI_VERSION-windows.exe"
; Non elevated
RequestExecutionLevel user
@@ -214,7 +214,7 @@ Section ""
; Write the uninstall keys for Windows
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayName" "Anki Launcher"
- WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayVersion" "1.0.0"
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayVersion" "ANKI_VERSION"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "QuietUninstallString" '"$INSTDIR\uninstall.exe" /S'
WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "NoModify" 1