vfstool_libChangelog
Changelog
Every release of vfstool_lib, newest first. A release marked unreleased is declared in mod.toml and published when its tag is pushed.
Releases
13 declared
-
2.0.0 stable
vfstool_lib is the Jess package org.dreamweave.vfs, written in Luau; the Rust crate continues on the rust branch at 1.0.0.
Breaking changes
- The library is the Jess package
org.dreamweave.vfs, module@vfs, installed with jess rather than Cargo. The Rust cratevfstool_libstays at 1.0.0 on crates.io and on this repository'srustbranch, and is no longer developed on main.
org.dreamweave.vfs-2.0.0.jpkVerify · sha256 66df02c8b706…a20018401
- Release
- 2.0.0 (stable)
- Size
- 121894 bytes
- SHA-256
- 66df02c8b706cc1a2579bb956521d4cfca970d4b9216a23028f51a6a20018401
- Commit
- 7050b6f37bd7
- Package
org.dreamweave.vfs- Content digest
- b501db857f2b619c32963763173330348ea57602f1e53303a487fa6025994fab
- Sources
- 1
Check it yourself:
sha256sum org.dreamweave.vfs-2.0.0.jpkmust print the digest above. - The library is the Jess package
-
1.0.0 stable
First stable release: the Luau binding is an l3i extension providing @dream/vfs, keys stay bytes end to end, and the top-level API is under semver.
Breaking changes
- The
luafeature makes the crate an l3i extension,lua::VfsExtension, providing the module@dream/vfs.lua::open,lua::registerandmluaare gone. - In Luau: key lists are sequence views and trees are streams (
:toTable()gives the old tables), indices are 1-based, sizes are integers, unknown option keys are errors, and paths are bytes. - Building with
luaneeds l3i's toolchain: clang, lld and cross-language thin LTO. - dream-path 1.0.
- The library writes nothing to standard output or error.
collapse_intoanddump_to_directoryreturn aMaterializationReport, the files written and each winner left out as aMaterializationSkip, instead of()and a count, andDirectoryDiffgainsunreadable, whatdiff_directory's walk could not read. In Luau,collapseIntoreturns the skipped files anddumpToDirectoryreturns them after the count.
Added
VFS::lenandVFS::is_empty, in constant time, andget_file_normalized,contains_normalizedandpaths_matching_bytesfor keys already normalized.VfsKeyInput::vfs_key_bytes, andVfsKeyInputfor[u8];VfsFile::path_bytes.- In Luau:
file:readInto(buffer, offset?),tree:count(),snapshot:len(), and a type for every function, method and view element in the plan's definitions. - File I/O in Luau:
file:size(), positionalfile:readAt(buffer, fileOffset, length?, bufferOffset?)through a memory map,file:readRange,file:readAllBuffer, andfile:open()giving aReaderwithread,readInto,seek,skip,tellandclose. - The
lua-writefeature: a write root on the VFS (writeRootoption,setWriteRoot),writeFile,openWritegiving aWriter,mkdir,removeandrename, behind thefilesystem.writeruntime capability; the root is kept canonical and refuses keys that pass through a symbolic link beneath it. - The
lua-hostfeature: ahosttable of host-path functions (readFile,readAt,writeFile,open,openWrite,stat,exists,list,mkdir,remove,rename,copy,canonicalize), behind thefilesystem.hostruntime capability. lua::VfsRequireNavigator, l3i'srequireover a VFS with.luaurcaliases and relative paths, andlua::TemplateCache, OpenMW's script template cache: one compiled template per module per VM, cloned per instance, invalidated explicitly. Thejitfeature forwards l3i's and reports each template's native code status.- Zip archives:
.jpkfiles are read as zip archives, and Zstandard entries are listed and decoded through a pure-Rust decoder.
Changed
- Looking up a key that is already normalized borrows it instead of allocating, and searches compare bytes.
- The sorted key list is built once per change to the VFS and shared by every
keys()call. lua::Vfsis shared andClone, andlua::VfsFileHandleis built withVfsFileHandle::new. dream_archive 1.0.0 and l3i 1.0.0 come from crates.io; Rust 1.92.
Fixed
- On Unix, a key that is not UTF-8 keeps its exact bytes in provider records, lock manifests and semantic conflicts, instead of a lossy spelling that looks up nothing.
collapse_intoanddump_to_directoryinto one of the VFS's own data directories leave a loose file that already is its destination where it is. They deleted it before linking or copying it.extract_fileinto the folder a loose file already lives in leaves the file there. It deleted the file, then failed to copy it.run_finalizeandrun_finalize_trackedleave a destination that already is the changed file, rewritten in place through a hard link fromoutput_dir, as it is. They copied it onto itself, which truncated it to nothing.VfsFile::file_nameandfile_stemend an archive entry's folders at\as well as/on every platform: a Morrowind BSA'smeshes\x\ex_door.nifisex_door.nifon Linux and macOS too, in trees,Displayand Luau'sfile:fileName().ConflictIndex::diff_reportcompares the keys the index holds for each source, found by exact spelling or with case and separators folded, so archives, indexes built from file lists and sources spelled in another case compare correctly; it read both paths from disk as typed. A path the index does not have is still read from disk.conflicts_reportandshadowed_reportwithoutuse_relativejoin a loose source's path with each file's own spelling, instead of the lowercase key, so every path names a file that exists.ConflictIndex::from_directoriesrecords those spellings.simulate,simulate_with_opts,simulate_impactandplan_candidate_directoryfind each key's current winner by its place in the provider stack. They compared the VFS's number for the source with the index's, which differ after a source that provides nothing, and counted unchanged keys as changed and leftcurrent_winner_sourceempty.- The layer index of a VFS keeps a source that never provided a key, such as an empty data directory, so its positions are the
source_indexof the VFS's provider records andArchiveInfo; it dropped such sources and numbered later ones lower. A source whose providers were all removed still leaves it. - A simulated reorder never lifts an archive above a loose file:
simulate,simulate_with_optsandsimulate_impactranked every source by the new order alone, so moving an archive after a data directory reported the archive winning. set_winner_fileandset_winner_loose_filerecord a new key's directories, soset_winner_file("a/b.txt", …)followed byset_winner_file("a", …)refuses the second instead of keeping a file and a directory nameda, which no VFS can write out.remove_resolved_file,remove_resolved_prefixandremove_resolved_matching_globrelease the removed keys' directories: afterremove_resolved_file("a/b.txt"),push_provider("a", …)returnedfalse.push_provider_batchchecks each entry against the ones before it, sopush_directoryandpush_archiveno longer add a file and a directory with one name;push_directorykeeps the same onefrom_directorieskeeps.DisplayforVFSanddisplay_filteredlist a file whose path has no file name, such asVfsFile::from("/"), by its whole path instead of panicking, and serialized trees list it too instead of leaving it out.DisplayforVFS,display_filteredand Luau'svfs:display()nest each directory under its parent, one│per level, and list directories that hold only directories. Every directory was printed by its last name at one level, someshes/xandtextures/xboth showed asx/, and an archive's folders looked like loose ones.- Luau's
serializewritesEntriesandProvidersviews, tree streams andVfsFilehandles, each file as its file row's fields; it refused every userdata butKeysandProviderRecordsviews, although the documentation said views serialize. collapse_intowithuse_symlinkslinks to each file's absolute path. A VFS built from relative directories made links that resolved from the output folder instead, and dangled.- In Luau, an unknown source kind in
VfsProvider.newreadsVfsProvider.new.kind: unknown source kind 'zip' (...), without a seconddream.vfs:inside it. lua::KeyBlobis exported, so a host can fill thelua::Keys(pub KeyBlob)view it could only build empty.- Every
PathBufin a report serializes as a string, with U+FFFD in place of bytes that are not UTF-8, instead of failing withpath contains invalid UTF-8 characters;diff_against_lockcompares keys and sources as that text, so a lock read back from a file does not drift.
vfstool_lib-1.0.0.crateVerify · sha256 db40ecfedfb7…12ecaeff0
- Release
- 1.0.0 (stable)
- Size
- 216746 bytes
- SHA-256
- db40ecfedfb73886364eeecf08f09124a888426636616e03d73137c12ecaeff0
- Commit
- 1a4193604e82
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-1.0.0.cratemust print the digest above. - The
-
0.10.2 stable
Fixed
VfsFile:readAll()returns a Luau string, as documented, instead of a table of bytes.
vfstool_lib-0.10.2.crateVerify · sha256 fa683d03c638…56b8aa2b2
- Release
- 0.10.2 (stable)
- Size
- 135093 bytes
- SHA-256
- fa683d03c638112193eccf6bd9aed7218e3fded4ae2fa8025dd600d56b8aa2b2
- Commit
- 7ec4c060b6a5
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.10.2.cratemust print the digest above. -
0.10.3 stable
Fixed
- A prefix with a trailing separator matches like one without:
paths_with("meshes/"),remove_provider_prefixandremove_resolved_prefix, and their Luau forms. vfs:keys()returns the keys sorted, as documented, instead of in hash map order.
vfstool_lib-0.10.3.crateVerify · sha256 04709ff10f4c…4dd151bce
- Release
- 0.10.3 (stable)
- Size
- 135739 bytes
- SHA-256
- 04709ff10f4c9558c81231bbc2022f17717b0aadaf104c6ec36a7d14dd151bce
- Commit
- 14c4cb688588
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.10.3.cratemust print the digest above. - A prefix with a trailing separator matches like one without:
-
0.10.4 stable
vfstool_lib is MIT OR Apache-2.0.
Changed
- vfstool_lib is licensed MIT OR Apache-2.0, at your option, instead of GPL-3.0-only.
vfstool_lib-0.10.4.crateVerify · sha256 a6ae5a21d9a8…def3bbdef
- Release
- 0.10.4 (stable)
- Size
- 140075 bytes
- SHA-256
- a6ae5a21d9a820c15d62ce94e52966886a9f6cf6e853777985486eedef3bbdef
- Commit
- dada4ea5bc37
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.10.4.cratemust print the digest above. -
0.9.1 stable
The Lua bindings run on Luau, with camelCase names.
Breaking changes
- The
luafeature builds mlua 0.12's vendored Luau;standalone-luaand LuaJIT are gone. Functions, methods, table fields and string enum values are camelCase.
Fixed
- Fallout 3 BSAs whose entries store only a folder and a file name are enumerated.
- Dependencies updated past the crossbeam-epoch and memmap2 security advisories.
vfstool_lib-0.9.1.crateVerify · sha256 743edd3c4cee…3dfb07170
- Release
- 0.9.1 (stable)
- Size
- 135064 bytes
- SHA-256
- 743edd3c4cee4dbf770783631c042e258f1503c545c9d09137df3aa3dfb07170
- Commit
- 3beebe557589
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.9.1.cratemust print the digest above. - The
-
0.10.0 stable
Changed
- dream-path 0.2.
Fixed
- Oblivion's BSAs are no longer mistaken for Xbox archives, through dream_archive 0.2.
vfstool_lib-0.10.0.crateVerify · sha256 9930d1d68621…b9acdfc01
- Release
- 0.10.0 (stable)
- Size
- 135062 bytes
- SHA-256
- 9930d1d68621a753f9c3dee804e6a5c8d49261d889362ca8d91ea19b9acdfc01
- Commit
- 5de3318eaa8e
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.10.0.cratemust print the digest above. -
0.10.1 stable
Changed
- Rust 1.88.
Fixed
- Fallout 3's voice archives are read, through dream_archive 0.2.2.
vfstool_lib-0.10.1.crateVerify · sha256 e2e0aadc4423…e2a90bbd2
- Release
- 0.10.1 (stable)
- Size
- 135076 bytes
- SHA-256
- e2e0aadc44235b50617f29b3c32f1da6ad28aea01fb2c02970b8a0ae2a90bbd2
- Commit
- d00c04d5dd34
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.10.1.cratemust print the digest above. -
0.9.0 stable
A new core: provider stacks behind every key, byte-first keys, conflict and provenance reports, locks, semantic analysis, materialization and the run workflow.
Breaking changes
- Keys are byte-first
NormalizedPaths from dream-path, taken throughVfsKeyInput; host paths stayPathandPathBuf.normalize_pathis gone;normalize_host_pathnormalizes a host path for comparison. - The
bsafeature isbeth-archives, and reads BSA and BA2 through dream_archive instead ofba2. - Rust 1.87.
Added
VFSkeeps every provider of a key, low to high priority, with the winner cached:explain,provider_records_for,duplicates,archives,archive_entries,source_contributions, and mutation that either replaces a key's stack or preserves it.LayerIndexfor provenance, provider chains, lock manifests (VfsLock) and drift reports;ConflictIndexfor conflicts, shadowed sources and source-to-source diffs.analyze_pairand semantic conflict reports that tell cosmetic changes from behavior changes in INI, TOML, JSON and script files.collapse_into,materialization_plan,dump_to_directoryandextract_file, andrun_setupandrun_finalizefor running a tool on the merged VFS.- ZIP and PK3 archives behind the
zipfeature. - With
serialize,serde,serde_json,serde_yamlandtomlare re-exported. - Lua bindings through
mluabehindlua;standalone-luabuilds a vendored LuaJIT. - Simulation, candidate planning, policies, a load-order solver and a knowledge base, the last three in the unstable
experimentalmodule.
Changed
- vfstool_lib is licensed GPL-3.0-only instead of GPL-3.0-or-later.
vfstool_lib-0.9.0.crateVerify · sha256 58e7a4910009…7f09a0617
- Release
- 0.9.0 (stable)
- Size
- 133398 bytes
- SHA-256
- 58e7a4910009fc3506a67bb5649a64ca3b2eaa4fd5660e788c112d27f09a0617
- Commit
- d840a0f222c5
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.9.0.cratemust print the digest above. - Keys are byte-first
-
0.2.1 stable
Fixed
- Files reached through symbolic links in a data directory are part of the VFS.
vfstool_lib-0.2.1.crateVerify · sha256 002946c537e6…cfe235147
- Release
- 0.2.1 (stable)
- Size
- 31305 bytes
- SHA-256
- 002946c537e63df036d10e5cbf2023792e42bbeb46bb19969b0ee0dcfe235147
- Commit
- f897022e0279
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.2.1.cratemust print the digest above. -
0.2.3 stable
Changed
- Updated dependencies, with
serde_yamlin place ofserde_yaml_with_quirks.
vfstool_lib-0.2.3.crateVerify · sha256 b78ae7af1167…9c61ceeec
- Release
- 0.2.3 (stable)
- Size
- 31320 bytes
- SHA-256
- b78ae7af1167db8bc737d8774d5ab696478d7dfadc5e5bbfeab01a39c61ceeec
- Commit
- 93532af372c5
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.2.3.cratemust print the digest above. - Updated dependencies, with
-
0.2.0 stable
Breaking changes
- Archive support is behind the
bsafeature; without it, a VFS is built from loose files only.
Changed
- Updated
serde_yaml_with_quirksandtoml.
vfstool_lib-0.2.0.crateVerify · sha256 167e9debaf4b…c7a637df0
- Release
- 0.2.0 (stable)
- Size
- 20027 bytes
- SHA-256
- 167e9debaf4b0f4f545e90139c4081363a56f8882425efac2afbf10c7a637df0
- Commit
- 97b8b72e1e3f
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.2.0.cratemust print the digest above. - Archive support is behind the
-
0.1.0 stable
First release: OpenMW's virtual file system from ordered data directories and BSA and BA2 archives.
Added
- With
zip,.jpkfiles are read as ZIP archives beside.zipand.pk3, and Zstandard entries decode through ruzstd, in pure Rust. Every ZIP entry is listed whatever its compression; one compressed another way fails when it is opened. VFS::from_directoriesbuilds the VFS from data directories in load order, later ones winning, and from the archives it is given, which loose files override.get_file,paths_matchingandpaths_withlook files up by their lowercase,/-separated path;treeandtree_filteredsort them into folders.VfsFile: a loose file or an archive entry, opened for reading either way.- Morrowind, Oblivion, Skyrim and Fallout 4 archives through
ba2, and JSON, YAML and TOML trees behindserialize.
vfstool_lib-0.1.0.crateVerify · sha256 fe2a196a33e3…841c16e0b
- Release
- 0.1.0 (stable)
- Size
- 19761 bytes
- SHA-256
- fe2a196a33e3fa420a612a5f5d12dd9c60907d87044e835aabf9e8b841c16e0b
- Sources
- 1
Check it yourself:
sha256sum vfstool_lib-0.1.0.cratemust print the digest above. - With