Skip to content

Latest commit

 

History

History
420 lines (305 loc) · 18.8 KB

File metadata and controls

420 lines (305 loc) · 18.8 KB

Patch Notes - Version 1.7.1 - Current

🔧 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.

Patch Notes - Version 1.7.0

✨ New Features

  • Integrity checksum: .zgx archives 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 in apply_times_handlesecs_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 reads entry.last_modified_date() from sevenz-rust2 and restores it.
  • Checksum failure silently swallowed: include_checksum(true) was discarding the Result with let _ =. 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 with Stdio::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.
  • 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 -p blocks until the window is closed manually.

Patch Notes - Version 1.6.0

✨ New Features

  • 7z extraction: .7z archives now supported (LZMA2, pure Rust)
    • Single-volume .7z — instant extraction with progress
    • Multi-volume .7z.001/.002/... — right-click .001 or .7z to 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 .7z and .001 → LRGEX → Extract

🔧 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.mp4video.zgx (extension stripped)
    • Folders unchanged (myfoldermyfolder.zgx)
    • Dotfiles preserved (.git.git.zgx)

Patch Notes - Version 1.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

Patch Notes - Version 1.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

Patch Notes - Version 1.5.1

🚀 New Features

  • 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
  • Truncation check now 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)
  • Overwrite confirmation prompts added for both compression and extraction
  • Partial files cleaned up if extraction fails or is cancelled
  • Symlink targets inside archives validated before extraction
  • Auto-update now works for all install types
  • Read-only files no longer block overwrite
  • Extraction continues past locked files
  • Multi-volume RAR crash fixed (unrar callback)
  • Crash handler added (VEH writes backtrace to crash-log.txt)
  • --help flag 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

Patch Notes - Version 1.4.4

🔧 Fixes

  • Software renderer only (removes femtovg/OpenGL) — fixes no-UI on VMs without GPU
  • Uninstall icon + installer version info (cosmetic)

Patch Notes - Version 1.4.3

  • 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 /ALLUSERS for 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.ps1 that calls the Inno uninstaller.
  • Added softwareName to chocolateyinstall.ps1 for upgrade/uninstall detection.

Patch Notes - Version 1.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 BufWriter copy).
  • Cache-served metadata on compress walk (DirEntry::metadata() instead of a fresh CreateFile per file) — saves thousands of syscalls on big folders.
  • Removed the redundant 4 MB BufWriter on compress output — zstd already emits good-sized blocks; the buffer was a pure memcpy of every compressed byte.
  • Tuned zstd multithreadingJobSize(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 in CreateFile and 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.log in the install folder, so silent update-channel failures are observable.
  • GitHub release asset verification: deploy.ps1 now 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).

Patch Notes - Version 1.4.0

🚀 New Features

  • Extract Here: right-click .zgx/.zip/.rar → LRGEX → Extract Here (extracts to current folder, no subfolder)

🔧 Improvements & Changes

  • Removed AppliesTo from installer (was hiding the right-click menu on all files)
  • Added Extract Here to installer .iss for all three archive extensions

🐞 Bug Fixes

  • Fixed: right-click menu disappeared on all files due to malformed AppliesTo value

⚠️ Known Issues

  • N/A

Patch Notes - Version 1.2.1

🚀 New Features

  • N/A

🔧 Improvements & Changes

  • N/A

🐞 Bug Fixes

  • N/A

⚠️ Known Issues

  • N/A

Patch Notes - Version 1.2.0

🚀 New Features

  • Installer-based auto-update: updates now download and run the full installer (not just the bare exe), ensuring registry entries, icons, and file associations are always updated correctly.

🔧 Improvements & Changes

  • Installer filename now includes full version number (e.g. v1.2.0, not v1.2).
  • CloseApplications=force and RestartApplications=no added to installer for silent updates.
  • App silently exits when launched with no arguments (fixes post-update restart error).

🐞 Bug Fixes

  • N/A

⚠️ Known Issues

  • N/A

Patch Notes - Version 1.1.0

🚀 New Features

  • N/A

🔧 Improvements & Changes

  • N/A

🐞 Bug Fixes

  • N/A

⚠️ Known Issues

  • N/A

Patch Notes - Version 1.0.0

🚀 New Features

  • Multi-format extraction: .zip and .rar extraction added alongside .zgx. Magic-byte detection (zstd/zip/rar) with extension fallback.
  • Real .rar progress: vendored unrar 0.5.8 with UCM_PROCESSDATA counter patch for byte-level extraction progress.
  • Extract Here: right-click .zgx/.zip/.rar → Extract Here dumps contents into the current folder.
  • Multi-select compress: selecting multiple files/folders and right-clicking Compress produces ONE .zgx containing all items.
  • Signed auto-updates: Ed25519 signature verification, deferred until after operation completes.
  • 8-byte uncompressed total header in .zgx format for accurate extraction progress.
  • Batch-parallel extraction: rayon batch writer (2048 entries/64MB) with directory cache for many-small-files workloads.
  • Version badge in lower right of progress window.
  • Shimmer animation on progress bar fill.
  • Auto-close 2s after successful operation.
  • Cancel kills process immediately — no orphan threads.
  • Window icon from product logo.
  • op-label/op-detail split: action word in white bold, filename in silver.

🔧 Improvements & Changes

  • ZIP backend switched to deflate-flate2-zlib-ng (C-accelerated, 4× faster decompression).
  • [profile.dev.package."*"] opt-level = 3 — dependencies compiled at -O3 even in debug builds.
  • File preallocation (set_len) for entries >1MB during extraction.
  • BufReader 256KB between zstd decoder and tar (reduced from 4MB to avoid cache eviction).
  • Removed redundant BufReader before zstd decoder (it reads 128KB chunks natively).
  • Folder name stripping: x.md folder → x.zgx (not x.md.zgx).
  • Stable install path for right-click verbs (survives exe rebuilds).

🐞 Bug Fixes

  • Empty directories now preserved through compress → extract round-trip.
  • Atomic writes: name.zgx.partname.zgx only on full success.
  • Cancel during compress deletes the partial archive.
  • Zip-slip protection (path traversal guard for both .zip and .zgx extraction).
  • Failed extraction no longer hangs the UI (shows "Failed" instead of freezing).

⚠️ Known Issues

  • Many-small-files extraction is limited by Windows Defender real-time scanning (~5-15 MB/s). This is a documented Windows limitation, not a code issue.

Patch Notes - Version 0.1.0

🚀 New Features

  • Right-click compression and extraction: one LRGEX Explorer entry that opens a hover submenu (Compress on folders/files, Extract on .zgx archives). Per-user, HKCU only, no UAC.
  • .zgx archive format: Double-clicking a .zgx extracts it.
  • Progress window: colored progress bar, live percent, MB/s, and ETA. A 500 ms heartbeat + animated spinner keep it from ever looking frozen, even on a cold cache.
  • Byte-based progress: percentage is always bytes_done / bytes_total (never file-count), so a single huge file does not sit at a misleading percent.
  • Multi-threaded compression: parallel reads across all CPU cores, designed for multi-gigabyte folders.
  • Atomic archive writes: compress writes to <name>.zgx.part and atomically renames to <name>.zgx only on full success, so an interrupted or crashed compress can never leave a complete-looking partial archive.
  • Empty-directory preservation: directory entries are archived before their contents, so extraction restores the exact source tree, including empty folders.
  • Cancel cleans up: aborting a compress releases the .part file and deletes it — no orphaned half-files are left behind.
  • Skip-with-warning on locked files: a single unreadable file does not fail a multi-GB job. The archive still publishes, and a <name>.zgx.skipped.txt sidecar lists anything that could not be read (auto-deleted on the next clean run).
  • Signed auto-updates: Ed25519 signature verification on every update. The version check runs silently on launch; the download + verify + swap flow runs only after the current job finishes, so it can never interrupt or freeze a compress/extract in progress.
  • Per-user installer: Inno Setup, PrivilegesRequired=lowest (no UAC prompt). Registers the right-click cascade and the .zgx file association, and removes every registry entry it created on uninstall.
  • Self-contained executable: a single ~14 MB .exe, zero runtime dependencies (static CRT, software renderer) — runs anywhere, including VMs with no GPU.

🔧 Improvements & Changes

  • N/A

🐞 Bug Fixes

  • N/A

⚠️ Known Issues

  • N/A

Developed by LRGEX