# Changelog All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.4.0] - 2026-08-29 ### Added - DriveStage project naming — the prior codename carried a trademark conflict; the rename is deliberate and complete across source, docs, install paths, partition labels, GRUB cfg identifiers, env vars, lock files, and git remote URL - BlkStage is the formal name for the internal bash backend (the `blkstage.sh` engine) - Internal `PAYLOAD_CATEGORIES` table in the bash engine — single source of truth for both `list_payloads` and `scan_payloads` summary (eliminates 4 near-duplicate if-compgen+for blocks) - `is_critical_mount()` helper in the bash engine — single `case` statement replaces the inner `for cm in $critical_mounts; do if [[ ... ]]; fi; done` loop in `guard_root_disk` - `install_grub2()` and `resolve_install_argv()` helpers in `gui/src/core/bootloader.rs` — step-down dispatch replaces the nested if-then-return + match-with-inline-early-return pattern - Iterator-chain form of `is_disk_safe_to_wipe()` in `gui/src/core/disk.rs` — single expression replaces nested for-loop+if ### Changed - Public project name: BootPrep → DriveStage - Internal backend name: (informal) → BlkStage (formal) - Engine file: `scripts/bootprep.sh` → `scripts/blkstage.sh` (and `gui/assets/blkstage.sh`) - GUI binary: `bootprep-gui` → `drivestage-gui` - Install path: `/usr/local/lib/bootprep/` → `/usr/local/lib/drivestage/` - Mount base: `/mnt/bootprep` → `/mnt/drivestage` - Config file: `/etc/bootprep.conf` → `/etc/drivestage.conf` - Lock file: `/var/lock/bootprep.lock` → `/var/lock/drivestage.lock` - Env var: `BOOTPREP_SH` → `DRIVESTAGE_SH` - Partition labels: `BOOTPREP` / `BOOTPREP-EFI` → `DRIVESTAGE` / `DRIVESTAGE-EFI` - GRUB cfg identifiers: `mb_iso_entry` / `mb_rootfs_entry` / `mb_payload_uuid` → `ds_iso_entry` / `ds_rootfs_entry` / `ds_payload_uuid` - Extraction marker: `.mb_extracted` → `.ds_extracted` - iced application id: `dev.bootprep.gui` → `dev.drivestage.gui` - Git remote URL: `dcosnet/BootPrep` → `dcosnet/DriveStage` - `check_commands` GRUB binary check uses step-down `command -v ... || command -v ... || missing+=(...)` instead of an `if ! cmd1 && ! cmd2; then` block - `grub_install_cmd` uses step-down `command -v ... && { printf ...; return; }` instead of `if/elif/else` cascade - `unmount_all` consolidates inline `p1`/`p3` resolution into a single `for p in` step-down - `bootloader.rs::install` reordered to a clean step-down sequence: GRUB2 dispatch → resolve argv → run → generate configs - `is_disk_safe_to_wipe` rewritten as a single iterator-chain expression with `flat_map().any()` instead of nested `for c in &disk.children { for m in &c.mountpoints { if critical_mounts.iter().any(...) { return false; } } }` - LICENSE extended with a Project Naming section documenting DriveStage + BlkStage - Author email `info@dcos.net` added to all author references (docs, source comments, Cargo manifests, LICENSE, GUI about panel) - BLOG.md phrasing updated: "accumulated workarounds" → "accumulated design constraints of that era" ### Removed - Stale reference to `emit_iso_menuentry` function in README.md (the function was removed in v0.2.0 per QA-8) - Stale "v0.2.0 experimental" warning in README.md (superseded by v0.4.0) ### Security - No new findings. The trademark conflict motivating the rename did not involve any code-execution or privilege-escalation vector. ## [0.3.0] - 2026-08-14 ### Added - Bootloader config generation for non-GRUB2 bootloaders — systemd-boot (`loader.conf` + entry stubs), Limine (`limine.conf`), and rEFInd (`refind.conf`) are now automatically generated from discovered payloads after binary install - New `gui/src/core/config_gen.rs` module — table-driven config generation with distro detection and filename sanitization - Loop device smoke test (`scripts/test_loop_device.sh`) — end-to-end test on a sparse loop device covering setup → list → clean with partition, mount, grub.cfg, and BOOTX64.EFI verification - cargo-audit step in CI workflow — security vulnerability scanning via rustsec/audit-check - Expanded Rust unit test suite — 16 tests across `disk.rs`, `payload.rs`, and `config_gen.rs` covering parse_lsblk_size, NVMe JSON parsing, is_disk_safe_to_wipe, is_tarball_ext, kind_rank ordering, payload size formatting, config generation, and distro detection ### Changed - Bootloader install now generates config files automatically after binary install for non-GRUB2 bootloaders - BootloaderPage UI shows config generation status in the install completion message - GRUB2 install message clarifies it uses boot-time auto-scan (no host-side config needed) ### Fixed - Non-GRUB2 bootloaders previously installed binaries but generated no config files — now fully functional ## [0.2.0] - 2026-08-14 ### Added - Boot-time auto-scan grub.cfg — GRUB discovers payloads at boot, no host-side scan required for ISOs - Bootloader switcher in GUI (GRUB2, systemd-boot, Limine, rEFInd) - Custom menuentry editor in GUI - Drive diagnostics tab (SMART, partition table, filesystem info) - `--version` flag on the bash script - `grub_install_cmd()` resolver — handles grub-install vs grub2-install naming - LVM/LUKS/mdadm detection in guard_root_disk via lsblk PKNAME chain - Cleanup trap on EXIT/INT/TERM - Flock-based concurrent invocation protection - Free-space check before rsync in deploy_payload - .mb_extracted idempotency marker for tarball extraction - test_distro_detection.sh — 30 distro pattern tests - CI/CD pipeline (GitHub Actions) - CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, CODEOWNERS - Makefile with dist/release targets - Root Cargo.toml workspace manifest ### Changed - GRUB install failures are now fatal (prevents unbootable drives) - GRUB regexp cascade is now case-insensitive (--ignore-case) - unmount_all is now recursive (umount -R) - ESP no longer sets LegacyBIOSBootable GPT attribute - check_commands now verifies wipefs, blockdev, partprobe, udevadm - CONF_FILE sourcing now validates ownership and mode - Fedora install instructions: added grub2-tools, grub2-common - Arch install instructions: replaced non-existent pcboot with efibootmgr - Cargo.toml repository URL corrected to dcosnet/BootPrep (renamed to dcosnet/DriveStage in v0.4.0) - Rust list_payloads refactored to table-driven approach - Rust PayloadKind now derives Copy, PartialEq, Eq ### Fixed - LICENSE typo "grantsofar" → "granted, free of charge" - GRUB --checkpoint=.100 → --checkpoint=100 --checkpoint-action=dot - Cargo.toml placeholder repo URL - Missing test_distro_detection.sh (was referenced in README but didn't exist) ### Security - guard_root_disk now detects LVM/LUKS/mdadm-backed root filesystems - CONF_FILE now requires root ownership and mode 0644 or stricter - Sudo password wrapped in Zeroizing (zeroized on drop) ## [0.1.0] - 2026-08-14 ### Added - Initial release - Single-file bash engine (bootprep.sh at the time; renamed to blkstage.sh in v0.4.0) with 6 subcommands: setup, deploy, scan, list, shell, clean - GPT partition layout: ESP (FAT32) + BIOS Boot (1MB) + Payloads (ext4) - Dual-target GRUB2 install (x86_64-efi + i386-pc) - Boot-time auto-scan grub.cfg with 30+ distro patterns - Rust + Iced GUI companion app (experimental) - Dark tech utility theme - README.md, QUICKSTART.md, BLOG.md, LICENSE