v0.4.0: bump version, changelog, fuzz target for backup round-trip

This commit is contained in:
2026-06-03 00:41:01 +02:00
parent 426d7dad01
commit 4f03aa0af8
146 changed files with 231 additions and 10 deletions
+25
View File
@@ -4,6 +4,31 @@ All notable changes to NotAlterra are documented in this file.
---
## [v0.4.0] — 2026-06-03
### Added
- **`--help` / `-h` flag** — displays usage information
- **tar.gz backup format** — one archive per backup event, all slots in one
file. Standard `tar -xzf` recovers data without the tool (no vendor lock-in).
Safeguards: atomic write (`.tmp` → rename), per-file SHA256 manifest,
per-entry restore without full decompress.
- **Migration path** — old `NotAlterra_Backups/` directory-tree backups are
automatically detected and imported into the new tar.gz format
- **Bus factor mitigation** — documented in GOVERNANCE.md: emergency signing
key stored with a non-technical trusted person, revocable if compromised
### Changed
- **File layout** — backups stored in `backups/saves/` (tar.gz),
`backups/config/` (.ini archives), logs in `logs/transaction.log`
- **Stale `config.ini` removed** on first launch from prior versions
- **Dependencies** — added `tar` + `flate2` (pure Rust, +~150KB binary)
### Testing
- 6 migration unit tests (basic, empty, nonexistent, integrity, filtering, idempotency)
- Full round-trip integration tests for tar.gz backup/restore
- Fuzz target for backup round-trip (10s: 11,717 runs, zero crashes)
- File permissions fixed in tar headers (`0o644` instead of `0o000`)
## [v0.3.2] — 2026-06-02
### Added
Generated
+1 -1
View File
@@ -540,7 +540,7 @@ dependencies = [
[[package]]
name = "notalterra"
version = "0.3.2"
version = "0.4.0"
dependencies = [
"anyhow",
"chrono",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "notalterra"
version = "0.3.2"
version = "0.4.0"
edition = "2021"
authors = ["NotAlterra"]
license = "MIT"
+9 -5
View File
@@ -4,11 +4,15 @@ Cross-platform terminal application. No admin permissions or network access req
Pre-compiled binaries — no installation, no dependencies. Just download,
extract, and run.
### What's new in v0.3.2
### What's new in v0.4.0
`config.ini` removed entirely — no paths written to disk
Save folder is session-only, entered via `Set save folder`
Disclaimer tracked via 0-byte sentinel file (`NotAlterra_LICENSE_ACCEPTED`)
Lightweight startup check for common save paths (no profile/drive scans)
tar.gz backup format — one archive per backup event, standard `tar -xzf` recovers data without the tool
File restructure: `backups/saves/`, `backups/config/`, `logs/`
Automatic migration from old `NotAlterra_Backups/` directory-tree format
`--help` / `-h` flag
• Stale `config.ini` auto-removed from prior versions
• Bus factor mitigation plan documented in GOVERNANCE.md
• 6 migration tests, full round-trip tar.gz integration tests
`tar` + `flate2` dependencies added (pure Rust, ~150KB increase)
_Builds: Linux (amd64) • Windows x64_
+96 -3
View File
@@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "adler2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
version = "1.1.4"
@@ -122,6 +128,15 @@ version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "crc32fast"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossterm"
version = "0.28.1"
@@ -132,7 +147,7 @@ dependencies = [
"crossterm_winapi",
"mio",
"parking_lot",
"rustix",
"rustix 0.38.44",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -224,12 +239,32 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "filetime"
version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759"
dependencies = [
"cfg-if",
"libc",
]
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
[[package]]
name = "flate2"
version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "foldhash"
version = "0.1.5"
@@ -420,6 +455,12 @@ version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "linux-raw-sys"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]]
name = "lock_api"
version = "0.4.14"
@@ -456,6 +497,16 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
"simd-adler32",
]
[[package]]
name = "mio"
version = "1.2.1"
@@ -480,15 +531,17 @@ dependencies = [
[[package]]
name = "notalterra"
version = "0.2.3"
version = "0.4.0"
dependencies = [
"anyhow",
"chrono",
"crossterm",
"dirs",
"flate2",
"nom",
"ratatui",
"regex",
"tar",
"unicode-width 0.2.0",
]
@@ -659,10 +712,23 @@ dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"linux-raw-sys 0.4.15",
"windows-sys 0.59.0",
]
[[package]]
name = "rustix"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys 0.12.1",
"windows-sys 0.61.2",
]
[[package]]
name = "rustversion"
version = "1.0.22"
@@ -718,6 +784,12 @@ dependencies = [
"libc",
]
[[package]]
name = "simd-adler32"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
[[package]]
name = "slab"
version = "0.4.12"
@@ -775,6 +847,17 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "tar"
version = "0.4.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840"
dependencies = [
"filetime",
"libc",
"xattr",
]
[[package]]
name = "thiserror"
version = "1.0.69"
@@ -1124,3 +1207,13 @@ name = "wit-bindgen"
version = "0.57.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
[[package]]
name = "xattr"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
dependencies = [
"libc",
"rustix 1.1.4",
]
+7
View File
@@ -26,3 +26,10 @@ path = "fuzz_targets/full_metadata.rs"
test = false
doc = false
bench = false
[[bin]]
name = "backup_roundtrip"
path = "fuzz_targets/backup_roundtrip.rs"
test = false
doc = false
bench = false
@@ -0,0 +1 @@

@@ -0,0 +1 @@
;
@@ -0,0 +1 @@
YYYYo#:*:
@@ -0,0 +1 @@
RRRRRRRRR.RRRJRR4
@@ -0,0 +1 @@
###
@@ -0,0 +1 @@
^クオG#
@@ -0,0 +1 @@
;
@@ -0,0 +1 @@
@@ -0,0 +1 @@
(,.,.
@@ -0,0 +1 @@
##
@@ -0,0 +1 @@
;;
@@ -0,0 +1 @@
:*:
@@ -0,0 +1 @@

@@ -0,0 +1 @@
qqqqqqqqqq
@@ -0,0 +1 @@
;O##GWD
@@ -0,0 +1 @@
*
@@ -0,0 +1 @@
髜ィ'

Some files were not shown because too many files have changed in this diff Show More