zipnolo 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ /target
2
+ *.nolo
3
+ *.bin
4
+ .DS_Store
@@ -0,0 +1,122 @@
1
+ # CLAUDE.md — Complete Architectural & Engineering Guide for `zipnolo`
2
+
3
+ **Project**: `zipnolo` (v0.2.0)
4
+ **Author / Creator**: **festomanolo** ([https://festomanolo.com](https://festomanolo.com))
5
+ **Repository**: [https://github.com/festomanolo/zipnolo](https://github.com/festomanolo/zipnolo)
6
+ **PyPI Package**: `pip install zipnolo`
7
+ **Language**: 100% Pure Safe Rust (Edition 2021, 64-bit target architectures)
8
+
9
+ ---
10
+
11
+ ## 1. Executive Summary
12
+
13
+ `zipnolo` is a high-ratio, lossless, block-parallel file and folder archiver designed for **Linux**, **macOS**, and **Windows**. It solves the three primary bottlenecks of traditional archivers (`tar.gz`, `zip`, `xz`):
14
+
15
+ 1. **Bounded Streaming Pipelining (`crossbeam-channel` + `rayon`)**:
16
+ - Compressing a 50 GB or 1 TB file or folder never buffers the archive in RAM. A bounded channel (`max(4, 2 * CPU_CORES)`) enforces natural backpressure between the Rayon worker pool and the sequential disk writer, capping memory usage to a few megabytes.
17
+ 2. **Single-Pass Footer-Indexed Format (`NOLO` v1)**:
18
+ - By placing the Block Index Table and Metadata at the **end of the file (Footer)**—similar to Apache Parquet and `.zip`—compressed blocks are flushed to disk the millisecond they finish in order, with zero backward seeking during writes and instant `SeekFrom::End(-12)` index lookup during reads.
19
+ 3. **Parallel Zero-Copy Decompression (`memmap2::MmapMut`)**:
20
+ - For single-file archives, `zipnolo` pre-allocates the exact uncompressed file size on disk via `File::set_len()`, maps the output file with `MmapMut`, splits it into disjoint mutable slices (`par_chunks_mut`), and decompresses all blocks across all CPU cores simultaneously directly into OS virtual memory with zero intermediate heap allocations.
21
+ 4. **Maximum Lossless Compression + Raw Block Bypass**:
22
+ - Defaults to **Brotli-Max (`Algorithm::Brotli`)** (4 MB sliding window `lgwin=22`, quality 9–11) across all CPU cores in parallel, achieving ~80% size reduction on source code and structured data, while also supporting **Zlib-9 (`Algorithm::Zlib`)**, **LZ4 (`Algorithm::Lz4`)**, and **Snappy (`Algorithm::Snappy`)**.
23
+ - If any block is incompressible (random, encrypted, or pre-compressed media where `compressed.len() >= chunk.len()`), `zipnolo` automatically stores the raw uncompressed chunk (`compressed_size == uncompressed_size`), mathematically guaranteeing **zero block expansion (`<= 100.0%`)**.
24
+ 5. **Per-Block 64-Bit `XXH3` Integrity Verification**:
25
+ - Every uncompressed block is hashed with `xxh3_64` (>30 GB/s) inside each worker thread and verified on decompression to detect bit rot or storage corruption immediately.
26
+
27
+ ---
28
+
29
+ ## 2. Codebase Module Map
30
+
31
+ ```text
32
+ /Volumes/MacX/projects/compress
33
+ ├── Cargo.toml # Rust crate manifest (zipnolo v0.2.0, LTO release profile)
34
+ ├── pyproject.toml # PyPI / Maturin packaging manifest (pip install zipnolo)
35
+ ├── install.sh # Cross-platform Linux & macOS installer script
36
+ ├── Makefile # Standard build, release, test, install targets
37
+ ├── README.md # User-facing documentation & quickstart
38
+ ├── CLAUDE.md # Comprehensive engineering & architecture guide (this file)
39
+ ├── docs/
40
+ │ └── ARCHITECTURE.md # NOLO v1 & NLDR v1 binary format specification
41
+ ├── src/
42
+ │ ├── lib.rs # Library root, 64-bit compile_error! guard, public exports
43
+ │ ├── main.rs # CLI argument parser and entrypoint for `zipnolo`
44
+ │ ├── constants.rs # Magic headers (NOLO, OLON, NLDR), chunk size (4 MB), OS key labels
45
+ │ ├── algorithm.rs # Algorithm enum (Lz4=1, Snappy=2, Brotli=3, Zlib=4) & parser
46
+ │ ├── codec.rs # Block compression/decompression + incompressible raw-bypass
47
+ │ ├── format.rs # NOLO v1 footer serializer, parser, bounds checks & path sanitization
48
+ │ ├── progress.rs # Lock-free AtomicU64 terminal progress bar (25 FPS throttled)
49
+ │ ├── archiver.rs # Single-file Mmap/MmapMut parallel compressor & decompressor
50
+ │ ├── folder.rs # Recursive folder walker, NLDR container streamer & parallel extractor
51
+ │ ├── paths.rs # Same-directory default destination resolver & path sanitizer
52
+ │ ├── navigator.rs # Interactive crossterm TUI file/folder browser (Cmd+Enter / Ctrl+Enter)
53
+ │ └── cli.rs # Interactive workflows, compress/decompress runners, 32 MB self-test
54
+ └── tests/
55
+ └── integration_tests.rs # End-to-end test suite (0-byte, unaligned, corruption, folders, Brotli)
56
+ ```
57
+
58
+ ---
59
+
60
+ ## 3. Binary Format Specifications
61
+
62
+ ### 3.1 `NOLO` v1 Archive Layout
63
+
64
+ | Section | Size | Type / Endianness | Description |
65
+ | :--- | :--- | :--- | :--- |
66
+ | **Start Magic** | 4 Bytes | `[u8; 4]` (`b"NOLO"`) | Identifies file as a NOLO archive |
67
+ | **Compressed Blocks** | Variable | Raw Bytes | `[Block 0][Block 1]...[Block N-1]` written sequentially |
68
+ | **Footer Metadata** | Variable | Little-Endian | See Footer Metadata layout below |
69
+ | **Footer Size** | 8 Bytes | `u64` (LE) | Total byte length of the Footer Metadata section |
70
+ | **End Magic** | 4 Bytes | `[u8; 4]` (`b"OLON"`) | Verifies archive is not truncated; enables `SeekFrom::End(-12)` |
71
+
72
+ #### Footer Metadata Fields (Little-Endian):
73
+ 1. `orig_size`: `u64` (8 bytes) — Uncompressed byte length of the file (or `NLDR` folder stream).
74
+ 2. `chunk_size`: `u32` (4 bytes) — Uncompressed block chunk size (default `4,194,304` bytes / 4 MB).
75
+ 3. `algo_id`: `u8` (1 byte) — `1 = Lz4`, `2 = Snappy`, `3 = Brotli`, `4 = Zlib`.
76
+ 4. `name_len`: `u16` (2 bytes) — Byte length of the UTF-8 stored filename.
77
+ 5. `stored_name`: `[u8; name_len]` — UTF-8 filename (e.g. `"video.mp4"`) or folder tag (`"NOLO_DIR:my_folder"`).
78
+ 6. `num_blocks`: `u64` (8 bytes) — Number of blocks in the archive.
79
+ 7. `block_table`: `[BlockEntry; num_blocks]` (12 bytes per block):
80
+ - `compressed_size`: `u32` (4 bytes)
81
+ - `xxh3_checksum`: `u64` (8 bytes)
82
+
83
+ ### 3.2 `NLDR` v1 Directory Container Stream (Inside Folder Archives)
84
+
85
+ When compressing a directory, `stored_name` in the `NOLO` footer is prefixed with `"NOLO_DIR:<folder_name>"` and the uncompressed stream consists of:
86
+ - `magic`: `b"NLDR"` (4 bytes)
87
+ - `item_count`: `u64` (8 bytes, LE)
88
+ - Repeated `item_count` times:
89
+ - `kind`: `u8` (`0` = directory, `1` = regular file, `2` = executable file with Unix `0o755`)
90
+ - `rel_path_len`: `u32` (4 bytes, LE)
91
+ - `rel_path`: `[u8; rel_path_len]` (UTF-8 forward-slash normalized relative path)
92
+ - `file_size`: `u64` (8 bytes, LE; `0` for directories)
93
+ - `file_data`: `[u8; file_size]`
94
+
95
+ ---
96
+
97
+ ## 4. Cross-Platform Compatibility (Linux, macOS, Windows)
98
+
99
+ 1. **Zero-Byte Files**: Calling `mmap` on a 0-byte file triggers `EINVAL` on Linux/macOS and `ERROR_FILE_INVALID` on Windows. `zipnolo` checks `file_size > 0` before mapping and handles 0-byte files as metadata-only archives.
100
+ 2. **64-Bit Virtual Address Space**: Enforced at compile time via `#[cfg(not(target_pointer_width = "64"))] compile_error!(...)` in `src/lib.rs`.
101
+ 3. **Windows File Locking**: `Mmap` and `MmapMut` handles are explicitly dropped (`drop(out_mmap); drop(in_mmap);`) before closing files.
102
+ 4. **Linux Special Files & Permissions**: Directory traversal uses `fs::symlink_metadata` so broken symlinks, sockets, and FIFOs never cause errors on Linux, and Unix executable bits (`0o111`) are preserved across compression and extraction.
103
+ 5. **Terminal Keyboard Protocol (`Cmd+Enter` / `Ctrl+Enter`)**: `RawModeGuard` enables `crossterm::event::PushKeyboardEnhancementFlags` (Kitty protocol) so terminals report `Cmd+Enter` (`KeyModifiers::SUPER`), `Ctrl+Enter`, `Alt+Enter`, or `c`/`Space` to compress any highlighted file or folder while `Enter`/`→` opens folders to navigate inside them.
104
+
105
+ ---
106
+
107
+ ## 5. Development, Testing & Packaging Commands
108
+
109
+ ```bash
110
+ # Run full integration test suite (6 tests)
111
+ cargo test
112
+
113
+ # Run 32 MB parallel self-test benchmark
114
+ cargo run --release -- test
115
+
116
+ # Install locally on Linux or macOS
117
+ ./install.sh
118
+
119
+ # Build PyPI wheels and source distribution via Maturin
120
+ maturin build --release
121
+ maturin sdist
122
+ ```
@@ -0,0 +1,495 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "adler2"
7
+ version = "2.0.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10
+
11
+ [[package]]
12
+ name = "alloc-no-stdlib"
13
+ version = "2.0.4"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
16
+
17
+ [[package]]
18
+ name = "alloc-stdlib"
19
+ version = "0.2.4"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
22
+ dependencies = [
23
+ "alloc-no-stdlib",
24
+ ]
25
+
26
+ [[package]]
27
+ name = "anyhow"
28
+ version = "1.0.104"
29
+ source = "registry+https://github.com/rust-lang/crates.io-index"
30
+ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
31
+
32
+ [[package]]
33
+ name = "bitflags"
34
+ version = "2.13.2"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
37
+
38
+ [[package]]
39
+ name = "brotli"
40
+ version = "7.0.0"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
43
+ dependencies = [
44
+ "alloc-no-stdlib",
45
+ "alloc-stdlib",
46
+ "brotli-decompressor",
47
+ ]
48
+
49
+ [[package]]
50
+ name = "brotli-decompressor"
51
+ version = "4.0.3"
52
+ source = "registry+https://github.com/rust-lang/crates.io-index"
53
+ checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd"
54
+ dependencies = [
55
+ "alloc-no-stdlib",
56
+ "alloc-stdlib",
57
+ ]
58
+
59
+ [[package]]
60
+ name = "cfg-if"
61
+ version = "1.0.5"
62
+ source = "registry+https://github.com/rust-lang/crates.io-index"
63
+ checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
64
+
65
+ [[package]]
66
+ name = "crc32fast"
67
+ version = "1.5.5"
68
+ source = "registry+https://github.com/rust-lang/crates.io-index"
69
+ checksum = "2b929dd2a135771f40afabd1073f85eed59c800b7c61901e5c254270497dad64"
70
+ dependencies = [
71
+ "cfg-if",
72
+ ]
73
+
74
+ [[package]]
75
+ name = "crossbeam-channel"
76
+ version = "0.5.17"
77
+ source = "registry+https://github.com/rust-lang/crates.io-index"
78
+ checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1"
79
+ dependencies = [
80
+ "crossbeam-utils",
81
+ ]
82
+
83
+ [[package]]
84
+ name = "crossbeam-deque"
85
+ version = "0.8.8"
86
+ source = "registry+https://github.com/rust-lang/crates.io-index"
87
+ checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
88
+ dependencies = [
89
+ "crossbeam-epoch",
90
+ "crossbeam-utils",
91
+ ]
92
+
93
+ [[package]]
94
+ name = "crossbeam-epoch"
95
+ version = "0.9.21"
96
+ source = "registry+https://github.com/rust-lang/crates.io-index"
97
+ checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
98
+ dependencies = [
99
+ "crossbeam-utils",
100
+ ]
101
+
102
+ [[package]]
103
+ name = "crossbeam-utils"
104
+ version = "0.8.23"
105
+ source = "registry+https://github.com/rust-lang/crates.io-index"
106
+ checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
107
+
108
+ [[package]]
109
+ name = "crossterm"
110
+ version = "0.28.1"
111
+ source = "registry+https://github.com/rust-lang/crates.io-index"
112
+ checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
113
+ dependencies = [
114
+ "bitflags",
115
+ "crossterm_winapi",
116
+ "mio",
117
+ "parking_lot",
118
+ "rustix",
119
+ "signal-hook",
120
+ "signal-hook-mio",
121
+ "winapi",
122
+ ]
123
+
124
+ [[package]]
125
+ name = "crossterm_winapi"
126
+ version = "0.9.1"
127
+ source = "registry+https://github.com/rust-lang/crates.io-index"
128
+ checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
129
+ dependencies = [
130
+ "winapi",
131
+ ]
132
+
133
+ [[package]]
134
+ name = "either"
135
+ version = "1.19.0"
136
+ source = "registry+https://github.com/rust-lang/crates.io-index"
137
+ checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
138
+
139
+ [[package]]
140
+ name = "errno"
141
+ version = "0.3.14"
142
+ source = "registry+https://github.com/rust-lang/crates.io-index"
143
+ checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
144
+ dependencies = [
145
+ "libc",
146
+ "windows-sys 0.61.2",
147
+ ]
148
+
149
+ [[package]]
150
+ name = "flate2"
151
+ version = "1.1.11"
152
+ source = "registry+https://github.com/rust-lang/crates.io-index"
153
+ checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4"
154
+ dependencies = [
155
+ "crc32fast",
156
+ "miniz_oxide",
157
+ "zlib-rs",
158
+ ]
159
+
160
+ [[package]]
161
+ name = "libc"
162
+ version = "0.2.191"
163
+ source = "registry+https://github.com/rust-lang/crates.io-index"
164
+ checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
165
+
166
+ [[package]]
167
+ name = "linux-raw-sys"
168
+ version = "0.4.15"
169
+ source = "registry+https://github.com/rust-lang/crates.io-index"
170
+ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
171
+
172
+ [[package]]
173
+ name = "lock_api"
174
+ version = "0.4.14"
175
+ source = "registry+https://github.com/rust-lang/crates.io-index"
176
+ checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
177
+ dependencies = [
178
+ "scopeguard",
179
+ ]
180
+
181
+ [[package]]
182
+ name = "log"
183
+ version = "0.4.35"
184
+ source = "registry+https://github.com/rust-lang/crates.io-index"
185
+ checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c"
186
+
187
+ [[package]]
188
+ name = "lz4_flex"
189
+ version = "0.11.6"
190
+ source = "registry+https://github.com/rust-lang/crates.io-index"
191
+ checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a"
192
+ dependencies = [
193
+ "twox-hash",
194
+ ]
195
+
196
+ [[package]]
197
+ name = "memmap2"
198
+ version = "0.9.12"
199
+ source = "registry+https://github.com/rust-lang/crates.io-index"
200
+ checksum = "6b0ca1155a9ecc25aa12e8313a119f32edf0255fea2f44839c4ac0a12b2ac157"
201
+ dependencies = [
202
+ "libc",
203
+ ]
204
+
205
+ [[package]]
206
+ name = "miniz_oxide"
207
+ version = "0.9.1"
208
+ source = "registry+https://github.com/rust-lang/crates.io-index"
209
+ checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c"
210
+ dependencies = [
211
+ "adler2",
212
+ "simd-adler32",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "mio"
217
+ version = "1.2.4"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee"
220
+ dependencies = [
221
+ "libc",
222
+ "log",
223
+ "wasi",
224
+ "windows-sys 0.61.2",
225
+ ]
226
+
227
+ [[package]]
228
+ name = "parking_lot"
229
+ version = "0.12.5"
230
+ source = "registry+https://github.com/rust-lang/crates.io-index"
231
+ checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
232
+ dependencies = [
233
+ "lock_api",
234
+ "parking_lot_core",
235
+ ]
236
+
237
+ [[package]]
238
+ name = "parking_lot_core"
239
+ version = "0.9.12"
240
+ source = "registry+https://github.com/rust-lang/crates.io-index"
241
+ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
242
+ dependencies = [
243
+ "cfg-if",
244
+ "libc",
245
+ "redox_syscall",
246
+ "smallvec",
247
+ "windows-link",
248
+ ]
249
+
250
+ [[package]]
251
+ name = "rayon"
252
+ version = "1.12.0"
253
+ source = "registry+https://github.com/rust-lang/crates.io-index"
254
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
255
+ dependencies = [
256
+ "either",
257
+ "rayon-core",
258
+ ]
259
+
260
+ [[package]]
261
+ name = "rayon-core"
262
+ version = "1.13.0"
263
+ source = "registry+https://github.com/rust-lang/crates.io-index"
264
+ checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
265
+ dependencies = [
266
+ "crossbeam-deque",
267
+ "crossbeam-utils",
268
+ ]
269
+
270
+ [[package]]
271
+ name = "redox_syscall"
272
+ version = "0.5.18"
273
+ source = "registry+https://github.com/rust-lang/crates.io-index"
274
+ checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
275
+ dependencies = [
276
+ "bitflags",
277
+ ]
278
+
279
+ [[package]]
280
+ name = "rustix"
281
+ version = "0.38.44"
282
+ source = "registry+https://github.com/rust-lang/crates.io-index"
283
+ checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
284
+ dependencies = [
285
+ "bitflags",
286
+ "errno",
287
+ "libc",
288
+ "linux-raw-sys",
289
+ "windows-sys 0.59.0",
290
+ ]
291
+
292
+ [[package]]
293
+ name = "scopeguard"
294
+ version = "1.2.0"
295
+ source = "registry+https://github.com/rust-lang/crates.io-index"
296
+ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
297
+
298
+ [[package]]
299
+ name = "signal-hook"
300
+ version = "0.3.18"
301
+ source = "registry+https://github.com/rust-lang/crates.io-index"
302
+ checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
303
+ dependencies = [
304
+ "libc",
305
+ "signal-hook-registry",
306
+ ]
307
+
308
+ [[package]]
309
+ name = "signal-hook-mio"
310
+ version = "0.2.5"
311
+ source = "registry+https://github.com/rust-lang/crates.io-index"
312
+ checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
313
+ dependencies = [
314
+ "libc",
315
+ "mio",
316
+ "signal-hook",
317
+ ]
318
+
319
+ [[package]]
320
+ name = "signal-hook-registry"
321
+ version = "1.4.8"
322
+ source = "registry+https://github.com/rust-lang/crates.io-index"
323
+ checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
324
+ dependencies = [
325
+ "errno",
326
+ "libc",
327
+ ]
328
+
329
+ [[package]]
330
+ name = "simd-adler32"
331
+ version = "0.3.10"
332
+ source = "registry+https://github.com/rust-lang/crates.io-index"
333
+ checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
334
+
335
+ [[package]]
336
+ name = "smallvec"
337
+ version = "1.16.5"
338
+ source = "registry+https://github.com/rust-lang/crates.io-index"
339
+ checksum = "149309498a5f7334b12ddae0cad8aba81ce785fe91755068867e017cf98fee46"
340
+
341
+ [[package]]
342
+ name = "snap"
343
+ version = "1.1.2"
344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
345
+ checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886"
346
+
347
+ [[package]]
348
+ name = "twox-hash"
349
+ version = "2.1.5"
350
+ source = "registry+https://github.com/rust-lang/crates.io-index"
351
+ checksum = "86a801b3cea342a06d468c8710662aa29e5e05e4f5c0d62f00bbb7f2ad7941c2"
352
+
353
+ [[package]]
354
+ name = "wasi"
355
+ version = "0.11.1+wasi-snapshot-preview1"
356
+ source = "registry+https://github.com/rust-lang/crates.io-index"
357
+ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
358
+
359
+ [[package]]
360
+ name = "winapi"
361
+ version = "0.3.9"
362
+ source = "registry+https://github.com/rust-lang/crates.io-index"
363
+ checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
364
+ dependencies = [
365
+ "winapi-i686-pc-windows-gnu",
366
+ "winapi-x86_64-pc-windows-gnu",
367
+ ]
368
+
369
+ [[package]]
370
+ name = "winapi-i686-pc-windows-gnu"
371
+ version = "0.4.0"
372
+ source = "registry+https://github.com/rust-lang/crates.io-index"
373
+ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
374
+
375
+ [[package]]
376
+ name = "winapi-x86_64-pc-windows-gnu"
377
+ version = "0.4.0"
378
+ source = "registry+https://github.com/rust-lang/crates.io-index"
379
+ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
380
+
381
+ [[package]]
382
+ name = "windows-link"
383
+ version = "0.2.1"
384
+ source = "registry+https://github.com/rust-lang/crates.io-index"
385
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
386
+
387
+ [[package]]
388
+ name = "windows-sys"
389
+ version = "0.59.0"
390
+ source = "registry+https://github.com/rust-lang/crates.io-index"
391
+ checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
392
+ dependencies = [
393
+ "windows-targets",
394
+ ]
395
+
396
+ [[package]]
397
+ name = "windows-sys"
398
+ version = "0.61.2"
399
+ source = "registry+https://github.com/rust-lang/crates.io-index"
400
+ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
401
+ dependencies = [
402
+ "windows-link",
403
+ ]
404
+
405
+ [[package]]
406
+ name = "windows-targets"
407
+ version = "0.52.6"
408
+ source = "registry+https://github.com/rust-lang/crates.io-index"
409
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
410
+ dependencies = [
411
+ "windows_aarch64_gnullvm",
412
+ "windows_aarch64_msvc",
413
+ "windows_i686_gnu",
414
+ "windows_i686_gnullvm",
415
+ "windows_i686_msvc",
416
+ "windows_x86_64_gnu",
417
+ "windows_x86_64_gnullvm",
418
+ "windows_x86_64_msvc",
419
+ ]
420
+
421
+ [[package]]
422
+ name = "windows_aarch64_gnullvm"
423
+ version = "0.52.6"
424
+ source = "registry+https://github.com/rust-lang/crates.io-index"
425
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
426
+
427
+ [[package]]
428
+ name = "windows_aarch64_msvc"
429
+ version = "0.52.6"
430
+ source = "registry+https://github.com/rust-lang/crates.io-index"
431
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
432
+
433
+ [[package]]
434
+ name = "windows_i686_gnu"
435
+ version = "0.52.6"
436
+ source = "registry+https://github.com/rust-lang/crates.io-index"
437
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
438
+
439
+ [[package]]
440
+ name = "windows_i686_gnullvm"
441
+ version = "0.52.6"
442
+ source = "registry+https://github.com/rust-lang/crates.io-index"
443
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
444
+
445
+ [[package]]
446
+ name = "windows_i686_msvc"
447
+ version = "0.52.6"
448
+ source = "registry+https://github.com/rust-lang/crates.io-index"
449
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
450
+
451
+ [[package]]
452
+ name = "windows_x86_64_gnu"
453
+ version = "0.52.6"
454
+ source = "registry+https://github.com/rust-lang/crates.io-index"
455
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
456
+
457
+ [[package]]
458
+ name = "windows_x86_64_gnullvm"
459
+ version = "0.52.6"
460
+ source = "registry+https://github.com/rust-lang/crates.io-index"
461
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
462
+
463
+ [[package]]
464
+ name = "windows_x86_64_msvc"
465
+ version = "0.52.6"
466
+ source = "registry+https://github.com/rust-lang/crates.io-index"
467
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
468
+
469
+ [[package]]
470
+ name = "xxhash-rust"
471
+ version = "0.8.19"
472
+ source = "registry+https://github.com/rust-lang/crates.io-index"
473
+ checksum = "550a2b930b62486a393c52d5c3b84bff264b28aa437ed64694d31e93b1757af7"
474
+
475
+ [[package]]
476
+ name = "zipnolo"
477
+ version = "0.2.0"
478
+ dependencies = [
479
+ "anyhow",
480
+ "brotli",
481
+ "crossbeam-channel",
482
+ "crossterm",
483
+ "flate2",
484
+ "lz4_flex",
485
+ "memmap2",
486
+ "rayon",
487
+ "snap",
488
+ "xxhash-rust",
489
+ ]
490
+
491
+ [[package]]
492
+ name = "zlib-rs"
493
+ version = "0.6.8"
494
+ source = "registry+https://github.com/rust-lang/crates.io-index"
495
+ checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
@@ -0,0 +1,33 @@
1
+ [package]
2
+ name = "zipnolo"
3
+ version = "0.2.0"
4
+ edition = "2021"
5
+ authors = ["festomanolo <https://festomanolo.com>"]
6
+ description = "High-ratio lossless block-parallel file and folder archiver for Linux, macOS, and Windows — by festomanolo (https://festomanolo.com)"
7
+ homepage = "https://festomanolo.com"
8
+ repository = "https://github.com/festomanolo/zipnolo"
9
+ license = "MIT"
10
+ readme = "README.md"
11
+ keywords = ["compression", "archiver", "parallel", "brotli", "cli"]
12
+ categories = ["command-line-utilities", "compression"]
13
+
14
+ [[bin]]
15
+ name = "zipnolo"
16
+ path = "src/main.rs"
17
+
18
+ [dependencies]
19
+ memmap2 = "0.9"
20
+ rayon = "1.10"
21
+ crossbeam-channel = "0.5"
22
+ lz4_flex = "0.11"
23
+ snap = "1.1"
24
+ brotli = "7.0"
25
+ flate2 = "1.0"
26
+ xxhash-rust = { version = "0.8", features = ["xxh3"] }
27
+ anyhow = "1.0"
28
+ crossterm = "0.28"
29
+
30
+ [profile.release]
31
+ opt-level = 3
32
+ lto = "thin"
33
+ codegen-units = 1
zipnolo-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 festomanolo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.