Releases: LRGEX/Compress
Releases · LRGEX/Compress
Release list
v1.7.1
🔧 Fixes
- AES-256 encrypted ZIP detection: 7-Zip-created encrypted ZIPs now correctly
detected via CompressionMethod::AES + PasswordRequired error (the zip crate's
encrypted()flag misses AES-256). Password prompt appears for these archives. - Encrypted ZIP extraction: pre-scan loop now uses password when summing file
sizes (was hitting encrypted entries first and erroring before extraction started). - Progress watchdog: corrupt archives that cause the decoder to stall now show
"Archive appears corrupt" after 15s instead of hanging forever. - RAR4 support: confirmed working (tested with real RAR4 archive from unrar.rs test data).
- Compiler warnings: reduced from 27 to 15 via cargo fix.
v1.7.0
✨ New Features
- Integrity checksum:
.zgxarchives now include zstd XXHash64 checksum verification on extract.
Detects storage corruption, bad transfers, and bit rot before you lose data. Zero measurable
speed cost (~6ms per 256MB — within run-to-run noise). - RAR extraction rewritten in pure Rust: replaces the vendored C unrar library with
unrar-rs(pure Rust, no C dependencies). Adds:- Symbolic link preservation (asks admin once, recreates links exactly)
- mtime + ctime restore on extracted files
- Windows attributes restore (ReadOnly, Hidden, etc.)
- Instant mid-file cancel (custom Writer aborts on cancel flag)
- Multi-volume support (part1.rar, part2.rar, ...)
- 7z metadata restore: extracted 7z files now preserve mtime, ctime (when carried),
and Windows attributes. - 7z symlink support: symlinks stored as reparse points in .7z archives are now
detected and recreated (with path-traversal guard for security). - Instant feedback on click: the progress window now shows an animated sweep the
moment you click Compress or Extract — no more frozen 0% bar while the engine spins up. - Encrypted archive support: password-protected RAR, 7z, and ZIP archives now
prompt for a password. GUI shows a masked password dialog with auto-focus.
CLI:-p <password>flag works in any position.
Example:lrgex-compress -x -p secret archive.rar
🔧 Fixes
- 7z overwrite+cancel data loss (critical): extracting a .7z over an existing file,
then cancelling, no longer destroys the user's original file. All 7z extraction now
uses temp-then-rename (same safe pattern as .zgx and .zip). - ctime clobber on every extract (critical): every extracted file was getting
creation time set to January 1, 1970. The bug was inapply_times_handle—
secs_to_filetime(0)is NOT a zero FILETIME (it's 1601+epoch_offset = 1970-01-01).
The "NULL if zero" guard never fired. Fixed: branch on the INPUT value, not the
converted FILETIME. - 7z mtime lost: 7z extraction was giving every file NOW() as last-modified time.
Now readsentry.last_modified_date()from sevenz-rust2 and restores it. - Checksum failure silently swallowed:
include_checksum(true)was discarding
the Result withlet _ =. Now propagates via.expect()— a checksum failure
surfaces as an error instead of silently shipping without integrity. - Test harness pipe deadlock: integration tests could hang when the spawned exe
produced >64KB of stdout (pipe buffer fill). Fixed withStdio::null().
🧪 Quality
- 49 automated tests covering every format, every metadata field, cancel,
multi-volume, crash-safety, and overwrite+cancel data-loss scenarios.- No
#[ignore]d tests hiding gaps — every test runs automatically. - RAR + 7z tests auto-detect external tools (WinRAR / 7-Zip) and run when present.
- No
- Vendored C unrar crate removed (210KB of C source). RAR extraction is 100% pure Rust.
- License: switched from MIT to GPL-3.0-or-later (unrar-rs is GPL-3.0 + UnRAR restriction).
⚠️ Known Limitations
- 7z symlinks: requires Administrator or Developer Mode to create symlinks on Windows.
Without elevation, symlinks in .7z archives are skipped silently. - zip ctime: the ZIP format has no creation time field — cannot be preserved.
- 7z ctime: 7-Zip does not store creation time by default (only with
-mtc=on).
Restored when present, absent when not. - RAR4: unrar-rs claims support but could not be tested (WinRAR 7.23 creates RAR5 only).
- Encrypted archives: password-protected RAR, 7z, and ZIP are supported via GUI
prompt or-p <password>CLI flag. However, the GUI window stays open briefly after
extraction completes (auto-close delay). Scripted/headless use with-pblocks until
the window is closed manually.
v1.6.0
✨ New Features
- 7z extraction:
.7zarchives now supported (LZMA2, pure Rust)- Single-volume
.7z— instant extraction with progress - Multi-volume
.7z.001/.002/...— right-click.001or.7zto extract - Per-chunk cancel (stops mid-file, not just between files)
- Overwrite confirmation (header-only read, no decompression needed)
- Path-traversal guard (zip-slip protection)
- Right-click
.7zand.001→ LRGEX → Extract
- Single-volume
🔧 Fixes
- Instant RAR cancel: Cancel now stops RAR extraction mid-file (within 100ms)
via UCM_PROCESSDATA callback abort — no more waiting for the current file to finish - Clean archive names:
video.mp4→video.zgx(extension stripped)- Folders unchanged (
myfolder→myfolder.zgx) - Dotfiles preserved (
.git→.git.zgx)
- Folders unchanged (
v1.5.3
✨ New Features
- Extract Cancel: Cancel button now works during extraction (all formats)
- .zgx/.zip: cancel mid-file (byte-level)
- .rar: cancel between files (C library limitation)
- Split: cancel during SHA256 verification
- All formats: shows "Cancelled" (amber) + exits cleanly
- Split Compress: multi-volume .zgx archives
- Right-click → LRGEX → Split Compress
- Per-part SHA256 trailers for integrity
- Missing parts detected upfront with clear message
🔧 Fixes
- Auto-update elevation: detects admin/UAC-disabled correctly (is_process_elevated)
- Update throttle: once per day (prevents 20s hangs on every launch)
- Declined update: 30-day expiry (re-asks after 30 days)
- GUI failure state: shows actual error message + Close button
- Exit code: non-zero on failure/cancel
- Progress bar stops animating on Failed
- Version badge moved to top-right (no overlap with buttons)
- Window fixed size (cannot resize)
- Friendly error messages for update failures
- /SILENT shows progress during update
v1.5.2
🔧 Fixes
- Auto-update now works for Program Files installs with UAC disabled (detects elevation, launches directly instead of failing on "runas")
- Double-click exe shows help instead of silent exit
- PATH changes broadcast immediately (no reboot needed)
- Friendly error messages for update failures
- Removed unnecessary "Signature verified" dialog
- Installer shows progress during update (/SILENT instead of /VERYSILENT)
- WM_SETTINGCHANGE broadcast for PATH
- Choco validExitCodes includes 3010
- Fixed stale doc comments in update.rs
v1.5.1
✨ New Feature: Split Compress
Right-click any folder → LRGEX → Split Compress
- Choose segment size in MB (quick picks: 50, 100, 700, 4G)
- Produces
MyFolder.part001.zgx,.part002.zgx, etc. - Each part has a SHA256 trailer for integrity verification
- Extract ANY part → auto-detects and extracts the full archive
- Corrupt part → clear error naming which part to redownload
- CLI:
--split [--size <MB>] <folder>
🔧 Fixes
- Auto-update fix: write-lock released before launching installer (fixes "process cannot access the file" on some systems)
- Overwrite confirmation prompts added for both compression and extraction
- Partial files cleaned up if extraction fails or is cancelled
- Symlink targets validated inside archives before extraction
- Read-only files no longer block overwrite (atomic rename clears the attribute)
- Extraction continues past locked files instead of aborting
- Multi-volume RAR crash fixed (unrar callback)
- Crash handler added (VEH writes backtrace to crash-log.txt — no more silent crashes)
--helpflag added- "Don't ask again" for declined updates (per-version skip)
- Temp files use unique names to prevent collisions between same-name files
- Archive bit and other Windows attributes preserved exactly on round-trip
🔒 Security
- Auto-update works for all install types (per-user, Program Files, choco, GitHub)
- Truncation check allows 64KB slack for zstd/tar trailing buffers
- Part discovery uses globbing (survives user renaming of parts)
- Contiguity check: missing middle part detected before extraction
- MAX_PARTS lowered to 1000 (bounds resource usage)
v1.4.4
v1.4.3
v1.4.2
🔧 Machine-Wide Install Support (Chocolatey)
- Installer now uses
{autopf}+HKA(Inno Setup dual-mode). Installs per-user
(no admin) OR machine-wide (admin/choco) from the SAME binary. - Chocolatey passes
/ALLUSERSfor machine-wide install to%ProgramFiles%. - Portable download runs per-user to
%LOCALAPPDATA%as before. - All registry keys use
HKA→ HKLM when admin, HKCU when per-user. - Added
chocolateyuninstall.ps1that calls the Inno uninstaller. - Added
softwareNameto chocolateyinstall.ps1 for upgrade/uninstall detection.
v1.4.1
🛡️ Data Integrity — Full Metadata Preservation
LRGEX Compress now preserves your files exactly across a compress → extract round-trip.
Whatever goes into the archive comes out identical — no more "every extracted file shows today's date."
- LastWriteTime (mtime) preserved on every file and folder — sort-by-date, build systems, sync tools, and incremental backups all keep working correctly.
- CreationTime (ctime) preserved — the original creation date is restored, not lost.
- Windows attributes preserved — Hidden, Read-only, System, and Archive flags survive the round-trip. A hidden file extracts hidden; a read-only file extracts read-only.
- Symbolic links / junctions preserved — links recreate as links. On Windows, creating a link needs Administrator or Developer Mode; LRGEX asks once ("allow admin?") and, if yes, re-launches the extraction elevated to recreate every link exactly. If you decline, links degrade gracefully (never aborts the whole extraction).
- Directory timestamps restored in a final pass — so writing children into a folder doesn't overwrite the folder's original mtime.
NTFS alternate data streams are not supported (rarely used; not planned).
⚡ Performance — Extract & Compress Wins
- Metadata sidecar (
.lrgex/meta.bin): one small packed blob at the front of the
archive replaces 11k+ per-entry metadata headers on big folders. Both compress and
extract handle roughly half as many tar entries now. Old v1.4.0 archives still read
correctly via the per-entry fallback. - One-syscall metadata restore (
SetFileInformationByHandle): mtime + ctime +
attributes set in a single call on the already-open file handle — no per-file re-open. - Direct 4 MB chunked writes on large-file extract (no redundant
BufWritercopy). - Cache-served metadata on compress walk (
DirEntry::metadata()instead of a fresh
CreateFileper file) — saves thousands of syscalls on big folders. - Removed the redundant 4 MB
BufWriteron compress output — zstd already emits
good-sized blocks; the buffer was a pure memcpy of every compressed byte. - Tuned zstd multithreading —
JobSize(16MB)+OverlapSizeLog(0)at level 1,
fewer thread handoffs. - Dedicated oversubscribed write pool (3× core count) for extraction writes —
correct sizing for workers that block inCreateFileand Defender scans.
🐞 Fixes
- Multi-select coordinator hardened: handles
WAIT_ABANDONED(previous instance
crashed holding the mutex) and stale coordinator-PID lockfiles — a second rapid launch
can no longer silently no-op. - Round-trip verified lossless: mtime/ctime/Hidden/ReadOnly/System, Unicode names,
deeply nested paths, and a 3000-file stress batch (SHA256-checked).
🔒 Security Hardening
- Signed manifest (detached
latest.json.sig): the auto-update manifest is now
cryptographically signed with Ed25519, preventing a compromised server from injecting
a fake version or download URL. - Download size cap (100 MB): the updater rejects files exceeding 100 MB, preventing
memory exhaustion from a poisoned manifest pointing at a huge file. - Update-channel logging: failed update checks now write to
update.login the
install folder, so silent update-channel failures are observable. - GitHub release asset verification:
deploy.ps1now size-verifies the GitHub
release asset via the API, not just the exit code. - Path-length guard: right-clicking a file with a path longer than 247 characters
shows a clear error instead of a confusing "not found". - Slint attribution: added "Made with Slint" badge (Slint Royalty-free License §2).