External cabinets and several Media #5

Closed
opened 2026-10-14 01:26:52 -05:00 by jeff · 1 comment
Owner

Parent

Part of #1

What to build

Media without EmbedCab writes its cabinet as a .cab file beside the installer package, under the name its Cabinet attribute gives, to a writer the caller provides. Several Media elements with different DiskIds split files across cabinets as the WiX source assigns them.

Acceptance criteria

  • Seam 1 tests assert the Media rows and each file's sequence for a fixture with two Media, one embedded and one external.
  • The command line writes the external .cab next to the -o output.
  • VM test: the fixture installs under Wine from a directory holding the .msi and the .cab, with every file present.
  • VM test: the tables match the reference implementation's with generated columns masked.
## Parent Part of #1 ## What to build `Media` without `EmbedCab` writes its cabinet as a `.cab` file beside the installer package, under the name its `Cabinet` attribute gives, to a writer the caller provides. Several `Media` elements with different `DiskId`s split files across cabinets as the WiX source assigns them. ## Acceptance criteria - [ ] Seam 1 tests assert the `Media` rows and each file's sequence for a fixture with two `Media`, one embedded and one external. - [ ] The command line writes the external `.cab` next to the `-o` output. - [ ] VM test: the fixture installs under Wine from a directory holding the `.msi` and the `.cab`, with every file present. - [ ] VM test: the tables match the reference implementation's with generated columns masked.
jeff self-assigned this 2026-10-14 05:07:40 -05:00
Author
Owner

Done in e1f0bd4; CI run 11 is green.

  • What changed: a Media without EmbedCab="yes" now has its cabinet written beside the package. Component/@DiskId puts a component on its disk, and files are numbered disk by disk, each Media row ending its own run.
  • Library interface: the library hands external cabinets to a CabinetWriter through writeWithCabinets. write refuses a package that has one rather than dropping it. The CLI writes the cabinets beside -o only once the package itself is written.
  • A Cabinet must be a plain file name, never a path, so a WiX source can't write outside the output directory.
  • Seam 1: two-disk sequencing and Media rows, the cabinet writer, the refusal without one, and the path refusal.
  • End to end:
    • the media fixture's tables match wixl's after one erratum;
    • it builds twice into separate directories, and every cabinet, the external one included, is byte-identical and passes cabextract -t;
    • it installs under Wine with two.cab beside the package;
    • the Windows-build check compares the external cabinets too.

wixl ignores Component/@DiskId and writes no external cabinet at all.

Done in e1f0bd4; CI run 11 is green. - **What changed:** a `Media` without `EmbedCab="yes"` now has its cabinet written beside the package. `Component/@DiskId` puts a component on its disk, and files are numbered disk by disk, each Media row ending its own run. - **Library interface:** the library hands external cabinets to a `CabinetWriter` through `writeWithCabinets`. `write` refuses a package that has one rather than dropping it. The CLI writes the cabinets beside `-o` only once the package itself is written. - **A `Cabinet` must be a plain file name,** never a path, so a WiX source can't write outside the output directory. - **Seam 1:** two-disk sequencing and Media rows, the cabinet writer, the refusal without one, and the path refusal. - **End to end:** - the `media` fixture's tables match wixl's after one erratum; - it builds twice into separate directories, and every cabinet, the external one included, is byte-identical and passes `cabextract -t`; - it installs under Wine with `two.cab` beside the package; - the Windows-build check compares the external cabinets too. wixl ignores `Component/@DiskId` and writes no external cabinet at all.
jeff closed this issue 2026-10-14 05:55:47 -05:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
jeff/zixl#5
No description provided.