From 9854f90db756931747c21d91f22f3f78bfc13b27 Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Thu, 5 Nov 2026 11:48:56 -0800 Subject: [PATCH] build(wix): the komorebi installer ships komorebi-recorder, which has no installer of its own --- komorebi-recorder/tests/packaging.rs | 118 +------------------------ komorebi-recorder/wix/License.rtf | Bin 4525 -> 0 bytes komorebi-recorder/wix/main.wxs | 127 --------------------------- wix/main.wxs | 10 +++ 4 files changed, 13 insertions(+), 242 deletions(-) delete mode 100644 komorebi-recorder/wix/License.rtf delete mode 100644 komorebi-recorder/wix/main.wxs diff --git a/komorebi-recorder/tests/packaging.rs b/komorebi-recorder/tests/packaging.rs index d7bee2cf..6b94a03d 100644 --- a/komorebi-recorder/tests/packaging.rs +++ b/komorebi-recorder/tests/packaging.rs @@ -1,17 +1,10 @@ -//! The Windows installer (`wix/main.wxs`) has to ship every binary the crate builds and has to be -//! its own product: `WiX` itself only runs on Windows, so these checks are what a Mac or Linux +//! The recorder ships in the komorebi installer (`wix/main.wxs`), so that installer has to ship every +//! binary this crate builds: `WiX` itself only runs on Windows, so this check is what a Mac or Linux //! machine can say about the installer. use std::path::Path; use std::path::PathBuf; -/// komorebi's own installer: reusing its `UpgradeCode` would make the two products upgrade and -/// uninstall each other. -const KOMOREBI_UPGRADE_CODE: &str = "F8B967B5-7E7B-4E3A-895B-B789EC898B54"; - -/// komorebi's `PATH` component, which the installer tracks the `PATH` entry by. -const KOMOREBI_PATH_COMPONENT: &str = "6C6DF276-06C4-4675-BDED-48C5C2BC9BC5"; - fn repository() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) .parent() @@ -23,28 +16,6 @@ fn installer() -> String { std::fs::read_to_string(repository().join("wix/main.wxs")).expect("wix/main.wxs") } -/// The value of attribute `name` on the first element of `tag` in the installer. -fn attribute(text: &str, tag: &str, name: &str) -> String { - let start = text - .find(&format!("<{tag} ")) - .unwrap_or_else(|| panic!("no <{tag}> in the installer")); - let element = &text[start..start + text[start..].find('>').expect("a closed tag")]; - let key = format!("{name}='"); - let value = element - .find(&key) - .unwrap_or_else(|| panic!("<{tag}> has no {name}")) - + key.len(); - element[value..][..element[value..].find('\'').expect("a closed value")].to_string() -} - -fn is_guid(text: &str) -> bool { - let parts: Vec<&str> = text.split('-').collect(); - parts.iter().map(|part| part.len()).collect::>() == [8, 4, 4, 4, 12] - && parts - .iter() - .all(|part| part.chars().all(|c| c.is_ascii_hexdigit())) -} - /// The binaries cargo builds for this crate: the package's own (`src/main.rs`) and one for each /// file in `src/bin`. fn binaries() -> Vec { @@ -68,7 +39,7 @@ fn binaries() -> Vec { } #[test] -fn every_binary_the_crate_builds_is_in_the_installer() { +fn every_binary_the_crate_builds_is_in_the_komorebi_installer() { let text = installer(); for name in binaries() { assert!( @@ -81,86 +52,3 @@ fn every_binary_the_crate_builds_is_in_the_installer() { ); } } - -#[test] -fn the_installer_installs_nothing_the_crate_does_not_build() { - let text = installer(); - let built = binaries(); - for piece in text.split("Name='").skip(1) { - let name = &piece[..piece.find('\'').expect("a closed value")]; - if let Some(binary) = name.strip_suffix(".exe") { - assert!( - built.iter().any(|built| built == binary), - "wix/main.wxs installs {name}, which this crate does not build" - ); - } - } -} - -#[test] -fn the_installer_is_its_own_product() { - let text = installer(); - - let upgrade_code = attribute(&text, "Product", "UpgradeCode"); - assert!( - is_guid(&upgrade_code), - "UpgradeCode is not a GUID: {upgrade_code}" - ); - assert!( - !upgrade_code.eq_ignore_ascii_case(KOMOREBI_UPGRADE_CODE), - "UpgradeCode is komorebi's: the two products would replace each other" - ); - assert_eq!(attribute(&text, "Product", "Name"), env!("CARGO_PKG_NAME")); - - assert!( - !text - .to_uppercase() - .contains(&KOMOREBI_PATH_COMPONENT.to_uppercase()), - "the PATH component has komorebi's GUID" - ); - let path_guid = attribute(&text, "Component Id='Path'", "Guid"); - assert!( - is_guid(&path_guid), - "the PATH component's Guid: {path_guid}" - ); -} - -#[test] -fn the_license_the_installer_shows_is_there_and_is_the_projects() { - let rtf = std::fs::read_to_string(repository().join("wix/License.rtf")).expect("License.rtf"); - assert!( - rtf.contains("Komorebi License"), - "not the project's license" - ); - assert!(rtf.contains("Version 2.0.0"), "not the project's license"); - assert!( - installer().contains("wix\\License.rtf"), - "main.wxs does not refer to wix\\License.rtf" - ); -} - -#[test] -fn the_installer_shows_the_icon_the_executables_carry() { - let text = installer(); - - let id = attribute(&text, "Icon", "Id"); - let source = attribute(&text, "Icon", "SourceFile"); - assert!( - text.contains(&format!("`6qVBreXhJ(d85U>cZz& zwmUh!KZI++zB{P25xLkqX@ZabNgS28#SER z@sl0ModmQz32T~@0FQv_t`BVA1G1dO(pE~?dhVwzOC*&7;@pUjud@YWMFZpvVY~I1ocav<*C}f1Jn60vzBr($|Sl&Nz7o5|8W=sX8 z2sefd9c`v9~N|OyOiJCiwK0|e}YtG7&PFhCGk@HbG&QgK2^!}V%X8I-eZ@~m>K*Ha> z^3zDi4?X0EqH&OE>B_@WsK0=qZV~P>DsNCe&^cJe7Kk)Ew6PkB1j2Sbq`DOM#tx0D z_G(EP;8T6*s}p`ZeFT2I8+MfoQX4+uV0Vb5bM{YF2DAu??x&#X$er&sy@}4D8ED(5 z5bVw?ccfmljHI^e9Yd&!c0&>q-v-15Kq@}ty_0G#57 zA`~q|=pc_uJgaF1EIt#l-S~*;thUBx$VM7DtOVGWTcbe3fS!RCkaS{8dzr~!toRl0 zX>344o8|I~9rQ;#MAkrEeM}HFd%`lH)%hBRs8`#X{h75a%{P)Q%^vTAv=Sk zwrE7GJ+2>ed(^qyZ6UXb(HJgLhm4Nr1;kKdI2q-7j%^KS%+!D(cq9oC6EJa1{g`ZJ zDlatnS!oz*PAhRY%|o0zaU`jmNA}8tz)(U$a`kvY=Gcdc%}7CNc+}~3>L8n%LWzk^ z2V5fjUfYHzF1E%`uuIh1VQ32wg@`mJAY!YoHNwMWLV&XpVZgx&u_}1?G1|nknBX{Q zWEdi^Dq94}3+EKS<5f#+LM z$y03bSgiDs@FEOLjBQ-mGzmig;Lj{T-j5v57{hP*iIxU+c%$V`H#($(;!lgk;w98b zqS{jvk^>!K2lzKD3W5YJ2)s<5LsZ#DEGg+|LWW?VedS3!wTG!93>xlJx^^TJvxY{z zpc)}_6;wV>f=GPsTke6)Zzk*$eD6GW1{`FC5ExnF@^T(v^t5H)>CV7nRHk z5U>S)0xU>~Hhh#+#buutXvn154MM02RX#B2PRWCueuuVTG7?GXy)x>o0MN% zdd-QQCR76#SDG;m*6pRye@9J$e@PsoD1ix>3z{C3 z%U8MSYC;~%V|R_>Yyp0}*^u^(ib`Azj=t4rAI>WfNelJMi;}v)?(`^>-(vBK?PRL7 z3O!QT0ata3k0^yE>T&%I7$|V1qADf8rN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wix/main.wxs b/wix/main.wxs index 60f3deee..3a7a30ec 100644 --- a/wix/main.wxs +++ b/wix/main.wxs @@ -104,6 +104,12 @@ + + + + + + @@ -128,6 +134,10 @@ + + + +