omnizip 0.3.1

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.
Files changed (511) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +754 -0
  5. data/COPYING +502 -0
  6. data/Gemfile +17 -0
  7. data/LICENSE +12 -0
  8. data/README.adoc +1045 -0
  9. data/Rakefile +12 -0
  10. data/benchmark/README.md +260 -0
  11. data/benchmark/benchmark_suite.rb +125 -0
  12. data/benchmark/compression_bench.rb +181 -0
  13. data/benchmark/filter_bench.rb +180 -0
  14. data/benchmark/models/benchmark_result.rb +59 -0
  15. data/benchmark/models/comparison_result.rb +69 -0
  16. data/benchmark/profile_suite.rb +167 -0
  17. data/benchmark/reporter.rb +150 -0
  18. data/benchmark/run_benchmarks.rb +66 -0
  19. data/benchmark/test_data.rb +137 -0
  20. data/config/formats/rar3_spec.yml +91 -0
  21. data/config/formats/rar5_spec.yml +102 -0
  22. data/docs/.github/workflows/docs.yml +142 -0
  23. data/docs/.gitignore +21 -0
  24. data/docs/.lychee.toml +67 -0
  25. data/docs/Gemfile +13 -0
  26. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  27. data/docs/README.md +101 -0
  28. data/docs/_config.yml +112 -0
  29. data/docs/assets/logo.svg +1 -0
  30. data/docs/assets/omnizip-logo.pdf +1540 -11
  31. data/docs/comparison/feature-matrix.adoc +694 -0
  32. data/docs/comparison/index.adoc +113 -0
  33. data/docs/comparison/vs-7zip.adoc +309 -0
  34. data/docs/comparison/vs-peazip.adoc +77 -0
  35. data/docs/comparison/vs-rubyzip.adoc +342 -0
  36. data/docs/comparison/vs-winrar.adoc +100 -0
  37. data/docs/compatibility.adoc +579 -0
  38. data/docs/concepts/index.adoc +129 -0
  39. data/docs/developer/architecture.adoc +256 -0
  40. data/docs/developer/contributing.adoc +158 -0
  41. data/docs/developer/index.adoc +25 -0
  42. data/docs/developer/testing.adoc +212 -0
  43. data/docs/getting-started/basic-usage.adoc +271 -0
  44. data/docs/getting-started/index.adoc +42 -0
  45. data/docs/getting-started/installation.adoc +138 -0
  46. data/docs/getting-started/quick-start.adoc +185 -0
  47. data/docs/getting-started/your-first-archive.adoc +218 -0
  48. data/docs/guides/advanced-features/encryption.adoc +300 -0
  49. data/docs/guides/advanced-features/index.adoc +49 -0
  50. data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
  51. data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
  52. data/docs/guides/advanced-features/streaming.adoc +212 -0
  53. data/docs/guides/archive-formats/gzip-format.adoc +107 -0
  54. data/docs/guides/archive-formats/index.adoc +130 -0
  55. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  56. data/docs/guides/archive-formats/rar5.adoc +521 -0
  57. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  58. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  59. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  60. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  61. data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
  62. data/docs/guides/compression-algorithms/deflate.adoc +319 -0
  63. data/docs/guides/compression-algorithms/index.adoc +190 -0
  64. data/docs/guides/compression-algorithms/lzma.adoc +398 -0
  65. data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
  66. data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
  67. data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
  68. data/docs/guides/creating-archives.adoc +354 -0
  69. data/docs/guides/extracting-archives.adoc +53 -0
  70. data/docs/guides/format-conversion.adoc +64 -0
  71. data/docs/guides/index.adoc +49 -0
  72. data/docs/guides/migration-rubyzip.adoc +217 -0
  73. data/docs/guides/parity-archives.adoc +605 -0
  74. data/docs/guides/performance-tuning.adoc +88 -0
  75. data/docs/index.adoc +218 -0
  76. data/docs/lychee.toml +67 -0
  77. data/docs/reference/api/overview.adoc +188 -0
  78. data/docs/reference/cli/compress-command.adoc +114 -0
  79. data/docs/reference/cli/overview.adoc +140 -0
  80. data/docs/reference/index.adoc +26 -0
  81. data/docs/resources/faq.adoc +185 -0
  82. data/docs/resources/quick-reference.adoc +222 -0
  83. data/docs/troubleshooting/index.adoc +208 -0
  84. data/examples/api_comparison.rb +205 -0
  85. data/examples/deflate64_example.rb +96 -0
  86. data/examples/par2_demo.rb +121 -0
  87. data/examples/quick_start_native.rb +150 -0
  88. data/examples/quick_start_rubyzip.rb +115 -0
  89. data/examples/rubyzip_compatibility_demo.rb +194 -0
  90. data/exe/omnizip +27 -0
  91. data/lib/omnizip/algorithm.rb +130 -0
  92. data/lib/omnizip/algorithm_registry.rb +86 -0
  93. data/lib/omnizip/algorithms/.keep +0 -0
  94. data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
  95. data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
  96. data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
  97. data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
  98. data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
  99. data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
  100. data/lib/omnizip/algorithms/bzip2.rb +130 -0
  101. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  102. data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
  103. data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
  104. data/lib/omnizip/algorithms/deflate.rb +128 -0
  105. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  106. data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
  107. data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
  108. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
  109. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
  110. data/lib/omnizip/algorithms/deflate64.rb +109 -0
  111. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  112. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  113. data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
  114. data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
  115. data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
  116. data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
  117. data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
  118. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
  119. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
  120. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
  121. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
  122. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  123. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  124. data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
  125. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  126. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
  127. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
  128. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  129. data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
  130. data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
  131. data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
  132. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  133. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
  134. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
  135. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
  136. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
  137. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
  138. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
  139. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  140. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
  141. data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
  142. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
  143. data/lib/omnizip/algorithms/lzma.rb +238 -0
  144. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
  145. data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
  146. data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
  147. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
  148. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  149. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
  150. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  151. data/lib/omnizip/algorithms/lzma2.rb +141 -0
  152. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  153. data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
  154. data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
  155. data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
  156. data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
  157. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  158. data/lib/omnizip/algorithms/ppmd7.rb +116 -0
  159. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  160. data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
  161. data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
  162. data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
  163. data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
  164. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  165. data/lib/omnizip/algorithms/ppmd8.rb +82 -0
  166. data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
  167. data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
  168. data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
  169. data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
  170. data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
  171. data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
  172. data/lib/omnizip/algorithms/zstandard.rb +138 -0
  173. data/lib/omnizip/buffer/memory_archive.rb +251 -0
  174. data/lib/omnizip/buffer/memory_extractor.rb +224 -0
  175. data/lib/omnizip/buffer.rb +176 -0
  176. data/lib/omnizip/checksum_registry.rb +114 -0
  177. data/lib/omnizip/checksums/crc32.rb +100 -0
  178. data/lib/omnizip/checksums/crc64.rb +101 -0
  179. data/lib/omnizip/checksums/crc_base.rb +158 -0
  180. data/lib/omnizip/checksums/verifier.rb +131 -0
  181. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  182. data/lib/omnizip/chunked/reader.rb +78 -0
  183. data/lib/omnizip/chunked/writer.rb +120 -0
  184. data/lib/omnizip/chunked.rb +129 -0
  185. data/lib/omnizip/cli/output_formatter.rb +104 -0
  186. data/lib/omnizip/cli.rb +572 -0
  187. data/lib/omnizip/commands/.keep +0 -0
  188. data/lib/omnizip/commands/archive_create_command.rb +427 -0
  189. data/lib/omnizip/commands/archive_extract_command.rb +272 -0
  190. data/lib/omnizip/commands/archive_list_command.rb +218 -0
  191. data/lib/omnizip/commands/archive_repair_command.rb +131 -0
  192. data/lib/omnizip/commands/archive_verify_command.rb +117 -0
  193. data/lib/omnizip/commands/compress_command.rb +117 -0
  194. data/lib/omnizip/commands/decompress_command.rb +120 -0
  195. data/lib/omnizip/commands/list_command.rb +53 -0
  196. data/lib/omnizip/commands/metadata_command.rb +153 -0
  197. data/lib/omnizip/commands/parity_create_command.rb +122 -0
  198. data/lib/omnizip/commands/parity_repair_command.rb +122 -0
  199. data/lib/omnizip/commands/parity_verify_command.rb +124 -0
  200. data/lib/omnizip/commands/profile_list_command.rb +56 -0
  201. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  202. data/lib/omnizip/convenience.rb +359 -0
  203. data/lib/omnizip/converter/conversion_registry.rb +49 -0
  204. data/lib/omnizip/converter/conversion_strategy.rb +121 -0
  205. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
  206. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
  207. data/lib/omnizip/converter.rb +105 -0
  208. data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
  209. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  210. data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
  211. data/lib/omnizip/crypto/aes256.rb +102 -0
  212. data/lib/omnizip/error.rb +106 -0
  213. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
  214. data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
  215. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  216. data/lib/omnizip/eta/sample_history.rb +143 -0
  217. data/lib/omnizip/eta/time_estimator.rb +106 -0
  218. data/lib/omnizip/eta.rb +63 -0
  219. data/lib/omnizip/extraction/filter_chain.rb +177 -0
  220. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  221. data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
  222. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  223. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  224. data/lib/omnizip/extraction/selective_extractor.rb +240 -0
  225. data/lib/omnizip/extraction.rb +111 -0
  226. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  227. data/lib/omnizip/file_type.rb +113 -0
  228. data/lib/omnizip/filter.rb +139 -0
  229. data/lib/omnizip/filter_pipeline.rb +108 -0
  230. data/lib/omnizip/filter_registry.rb +166 -0
  231. data/lib/omnizip/filters/bcj.rb +279 -0
  232. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  233. data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
  234. data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
  235. data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
  236. data/lib/omnizip/filters/bcj2.rb +99 -0
  237. data/lib/omnizip/filters/bcj_arm.rb +176 -0
  238. data/lib/omnizip/filters/bcj_arm64.rb +244 -0
  239. data/lib/omnizip/filters/bcj_ia64.rb +196 -0
  240. data/lib/omnizip/filters/bcj_ppc.rb +190 -0
  241. data/lib/omnizip/filters/bcj_sparc.rb +176 -0
  242. data/lib/omnizip/filters/bcj_x86.rb +193 -0
  243. data/lib/omnizip/filters/delta.rb +196 -0
  244. data/lib/omnizip/filters/filter_base.rb +72 -0
  245. data/lib/omnizip/filters/registry.rb +123 -0
  246. data/lib/omnizip/filters/xz_delta.rb +258 -0
  247. data/lib/omnizip/format_detector.rb +162 -0
  248. data/lib/omnizip/format_registry.rb +59 -0
  249. data/lib/omnizip/formats/.keep +0 -0
  250. data/lib/omnizip/formats/bzip2_file.rb +172 -0
  251. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  252. data/lib/omnizip/formats/cpio/entry.rb +385 -0
  253. data/lib/omnizip/formats/cpio/reader.rb +196 -0
  254. data/lib/omnizip/formats/cpio/writer.rb +234 -0
  255. data/lib/omnizip/formats/cpio.rb +140 -0
  256. data/lib/omnizip/formats/format_spec_loader.rb +230 -0
  257. data/lib/omnizip/formats/gzip.rb +238 -0
  258. data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
  259. data/lib/omnizip/formats/iso/directory_record.rb +152 -0
  260. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  261. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  262. data/lib/omnizip/formats/iso/reader.rb +197 -0
  263. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  264. data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
  265. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  266. data/lib/omnizip/formats/iso/writer.rb +530 -0
  267. data/lib/omnizip/formats/iso.rb +140 -0
  268. data/lib/omnizip/formats/lzip.rb +175 -0
  269. data/lib/omnizip/formats/lzma_alone.rb +171 -0
  270. data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
  271. data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
  272. data/lib/omnizip/formats/rar/block_parser.rb +243 -0
  273. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  274. data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
  275. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
  276. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
  277. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  278. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  279. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  280. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  281. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
  282. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
  283. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
  284. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  285. data/lib/omnizip/formats/rar/constants.rb +82 -0
  286. data/lib/omnizip/formats/rar/decompressor.rb +238 -0
  287. data/lib/omnizip/formats/rar/external_writer.rb +312 -0
  288. data/lib/omnizip/formats/rar/header.rb +192 -0
  289. data/lib/omnizip/formats/rar/license_validator.rb +109 -0
  290. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  291. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  292. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  293. data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
  294. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
  295. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
  296. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  297. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  298. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
  299. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  300. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
  301. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  302. data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
  303. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  304. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  305. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  306. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  307. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  308. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
  309. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  310. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
  311. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
  312. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
  313. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  314. data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
  315. data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
  316. data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
  317. data/lib/omnizip/formats/rar/reader.rb +366 -0
  318. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  319. data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
  320. data/lib/omnizip/formats/rar/writer.rb +431 -0
  321. data/lib/omnizip/formats/rar.rb +205 -0
  322. data/lib/omnizip/formats/rar3/compressor.rb +73 -0
  323. data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
  324. data/lib/omnizip/formats/rar3/reader.rb +386 -0
  325. data/lib/omnizip/formats/rar3/writer.rb +219 -0
  326. data/lib/omnizip/formats/rar5/compressor.rb +73 -0
  327. data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
  328. data/lib/omnizip/formats/rar5/reader.rb +342 -0
  329. data/lib/omnizip/formats/rar5/writer.rb +214 -0
  330. data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
  331. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  332. data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
  333. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
  334. data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
  335. data/lib/omnizip/formats/seven_zip/header.rb +106 -0
  336. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
  337. data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
  338. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  339. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
  340. data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
  341. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  342. data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
  343. data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
  344. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
  345. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
  346. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  347. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
  348. data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
  349. data/lib/omnizip/formats/seven_zip.rb +93 -0
  350. data/lib/omnizip/formats/tar/constants.rb +73 -0
  351. data/lib/omnizip/formats/tar/entry.rb +94 -0
  352. data/lib/omnizip/formats/tar/header.rb +168 -0
  353. data/lib/omnizip/formats/tar/reader.rb +121 -0
  354. data/lib/omnizip/formats/tar/writer.rb +216 -0
  355. data/lib/omnizip/formats/tar.rb +84 -0
  356. data/lib/omnizip/formats/xz/reader.rb +116 -0
  357. data/lib/omnizip/formats/xz.rb +237 -0
  358. data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
  359. data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
  360. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  361. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
  362. data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
  363. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  364. data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
  365. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
  366. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
  367. data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
  368. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
  369. data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
  370. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
  371. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  372. data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
  373. data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
  374. data/lib/omnizip/formats/zip/constants.rb +69 -0
  375. data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
  376. data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
  377. data/lib/omnizip/formats/zip/reader.rb +250 -0
  378. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  379. data/lib/omnizip/formats/zip/writer.rb +375 -0
  380. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
  381. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
  382. data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
  383. data/lib/omnizip/formats/zip.rb +50 -0
  384. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  385. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  386. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  387. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  388. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  389. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
  390. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
  391. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
  392. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
  393. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
  394. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
  395. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
  396. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
  397. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
  398. data/lib/omnizip/io/buffered_input.rb +146 -0
  399. data/lib/omnizip/io/buffered_output.rb +105 -0
  400. data/lib/omnizip/io/stream_manager.rb +115 -0
  401. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  402. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  403. data/lib/omnizip/link_handler.rb +124 -0
  404. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  405. data/lib/omnizip/metadata/entry_metadata.rb +146 -0
  406. data/lib/omnizip/metadata/metadata_editor.rb +171 -0
  407. data/lib/omnizip/metadata/metadata_registry.rb +64 -0
  408. data/lib/omnizip/metadata/metadata_validator.rb +99 -0
  409. data/lib/omnizip/metadata.rb +57 -0
  410. data/lib/omnizip/models/.keep +0 -0
  411. data/lib/omnizip/models/algorithm_metadata.rb +73 -0
  412. data/lib/omnizip/models/compression_options.rb +71 -0
  413. data/lib/omnizip/models/conversion_options.rb +87 -0
  414. data/lib/omnizip/models/conversion_result.rb +135 -0
  415. data/lib/omnizip/models/eta_result.rb +46 -0
  416. data/lib/omnizip/models/extraction_rule.rb +115 -0
  417. data/lib/omnizip/models/filter_chain.rb +144 -0
  418. data/lib/omnizip/models/filter_config.rb +183 -0
  419. data/lib/omnizip/models/match_result.rb +124 -0
  420. data/lib/omnizip/models/optimization_suggestion.rb +91 -0
  421. data/lib/omnizip/models/parallel_options.rb +104 -0
  422. data/lib/omnizip/models/performance_result.rb +79 -0
  423. data/lib/omnizip/models/profile_report.rb +82 -0
  424. data/lib/omnizip/models/progress_options.rb +38 -0
  425. data/lib/omnizip/models/split_options.rb +116 -0
  426. data/lib/omnizip/optimization_registry.rb +81 -0
  427. data/lib/omnizip/parallel/job_queue.rb +209 -0
  428. data/lib/omnizip/parallel/job_scheduler.rb +203 -0
  429. data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
  430. data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
  431. data/lib/omnizip/parallel/worker_pool.rb +223 -0
  432. data/lib/omnizip/parallel.rb +149 -0
  433. data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
  434. data/lib/omnizip/parity/galois16.rb +145 -0
  435. data/lib/omnizip/parity/models/creator_packet.rb +73 -0
  436. data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
  437. data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
  438. data/lib/omnizip/parity/models/main_packet.rb +128 -0
  439. data/lib/omnizip/parity/models/packet.rb +156 -0
  440. data/lib/omnizip/parity/models/packet_registry.rb +109 -0
  441. data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
  442. data/lib/omnizip/parity/par2_creator.rb +531 -0
  443. data/lib/omnizip/parity/par2_repairer.rb +407 -0
  444. data/lib/omnizip/parity/par2_verifier.rb +364 -0
  445. data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
  446. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  447. data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
  448. data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
  449. data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
  450. data/lib/omnizip/parity.rb +186 -0
  451. data/lib/omnizip/password/encryption_registry.rb +65 -0
  452. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  453. data/lib/omnizip/password/password_validator.rb +129 -0
  454. data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
  455. data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
  456. data/lib/omnizip/password.rb +87 -0
  457. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  458. data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
  459. data/lib/omnizip/pipe.rb +121 -0
  460. data/lib/omnizip/platform/ntfs_streams.rb +201 -0
  461. data/lib/omnizip/platform.rb +189 -0
  462. data/lib/omnizip/profile/archive_profile.rb +39 -0
  463. data/lib/omnizip/profile/balanced_profile.rb +33 -0
  464. data/lib/omnizip/profile/binary_profile.rb +36 -0
  465. data/lib/omnizip/profile/compression_profile.rb +158 -0
  466. data/lib/omnizip/profile/custom_profile.rb +157 -0
  467. data/lib/omnizip/profile/fast_profile.rb +33 -0
  468. data/lib/omnizip/profile/maximum_profile.rb +33 -0
  469. data/lib/omnizip/profile/profile_detector.rb +110 -0
  470. data/lib/omnizip/profile/profile_registry.rb +161 -0
  471. data/lib/omnizip/profile/text_profile.rb +36 -0
  472. data/lib/omnizip/profile.rb +190 -0
  473. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  474. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  475. data/lib/omnizip/profiler/report_generator.rb +169 -0
  476. data/lib/omnizip/profiler.rb +204 -0
  477. data/lib/omnizip/progress/callback_reporter.rb +36 -0
  478. data/lib/omnizip/progress/console_reporter.rb +62 -0
  479. data/lib/omnizip/progress/log_reporter.rb +91 -0
  480. data/lib/omnizip/progress/operation_progress.rb +118 -0
  481. data/lib/omnizip/progress/progress_bar.rb +156 -0
  482. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  483. data/lib/omnizip/progress/progress_tracker.rb +190 -0
  484. data/lib/omnizip/progress/silent_reporter.rb +24 -0
  485. data/lib/omnizip/progress.rb +127 -0
  486. data/lib/omnizip/rubyzip_compat.rb +63 -0
  487. data/lib/omnizip/temp/safe_extract.rb +168 -0
  488. data/lib/omnizip/temp/temp_file.rb +124 -0
  489. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  490. data/lib/omnizip/temp.rb +181 -0
  491. data/lib/omnizip/version.rb +5 -0
  492. data/lib/omnizip/zip/entry.rb +156 -0
  493. data/lib/omnizip/zip/file.rb +485 -0
  494. data/lib/omnizip/zip/input_stream.rb +273 -0
  495. data/lib/omnizip/zip/output_stream.rb +324 -0
  496. data/lib/omnizip.rb +156 -0
  497. data/readme-docs/advanced-features.adoc +515 -0
  498. data/readme-docs/api-usage.adoc +444 -0
  499. data/readme-docs/architecture.adoc +449 -0
  500. data/readme-docs/archive-formats.adoc +479 -0
  501. data/readme-docs/cli-usage.adoc +222 -0
  502. data/readme-docs/compression-algorithms.adoc +442 -0
  503. data/readme-docs/compression-profiles.adoc +247 -0
  504. data/readme-docs/encryption-checksums.adoc +328 -0
  505. data/readme-docs/format-converter.adoc +325 -0
  506. data/readme-docs/installation.adoc +228 -0
  507. data/readme-docs/par2-archives.adoc +608 -0
  508. data/readme-docs/performance-profiler.adoc +389 -0
  509. data/readme-docs/preprocessing-filters.adoc +280 -0
  510. data/xz-file-format-1.2.1.txt +1174 -0
  511. metadata +617 -0
@@ -0,0 +1,521 @@
1
+ ---
2
+ title: RAR5 Format Support
3
+ nav_order: 7
4
+ parent: Archive Formats
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == RAR5 Format Support
9
+
10
+ Complete documentation for RAR5 archive creation and extraction in Omnizip v0.3.0.
11
+
12
+ === Overview
13
+
14
+ RAR5 is the latest version of the RAR archive format, introduced in WinRAR 5.0. It features improved compression algorithms, better recovery records, and enhanced encryption compared to RAR4.
15
+
16
+ **Status in Omnizip v0.3.0:**
17
+
18
+ * ✅ **Read support:** Full RAR5 extraction with all compression methods
19
+ * ✅ **Write support:** STORE and LZMA compression (5 levels)
20
+ * ✅ **Multi-volume archives:** Split archives across multiple volumes
21
+ * ✅ **Solid archives:** Full support for solid compression
22
+ * ✅ **Unicode filenames:** UTF-8 support
23
+ * ✅ **Symlinks and hardlinks:** Full support
24
+ * ✅ **Error handling:** Graceful handling of truncated/invalid files
25
+ * ✅ **Pure Ruby:** Zero external dependencies
26
+ * ✅ **Format compliant:** Archives compatible with official `unrar`
27
+ * ✅ **libarchive compatibility:** 51 test files verified
28
+
29
+ === Compression Methods
30
+
31
+ RAR5 supports multiple compression methods. Omnizip v0.5.0 implements:
32
+
33
+ ==== STORE (Method 0)
34
+
35
+ Uncompressed storage - files are copied directly into the archive without compression.
36
+
37
+ **Use cases:**
38
+ * Already compressed files (JPEG, MP4, ZIP)
39
+ * Small files where compression overhead isn't worth it
40
+ * Maximum extraction speed required
41
+
42
+ **Performance:**
43
+ * Instant compression
44
+ * Zero CPU overhead
45
+ * Archive size = sum of file sizes
46
+
47
+ ==== LZMA (Methods 1-5)
48
+
49
+ LZMA (Lempel-Ziv-Markov chain Algorithm) with configurable dictionary sizes for different compression/speed trade-offs.
50
+
51
+ [cols="1,2,2,3",options="header"]
52
+ |===
53
+ |Level |Dictionary |Speed |Use Case
54
+
55
+ |1
56
+ |256 KB
57
+ |Fastest
58
+ |Quick backups, already compressed data
59
+
60
+ |2
61
+ |1 MB
62
+ |Fast
63
+ |General purpose, good balance
64
+
65
+ |3
66
+ |4 MB
67
+ |Normal
68
+ |Default - good compression with reasonable speed
69
+
70
+ |4
71
+ |8 MB
72
+ |Good
73
+ |Better compression for larger files
74
+
75
+ |5
76
+ |16 MB
77
+ |Best
78
+ |Maximum compression, archives for distribution
79
+ |===
80
+
81
+ **Performance (Pure Ruby):**
82
+ * 10-60x slower than native WinRAR (level-dependent)
83
+ * Memory usage: < 2-3x input size
84
+ * Trade-off: Complete portability without native extensions
85
+
86
+ === Multi-Volume Archives *(NEW in v0.5.0)*
87
+
88
+ Split large archives across multiple volume files for distribution on size-constrained media or network uploads.
89
+
90
+ ==== Features
91
+
92
+ * **Configurable split size:** Specify maximum volume size (e.g., "10M", "100M", "1G")
93
+ * **Three naming patterns:**
94
+ - `part`: archive.part1.rar, archive.part2.rar, ... (default)
95
+ - `volume`: archive.vol1.rar, archive.vol2.rar, ...
96
+ - `numeric`: archive.rar, archive.r00, archive.r01, ...
97
+ * **Atomic file placement:** Files are not split mid-stream (v0.5.0 limitation)
98
+ * **Compression support:** Works with both STORE and LZMA
99
+ * **Format compliant:** Extracts correctly with `unrar`
100
+
101
+ ==== Basic Usage
102
+
103
+ [source,ruby]
104
+ ----
105
+ # Create multi-volume archive (10 MB per volume)
106
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
107
+ multi_volume: true,
108
+ volume_size: '10M',
109
+ compression: :lzma,
110
+ level: 5
111
+ )
112
+ writer.add_directory('large_dataset/')
113
+ volumes = writer.write
114
+ # Returns: ['archive.part1.rar', 'archive.part2.rar', ...]
115
+
116
+ # Create with numeric naming
117
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
118
+ multi_volume: true,
119
+ volume_size: '100M',
120
+ volume_naming: 'numeric'
121
+ )
122
+ writer.add_file('huge_file.dat')
123
+ volumes = writer.write
124
+ # Returns: ['backup.rar', 'backup.r00', 'backup.r01', ...]
125
+ ----
126
+
127
+ ==== Volume Size Specification
128
+
129
+ **Human-readable formats:**
130
+ ```ruby
131
+ volume_size: '10K' # 10 kilobytes
132
+ volume_size: '50M' # 50 megabytes
133
+ volume_size: '1G' # 1 gigabyte
134
+ volume_size: '2T' # 2 terabytes
135
+
136
+ # Or integer bytes
137
+ volume_size: 10_485_760 # 10 MB in bytes
138
+ ```
139
+
140
+ **Minimum size:** 64 KB (enforced by validation)
141
+
142
+ ==== CLI Usage
143
+
144
+ [source,sh]
145
+ ----
146
+ # Create multi-volume archive
147
+ omnizip archive create archive.rar large_files/ \
148
+ --split-size 10M --algorithm lzma --level 5
149
+
150
+ # With numeric naming
151
+ omnizip archive create backup.rar data/ \
152
+ --split-size 100M --volume-naming numeric
153
+ ----
154
+
155
+ ==== Use Cases
156
+
157
+ * **DVD/Blu-ray distribution:** Split to fit disc capacity
158
+ * **Email attachments:** Split into attachment-size chunks
159
+ * **Cloud uploads:** Respect size limits (e.g., 100MB per file)
160
+ * **Network transfers:** Resumable downloads via individual volumes
161
+
162
+ ==== Current Limitations
163
+
164
+ * **No file spanning:** Individual files cannot span multiple volumes (files must fit in single volume)
165
+ * **Sequential creation:** Volumes created one at a time (no parallelization in v0.5.0)
166
+
167
+ === Optional Fields
168
+
169
+ RAR5 supports optional metadata fields for enhanced archive information.
170
+
171
+ ==== Modification Time (mtime)
172
+
173
+ Preserves file modification timestamps in the archive.
174
+
175
+ **Format:** 64-bit Windows FILETIME (100-nanosecond intervals since 1601-01-01)
176
+
177
+ **Usage:**
178
+ [source,ruby]
179
+ ----
180
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
181
+ include_mtime: true
182
+ )
183
+ ----
184
+
185
+ **Compatibility:** Works with all compression methods (STORE, LZMA)
186
+
187
+ ==== CRC32 Checksum
188
+
189
+ **CRITICAL LIMITATION:** CRC32 optional field is only compatible with STORE compression.
190
+
191
+ **Why this limitation exists:**
192
+
193
+ RAR5 format specification requires that compressed files use only the BLAKE2sp checksum (always present in the main file header) for integrity verification. The optional CRC32 field was designed for uncompressed (STORE) files to provide additional integrity checking during transmission or storage.
194
+
195
+ **Behavior:**
196
+ * With STORE: CRC32 is included if requested
197
+ * With LZMA: CRC32 is automatically disabled (no error)
198
+ * BLAKE2sp checksum is always present regardless of compression
199
+
200
+ **Usage:**
201
+ [source,ruby]
202
+ ----
203
+ # CRC32 works with STORE
204
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
205
+ compression: :store,
206
+ include_crc32: true # ✅ Will be included
207
+ )
208
+
209
+ # CRC32 auto-disabled with LZMA
210
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
211
+ compression: :lzma,
212
+ include_crc32: true # ⚠️ Silently disabled
213
+ )
214
+ # Archive will use BLAKE2sp only (standard behavior)
215
+ ----
216
+
217
+ === Creating RAR5 Archives
218
+
219
+ ==== Basic Usage
220
+
221
+ [source,ruby]
222
+ ----
223
+ require 'omnizip/formats/rar/rar5/writer'
224
+
225
+ # Create with default settings (STORE compression)
226
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar')
227
+ writer.add_file('document.txt')
228
+ writer.add_file('image.png')
229
+ writer.write
230
+ writer.close
231
+ ----
232
+
233
+ ==== LZMA Compression
234
+
235
+ [source,ruby]
236
+ ----
237
+ # Default LZMA level (3 = normal)
238
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
239
+ compression: :lzma
240
+ )
241
+ writer.add_file('large_dataset.json')
242
+ writer.write
243
+
244
+ # LZMA level 5 (best compression)
245
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
246
+ compression: :lzma,
247
+ level: 5
248
+ )
249
+ writer.add_directory('photos/')
250
+ writer.write
251
+
252
+ # LZMA level 1 (fastest)
253
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
254
+ compression: :lzma,
255
+ level: 1
256
+ )
257
+ writer.add_file('temp_data.bin')
258
+ writer.write
259
+ ----
260
+
261
+ ==== Auto-Compression Selection
262
+
263
+ Automatically choose STORE for small files (<1KB) and LZMA for larger files:
264
+
265
+ [source,ruby]
266
+ ----
267
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
268
+ compression: :auto, # Smart selection
269
+ level: 3 # LZMA level when auto selects it
270
+ )
271
+ writer.add_file('small_config.txt') # → STORE
272
+ writer.add_file('large_dataset.csv') # → LZMA level 3
273
+ writer.write
274
+ ----
275
+
276
+ ==== Combined Features
277
+
278
+ [source,ruby]
279
+ ----
280
+ # Multi-volume with LZMA compression and mtime
281
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
282
+ compression: :lzma,
283
+ level: 4,
284
+ include_mtime: true,
285
+ multi_volume: true,
286
+ volume_size: '50M'
287
+ )
288
+ writer.add_directory('project/')
289
+ volumes = writer.write
290
+ # Creates: backup.part1.rar, backup.part2.rar, ...
291
+ ----
292
+
293
+ ==== Block Syntax
294
+
295
+ [source,ruby]
296
+ ----
297
+ Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
298
+ compression: :lzma,
299
+ level: 5
300
+ ) do |writer|
301
+ writer.add_file('report.pdf')
302
+ writer.add_directory('data/')
303
+ end
304
+ # Automatically calls write() and close()
305
+ ----
306
+
307
+ === CLI Usage
308
+
309
+ Create RAR5 archives using the command-line interface:
310
+
311
+ [source,sh]
312
+ ----
313
+ # Create with STORE compression (default)
314
+ omnizip archive create archive.rar file1.txt file2.txt
315
+
316
+ # Create with LZMA compression (level 3 default)
317
+ omnizip archive create archive.rar documents/ --algorithm lzma
318
+
319
+ # Create with LZMA level 5 (best)
320
+ omnizip archive create archive.rar datasets/ --algorithm lzma --level 5
321
+
322
+ # Create with LZMA level 1 (fastest)
323
+ omnizip archive create archive.rar temp/ --algorithm lzma --level 1
324
+
325
+ # Include modification time
326
+ omnizip archive create archive.rar photos/ --include-mtime
327
+
328
+ # Include CRC32 (STORE compression only)
329
+ omnizip archive create archive.rar data/ --algorithm store --include-crc32
330
+
331
+ # Multi-volume archive
332
+ omnizip archive create archive.rar large_data/ --split-size 10M --algorithm lzma
333
+ ----
334
+
335
+ === Extracting RAR5 Archives
336
+
337
+ Omnizip provides full RAR5 archive reading support with all compression methods:
338
+
339
+ [source,ruby]
340
+ ----
341
+ require 'omnizip/formats/rar5/reader'
342
+
343
+ # Read and list files
344
+ reader = Omnizip::Formats::Rar5::Reader.new
345
+ File.open('archive.rar', 'rb') do |io|
346
+ entries = reader.read_archive(io)
347
+
348
+ entries.each do |entry|
349
+ puts "#{entry.name}: #{entry.uncompressed_size} bytes"
350
+ puts " Compressed: #{entry.compressed_size} bytes"
351
+ puts " Method: #{entry.compression_method}"
352
+ puts " Modified: #{entry.modified_time}"
353
+ puts " CRC32: #{entry.crc32.to_s(16)}"
354
+ puts " Directory: #{entry.is_directory}"
355
+ end
356
+ end
357
+ ----
358
+
359
+ **Reader Features:**
360
+
361
+ * ✅ All compression methods (STORE, LZSS)
362
+ * ✅ Solid archive support
363
+ * ✅ Unicode filenames (UTF-8)
364
+ * ✅ Symlink and hardlink detection
365
+ * ✅ Multi-file archives
366
+ * ✅ Graceful error handling for truncated/invalid files
367
+ * ✅ Proper header position tracking with bounds checking
368
+
369
+ === Performance Characteristics
370
+
371
+ ==== Compression Speed
372
+
373
+ Pure Ruby implementation (portable):
374
+
375
+ [cols="2,3,3",options="header"]
376
+ |===
377
+ |Method |Speed vs Native |Use Case
378
+
379
+ |STORE
380
+ |~1x (no compression)
381
+ |Instant archiving
382
+
383
+ |LZMA Level 1
384
+ |~10-15x slower
385
+ |Quick backups
386
+
387
+ |LZMA Level 3
388
+ |~20-30x slower
389
+ |General purpose
390
+
391
+ |LZMA Level 5
392
+ |~40-60x slower
393
+ |Distribution archives
394
+ |===
395
+
396
+ ==== Memory Usage
397
+
398
+ * STORE: Minimal (< 0.5x input size)
399
+ * LZMA: < 2-3x input size (level-dependent)
400
+ * Multi-volume: Compresses all files upfront (v0.5.0)
401
+ * Streaming support for large files (>100MB)
402
+
403
+ ==== Trade-offs
404
+
405
+ **Pure Ruby advantages:**
406
+ * ✅ Works on all Ruby platforms (MRI, JRuby, TruffleRuby)
407
+ * ✅ Zero external dependencies
408
+ * ✅ Complete portability
409
+ * ✅ No compilation or native extensions
410
+
411
+ **Performance trade-off:**
412
+ * ⚠️ 10-60x slower than native implementations
413
+ * ✅ Acceptable for most use cases (< 1GB archives)
414
+ * ✅ Can process 100MB files in reasonable time
415
+
416
+ === Format Compliance
417
+
418
+ Omnizip's RAR5 implementation follows the official RAR5 format specification:
419
+
420
+ * **Archive signature:** Correct RAR 5.0 magic bytes (`0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00`)
421
+ * **Header structure:** Compliant main archive header and file headers
422
+ * **Multi-volume flags:** Proper VOLUME_ARCHIVE_FLAG and volume numbering
423
+ * **Checksum algorithm:** BLAKE2sp for all files (CRC32 optional for STORE)
424
+ * **LZMA encoding:** Standard LZMA parameters compatible with 7-Zip SDK
425
+ * **Compatibility:** Archives extract correctly with official `unrar` 5.0+
426
+
427
+ === Current Limitations
428
+
429
+ ==== Known Issues (v0.3.0)
430
+
431
+ * **CRC32 limitation:** Only works with STORE compression (format requirement)
432
+ * **Large files:** >1GB files may be slow with pure Ruby LZMA
433
+ - Consider using STORE for very large files
434
+ - Or use 7z format with same algorithms for better performance
435
+ * **Multi-volume memory:** All files compressed upfront
436
+ - Sequential/streaming compression planned for future release
437
+
438
+ ==== Deferred to v0.4.0
439
+
440
+ * **PPMd compression:** Prediction by Partial Matching encoder/decoder synchronization
441
+ * **Zstandard compression:** RFC 8878 implementation required
442
+
443
+ === Examples
444
+
445
+ ==== Backup Script
446
+
447
+ [source,ruby]
448
+ ----
449
+ require 'omnizip/formats/rar/rar5/writer'
450
+
451
+ # Backup documents with LZMA compression
452
+ def backup_documents(source_dir, backup_file)
453
+ Omnizip::Formats::Rar::Rar5::Writer.new(backup_file,
454
+ compression: :lzma,
455
+ level: 4,
456
+ include_mtime: true
457
+ ) do |writer|
458
+ Dir.glob("#{source_dir}/**/*").each do |file|
459
+ next if File.directory?(file)
460
+ writer.add_file(file)
461
+ end
462
+ end
463
+
464
+ puts "Backup created: #{backup_file}"
465
+ end
466
+
467
+ backup_documents('~/Documents', 'backup.rar')
468
+ ----
469
+
470
+ ==== Multi-Volume Backup
471
+
472
+ [source,ruby]
473
+ ----
474
+ # Create multi-volume backup for DVD burning
475
+ def create_dvd_backup(source_dir, output_base)
476
+ Omnizip::Formats::Rar::Rar5::Writer.new(output_base,
477
+ compression: :lzma,
478
+ level: 5,
479
+ multi_volume: true,
480
+ volume_size: '4.3G', # DVD-R capacity
481
+ include_mtime: true
482
+ ) do |writer|
483
+ writer.add_directory(source_dir)
484
+ end
485
+ end
486
+
487
+ volumes = create_dvd_backup('~/Photos', 'photos_backup.rar')
488
+ puts "Created #{volumes.size} volumes for burning"
489
+ volumes.each { |v| puts " - #{File.basename(v)}" }
490
+ ----
491
+
492
+ ==== Archive Converter
493
+
494
+ [source,ruby]
495
+ ----
496
+ # Convert ZIP to RAR5
497
+ def zip_to_rar5(zip_file, rar_file)
498
+ zip = Omnizip::Formats::Zip::Reader.new(zip_file)
499
+
500
+ Omnizip::Formats::Rar::Rar5::Writer.new(rar_file,
501
+ compression: :lzma,
502
+ level: 5
503
+ ) do |writer|
504
+ zip.each_entry do |entry|
505
+ content = zip.read_entry(entry)
506
+ writer.add_data(entry.name, content)
507
+ end
508
+ end
509
+
510
+ zip.close
511
+ end
512
+
513
+ zip_to_rar5('archive.zip', 'archive.rar')
514
+ ----
515
+
516
+ === See Also
517
+
518
+ * link:../../reference/index.html[Reference Documentation]
519
+ * link:../creating-archives.html[Creating Archives Guide]
520
+ * link:../../comparison/vs-winrar.html[Omnizip vs WinRAR Comparison]
521
+ * https://www.rarlab.com/technote.htm[Official RAR5 Format Specification]
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: 7z Format
3
+ nav_order: 1
4
+ parent: Archive Formats
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == 7z Format
9
+
10
+ === General
11
+
12
+ The 7z format is a compressed archive format created by 7-Zip.
13
+
14
+ === Features
15
+
16
+ * High compression ratio (LZMA2)
17
+ * Solid archives
18
+ * Multi-volume support
19
+ * AES-256 encryption
20
+
21
+ === Usage
22
+
23
+ [source,bash]
24
+ ----
25
+ # Create 7z archive
26
+ omnizip archive create backup.7z documents/
27
+
28
+ # Extract 7z archive
29
+ omnizip archive extract backup.7z output/
30
+ ----
31
+
32
+ === See Also
33
+
34
+ * link:../compression-algorithms/lzma2.html[LZMA2 Algorithm]
35
+
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: TAR Format
3
+ nav_order: 4
4
+ parent: Archive Formats
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == Purpose
9
+
10
+ TAR (Tape Archive) is the standard archive format on Unix/Linux systems. It combines multiple files into a single archive without compression, typically paired with external compression tools.
11
+
12
+ == Key Characteristics
13
+
14
+ [cols="1,3"]
15
+ |===
16
+ |Property |Value
17
+
18
+ |Compression
19
+ |External (GZIP, BZip2, XZ)
20
+
21
+ |Encryption
22
+ |None
23
+
24
+ |POSIX Support
25
+ |Full POSIX.1-1988 and POSIX.1-2001
26
+
27
+ |Large Files
28
+ |Yes (with extensions)
29
+
30
+ |Best For
31
+ |Unix backups, software packaging, source distribution
32
+ |===
33
+
34
+ == Common TAR Variants
35
+
36
+ [cols="1,2,2"]
37
+ |===
38
+ |Extension |Compression |Typical Use
39
+
40
+ |`.tar`
41
+ |None
42
+ |Intermediate archives
43
+
44
+ |`.tar.gz` / `.tgz`
45
+ |GZIP (Deflate)
46
+ |Source distributions
47
+
48
+ |`.tar.bz2` / `.tbz2`
49
+ |BZip2
50
+ |Better compression
51
+
52
+ |`.tar.xz` / `.txz`
53
+ |XZ (LZMA2)
54
+ |Maximum compression
55
+ |===
56
+
57
+ == Basic Usage
58
+
59
+ === Create TAR Archive
60
+
61
+ [source,ruby]
62
+ ----
63
+ # Create uncompressed TAR
64
+ Omnizip::Archive.create('backup.tar', format: :tar) do |archive|
65
+ archive.add_directory('project/')
66
+ end
67
+
68
+ # Create TAR.GZ
69
+ Omnizip.compress_directory('project/', 'backup.tar.gz',
70
+ format: :tar_gzip,
71
+ level: 6
72
+ )
73
+
74
+ # Create TAR.XZ
75
+ Omnizip.compress_directory('project/', 'backup.tar.xz',
76
+ format: :tar_xz,
77
+ level: 6
78
+ )
79
+ ----
80
+
81
+ === Extract TAR Archive
82
+
83
+ [source,ruby]
84
+ ----
85
+ # Extract TAR.GZ
86
+ Omnizip.extract_archive('backup.tar.gz', 'output/')
87
+
88
+ # Extract TAR.XZ
89
+ Omnizip.extract_archive('backup.tar.xz', 'output/')
90
+ ----
91
+
92
+ == POSIX Features
93
+
94
+ Omnizip supports extended POSIX features:
95
+
96
+ * **Long filenames** (beyond 100 characters)
97
+ * **Symbolic links**
98
+ * **File permissions**
99
+ * **Ownership information**
100
+ * **Sparse files**
101
+
102
+ == See Also
103
+
104
+ * link:gzip-format.html[GZIP Format] - Common TAR compression
105
+ * link:xz-format.html[XZ Format] - Maximum compression for TAR
106
+ * link:../../compatibility.html[Compatibility] - TAR support across tools