Skip to content

Releases: KarpelesLab/fstool

v0.4.1

22 May 12:11
a321141

Choose a tag to compare

Added

  • (fuse) backend-agnostic adapter — mount any Filesystem via FUSE
  • (apfs) rename, unlink (hardlink-aware), and link()
  • (apfs) chmod / chown / set_times mutation API
  • shared-access wrapper for cross-thread Ext usage (Phase E)
  • fuzz harness + crash-injection block device (Phase D)
  • (ext) inline_data — store small files in the inode
  • FUSE adapter — mount ext{2,3,4} images as a userspace filesystem
  • (ext) post-build mutation API (chmod, chown, set_times, truncate, rename)
  • (ext) multi-descriptor JBD2 transactions + fix dx_node header
  • (ext) two-level HTree (dx_node intermediates)
  • (repack) replay pending JBD2 journal on the source before reading
  • (repack) preserve sparse files in ext repack
  • (ext) preserve hard links across repack
  • (ext) HTree (DIR_INDEX) write-side support for ext4
  • (ext) multi-block directories, depth-1 extents, repack progress

Fixed

  • (clippy) clean up 11 lints exposed by --all-features build
  • (concurrent) drop unused FileSource import from test module
  • (repack) wire progress sink through tar-output paths

Other

  • (fuse) kernel round-trip test via spawn_mount
  • fix 7 broken intra-doc links exposed by --all-features doc build
  • install libfuse3-dev + pkg-config on Linux for clippy --all-features
  • cargo fmt across recent landings

v0.4.0

21 May 04:21
1292405

Choose a tag to compare

Added

  • (cli) unify create + add -O / [filesystem.options] for FS knobs

Fixed

  • (spec) mark FilesystemSpec #[non_exhaustive]

Other

  • (readme) refresh FS matrix + limitations for current state

v0.3.1

21 May 03:10
cb3f2c3

Choose a tag to compare

Added

  • (ext) real JBD2 transactions for open_file_rw (Path A)
  • (apfs) open_file_rw on flushed images via fresh checkpoint COW
  • (xfs) leaf-form xattrs (read+write) + remove_xattr
  • (hfs+) decmpfs read support (types 3 + 4 zlib)
  • (ntfs) real $LogFile LFS records (Path A) for open_file_rw
  • (dmg) encrcdsa v2 encrypted DMG read support

Fixed

  • (hfs+) keep HfsPlusFileReader as struct to preserve public API

Other

  • drop intra-doc links to private items in apfs

v0.3.0

20 May 23:28
4f1fb94

Choose a tag to compare

Added

  • (hfs+) route flush metadata writes through journal (Path A)
  • (ntfs) multi-SD $Secure (User + System); defer $LogFile Path A
  • (xfs) multi-level B-tree dirs + Path A log transactions
  • (ext4) open_file_rw on depth-1 extent trees
  • (apfs) populate IP ring, SFQ free-queues, and main-device alloc zone
  • (dmg) implement ADC, bzip2, LZFSE, and LZMA chunk codecs
  • (hfs+) real journal transactions (Path A) for open_file_rw
  • (ntfs) populate $Secure ($SDS/$SDH/$SII) + sort root $I30
  • (xfs) single-level B-tree directory reader (di_format=BTREE)
  • (ext4) open_file_rw on depth-0 inline extent trees
  • (dmg) chunk decoder — zero / raw / zlib over UDIF v4
  • (apfs) emit a real spaceman bitmap + checkpoint map
  • (fs) implement open_file_ro for ext/FAT/exFAT/F2FS/HFS+/NTFS/XFS
  • (apfs) implement Filesystem::open_file_ro
  • (squashfs) implement Filesystem::open_file_ro
  • (grf) implement Filesystem::open_file_ro
  • (iso9660) implement Filesystem::open_file_ro for random-access reads
  • (fs) add Filesystem::open_file_ro + FileReadHandle
  • (xfs) implement Filesystem::open_file_rw via clean-unmount bypass
  • (ntfs) implement Filesystem::open_file_rw for in-place edits
  • (ext3/4) accept clean-journal images in open_file_rw
  • (hfs+) implement Filesystem::open_file_rw for in-place edits
  • (f2fs) implement Filesystem::open_file_rw for in-place edits
  • (ext2) implement Filesystem::open_file_rw for in-place edits
  • (fat) implement Filesystem::open_file_rw for in-place edits
  • (exfat) implement Filesystem::open_file_rw for in-place edits
  • (fs) add Filesystem::open_file_rw + FileHandle for in-place edits
  • (apfs) wire library writer through Filesystem trait
  • (hfs+) make open() return a writable handle for add/rm round-trips
  • (ntfs) index system files (records 0..=15) in root $I30 on format
  • (exfat) wire writer into the Filesystem trait
  • (grf) GRF (Gravity Ragnarok File) read + write + add/rm
  • (fs) add MutationCapability::WholeFileOnly for future formats
  • (error) typed Error::RepackOnly for sequential-by-design FSes

Fixed

  • (hfs+) clamp VH nextAllocation < totalBlocks for fsck.hfsplus
  • (exfat) drop unused FileHandle import in open_file_rw tests
  • (iso9660) emit SUSP SP marker on root's "." dir record
  • (repack) Source::detect mishandled Windows drive letters

Other

  • replace links to private items with plain backticks
  • cargo fmt across drifted files
  • (ext/flex_bg) tighten leader/follower mapping check + e2fsck-clean
  • resume writes from on-disk AGF/AGI/INOBT/BNO after reopen
  • (hfs+) lock down create_hardlink link-inode invariant
  • (xfs/dir) cover dahashname, leaf sort, and i8 shortform decode
  • (squashfs) cover fragment table reader
  • (ext) end-to-end xattr round-trip through set_xattrs + read_xattrs
  • fix broken intra-doc links from public items into pub(crate)
  • rustfmt across the tree
  • (error) split Streaming vs Immutable instead of one RepackOnly
  • collapse build-plan walkers through Filesystem::read_symlink

v0.2.0

20 May 08:41
8d7ca42

Choose a tag to compare

Added

  • (inspect) variant-agnostic public surface — inspect::open + summary
  • (fs) Filesystem::supports_mutation() gates add/rm cleanly
  • (cli) repack accepts positional sources — repack a b … out
  • (repack) layered sources with tar-OCI + overlayfs whiteouts
  • (iso9660) writer + Filesystem trait + repack-to-ISO wiring
  • (iso9660) read support — PVD + Joliet + Rock Ridge + El Torito
  • (cli,docs) wire repack to write XFS/HFS+/NTFS/F2FS/SquashFS via the trait
  • (fs) wire all writable FSes (XFS/HFS+/NTFS/F2FS/SquashFS/FAT32) through one trait

Other

  • collapse sum_*_file_bytes into Filesystem::total_file_bytes
  • (readme) cover ISO 9660 + layered merge with whiteouts

v0.1.0

20 May 00:52

Choose a tag to compare

Added

  • (block) scaffold Apple DMG (UDIF v4) container support
  • (tar) random-access index + hardlink materialization + tar.→ext repack
  • (squashfs) hardlinks + device nodes + multi-fragment + ext-dir promotion
  • (f2fs) hard links + triple-indirect nodes + multi-block dentry spill
  • (ntfs) writer — format + create_file/dir/symlink + flush
  • (apfs) multi-leaf writer + embedded xattrs (read + write)
  • (hfs+) extents-overflow spill on write + hard links + journal stub
  • (xfs) journal stub + multi-AG writes + remove + shortform xattrs
  • (ext) BuildPlan auto-flex_bg + INCOMPAT_64BIT writer + sparse_super2
  • (tar) TarStreamReader/Writer + CLI streaming integration (no tempfile)
  • (squashfs) writer + xattr / id-table / export-table coverage
  • (f2fs) writer (format, create_file/dir/symlink/device, remove, flush)
  • (ntfs) fill read-side holes (attr-list, $Secure, $UpCase, LZNT1)
  • (apfs) multi-volume + snapshots (read) + minimal writer
  • (hfs+) writer (format, create_dir/file/symlink, remove, flush)
  • (xfs) B+tree directories + write support (format, add_file/dir/symlink/device)
  • (ext) flex_bg writer (opt-in via FormatOpts)
  • (compression) codec features for squashfs reads and tar I/O

Fixed

  • (hfs+) drop intra-doc link from public to private fold_case
  • (hfs+) make fsck.hfsplus accept writer output end-to-end
  • (hfs+) mark Private Data dir invisible in Finder (frFlags |= kIsInvisible)
  • (hfs+) set HasLinkChain / HasChildLink flags on hardlink records
  • (hfs+) iNode files need fileType='iNod' / creator='hfs+' + link count
  • (hfs+) catalog case-folding compare ignores NUL code units
  • (hfs+) map record fills the rest of the header node
  • (hfs+) empty B-trees need a header AND one empty leaf node
  • (hfs+) B-tree forks need clumpSize ≥ nodeSize
  • (f2fs) populate valid_node/inode/free_segment counts in CP head
  • (f2fs) SIT valid_map is MSB-first, not LSB-first
  • (f2fs) I_ADDR_OFFSET must be 0x168 (kernel spec), not 0xD0
  • (f2fs) inline-dentry INLINE_RESERVED_SIZE is 7 bytes, not 1
  • (f2fs) inline payload starts at i_addr[1], not i_addr[0]
  • (f2fs) emit "." and ".." dentries + correct i_blocks
  • (f2fs) real curseg layout + SIT type bits + node_footer
  • (f2fs) NAT entries for node_ino / meta_ino + drop bogus NAT/SIT/SSA CRC
  • (f2fs) write 8-block CP pack + drop bogus reserved-nid NAT entries
  • (f2fs) SIT segment count must be even + derive bitmap size from geometry
  • (f2fs) non-zero rsvd / overprov segments + correct user_block_count
  • (f2fs) write CP footer at end of pack + correct CP flag values
  • (f2fs) use real crc32_le(F2FS_SUPER_MAGIC, …) + correct CP field offsets
  • (f2fs) segment0_blkaddr = cp_blkaddr + ignore reverse-read test
  • (f2fs,ci) correct f2fs SB field offsets + drop deprecated brew ntfs-3g

Other

  • rustfmt insert_journal_entry signature
  • (readme) update FS support table for current writer coverage
  • Revert "fix(hfs+): catalog case-folding compare ignores NUL code units"
  • (hfs+) diagnostic also tries mkfs.hfsplus (hfsprogs spelling)
  • (hfs+) add diagnostic test to dump mkfs vs fstool extents header
  • rustfmt write.rs after CP-pack restructure
  • (fs) native-tool external validation for exfat/xfs/hfs+/apfs/ntfs/f2fs/squashfs + codec fixes
  • (release-plz) fix release-binaries dispatch (tag schema + actions:write)
  • cargo fmt --all

v0.0.5

19 May 11:47
46e15f3

Choose a tag to compare

Added

  • (fs) fill out xfs/hfs+/apfs/ntfs/f2fs/squashfs read paths + exfat writer
  • (fs) xfs/exfat/hfs+/apfs read-only + ntfs/f2fs/squashfs scaffolds
  • (tar) tar as a read/write filesystem — ext↔tar / fat↔tar repack

Other

  • gate Unix-only integration tests for the Windows / macOS matrix
  • (release-plz) chain release-binaries via workflow_dispatch

v0.0.4

19 May 06:35
a6519ed

Choose a tag to compare

Added

  • (ext) xattr support — read inline + block, write block, preserve on repack
  • (cli) convert + repack — byte-copy and FS-aware resize
  • (block, cli) qcow2 write + create — Phase B
  • (block) qcow2 read path — Phase A
  • (cli) partition-aware target syntax — disk.img:N
  • (block, cli) real block-device support on Unix
  • (cli) fstool shell — interactive REPL over any image
  • (ext4) sparse_super on the write path
  • (fat32, cli) modify-in-place — add files, add dirs, remove entries
  • (fat32, cli) read-side parity — FAT32 reader + unified CLI dispatch

Fixed

  • (cli) repack as a direct FS-to-FS copy, no host tempdir

Other

  • release-binaries workflow — five archives per release

v0.0.3

19 May 04:08
6325890

Choose a tag to compare

Added

  • (fat32) write-path FAT32 filesystem + spec/CLI/CI integration
  • (ext) automatic sparse files — all-zero blocks become holes
  • (cli) fstool rm — remove a file / symlink / device / empty directory
  • (cli) fstool add — copy a host file or directory into an image
  • (ext4) full metadata_csum write path — ext4 emits checksummed images

Other

  • bring README up to date with phases 4-5 + ext4 features
  • metadata_csum foundation — csum module + superblock checksum

v0.0.2

19 May 00:42
9cfbc37

Choose a tag to compare

Added

  • (ext4) read INCOMPAT_64BIT images — 64-byte group descriptors
  • (spec) partitioned disk-image build + multi-group ext allocation
  • (spec) TOML image spec + fstool build (bare-filesystem mode)
  • (cli) add fstool subcommands — ext-build / ls / cat / info
  • (ext4) write extent-tree inodes (INCOMPAT_EXTENTS) + read them back

Other

  • lazy-stage parent inode + dir block on add_*, enabling modify-after-open
  • add release-plz workflow for automated releases
  • add CI / crates.io / docs.rs badges to README