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.
- zipnolo-0.2.0/.gitignore +4 -0
- zipnolo-0.2.0/CLAUDE.md +122 -0
- zipnolo-0.2.0/Cargo.lock +495 -0
- zipnolo-0.2.0/Cargo.toml +33 -0
- zipnolo-0.2.0/LICENSE +21 -0
- zipnolo-0.2.0/Makefile +18 -0
- zipnolo-0.2.0/PKG-INFO +102 -0
- zipnolo-0.2.0/README.md +73 -0
- zipnolo-0.2.0/docs/ARCHITECTURE.md +25 -0
- zipnolo-0.2.0/install.sh +26 -0
- zipnolo-0.2.0/pyproject.toml +39 -0
- zipnolo-0.2.0/src/algorithm.rs +53 -0
- zipnolo-0.2.0/src/archiver.rs +249 -0
- zipnolo-0.2.0/src/cli.rs +209 -0
- zipnolo-0.2.0/src/codec.rs +87 -0
- zipnolo-0.2.0/src/constants.rs +10 -0
- zipnolo-0.2.0/src/folder.rs +399 -0
- zipnolo-0.2.0/src/format.rs +152 -0
- zipnolo-0.2.0/src/lib.rs +26 -0
- zipnolo-0.2.0/src/main.rs +118 -0
- zipnolo-0.2.0/src/navigator.rs +394 -0
- zipnolo-0.2.0/src/paths.rs +97 -0
- zipnolo-0.2.0/src/progress.rs +117 -0
- zipnolo-0.2.0/tests/integration_tests.rs +205 -0
zipnolo-0.2.0/.gitignore
ADDED
zipnolo-0.2.0/CLAUDE.md
ADDED
|
@@ -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
|
+
```
|
zipnolo-0.2.0/Cargo.lock
ADDED
|
@@ -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"
|
zipnolo-0.2.0/Cargo.toml
ADDED
|
@@ -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.
|