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,605 @@
1
+ ---
2
+ title: PAR2 Parity Archives
3
+ nav_order: 7
4
+ parent: Guides
5
+ ---
6
+
7
+ == PAR2 Parity Archives Guide
8
+
9
+ Complete guide to using PAR2 error correction in Omnizip for data protection and recovery.
10
+
11
+ == What is PAR2?
12
+
13
+ PAR2 (Parity Archive Volume 2) is an error correction format that uses Reed-Solomon codes to protect data against corruption and loss. It creates recovery files that can detect and repair damaged or missing files.
14
+
15
+ === Key Concepts
16
+
17
+ **Recovery Blocks**:: PAR2 splits files into blocks and generates additional recovery blocks using Reed-Solomon encoding. Each recovery block can replace any damaged or missing original block.
18
+
19
+ **Redundancy**:: The percentage of extra recovery data created. 10% redundancy means you can recover from up to 10% data loss.
20
+
21
+ **Block Size**:: The size of each block in bytes. Smaller blocks provide finer-grained recovery but create more metadata. Default is 16KB.
22
+
23
+ **Reed-Solomon Codes**:: Mathematical error correction codes over Galois Field GF(2^16) that enable reconstruction of missing data from parity information.
24
+
25
+ == Why Use PAR2?
26
+
27
+ === Protection Scenarios
28
+
29
+ **Long-term Storage**:: Protect archives on CDs, DVDs, tape backups, or cloud storage from bit rot and media degradation.
30
+
31
+ **Network Transfers**:: Detect corruption during downloads or file transfers without re-downloading entire files.
32
+
33
+ **Data Archival**:: Create redundant recovery data for critical archives before secure deletion of originals.
34
+
35
+ **Multi-file Archives**:: Protect sets of related files (e.g., split archives) with unified recovery data.
36
+
37
+ === Advantages
38
+
39
+ * **Efficient**: Only damaged blocks need recovery, not entire files
40
+ * **Flexible**: Configurable redundancy from 0-100%
41
+ * **Portable**: Industry standard format with cross-platform tools
42
+ * **Verifiable**: Check integrity without unpacking archives
43
+ * **Repairable**: Automatically reconstruct missing/damaged data
44
+
45
+ == Creating PAR2 Files
46
+
47
+ === Basic Creation
48
+
49
+ ==== CLI
50
+
51
+ [source,sh]
52
+ ----
53
+ # Create PAR2 with default 10% redundancy
54
+ omnizip parity create important.zip
55
+
56
+ # Generates:
57
+ # important.par2 (index file)
58
+ # important.vol00+01.par2 (recovery volumes)
59
+ # important.vol01+02.par2
60
+ # ...
61
+ ----
62
+
63
+ ==== Ruby API
64
+
65
+ [source,ruby]
66
+ ----
67
+ require 'omnizip/parity'
68
+
69
+ # Create PAR2 creator
70
+ creator = Omnizip::Parity::Par2Creator.new(
71
+ redundancy: 10, # 10% redundancy
72
+ block_size: 16384 # 16KB blocks (default)
73
+ )
74
+
75
+ # Add files to protect
76
+ creator.add_file('important.zip')
77
+ creator.add_file('documents.tar.gz')
78
+
79
+ # Generate PAR2 files
80
+ par2_files = creator.create('backup')
81
+ # => ["backup.par2", "backup.vol00+01.par2", ...]
82
+ ----
83
+
84
+ === Custom Redundancy
85
+
86
+ Choose redundancy based on risk tolerance:
87
+
88
+ [source,sh]
89
+ ----
90
+ # Minimal protection (5%)
91
+ omnizip parity create --redundancy 5 data.7z
92
+
93
+ # Standard protection (10%, default)
94
+ omnizip parity create --redundancy 10 data.7z
95
+
96
+ # High protection (20%)
97
+ omnizip parity create --redundancy 20 data.7z
98
+
99
+ # Maximum protection (100%, full duplication)
100
+ omnizip parity create --redundancy 100 critical.zip
101
+ ----
102
+
103
+ === Custom Block Size
104
+
105
+ [source,sh]
106
+ ----
107
+ # Smaller blocks (8KB) - finer recovery, more metadata
108
+ omnizip parity create --block-size 8192 archive.7z
109
+
110
+ # Default blocks (16KB) - balanced
111
+ omnizip parity create --block-size 16384 archive.7z
112
+
113
+ # Larger blocks (64KB) - less metadata, coarser recovery
114
+ omnizip parity create --block-size 65536 large-archive.zip
115
+ ----
116
+
117
+ **Trade-offs:**
118
+
119
+ * **Small blocks**: Fine-grained recovery, larger PAR2 files, slower
120
+ * **Large blocks**: Coarse recovery, smaller PAR2 files, faster
121
+
122
+ === Multiple Files
123
+
124
+ Protect multiple files with unified recovery data:
125
+
126
+ [source,sh]
127
+ ----
128
+ # CLI: Protect multiple archives
129
+ omnizip parity create --redundancy 15 *.zip *.7z
130
+
131
+ # Or specify files explicitly
132
+ omnizip parity create backup.7z data.zip photos.tar.gz
133
+ ----
134
+
135
+ [source,ruby]
136
+ ----
137
+ # Ruby API: Add multiple files
138
+ creator = Omnizip::Parity::Par2Creator.new(redundancy: 15)
139
+ Dir.glob('*.zip').each { |file| creator.add_file(file) }
140
+ creator.create('archives')
141
+ ----
142
+
143
+ === Custom Output Directory
144
+
145
+ [source,sh]
146
+ ----
147
+ # Store PAR2 files separately
148
+ omnizip parity create --output-dir recovery/ *.zip
149
+
150
+ # Output structure:
151
+ # recovery/backup.par2
152
+ # recovery/backup.vol00+01.par2
153
+ # ...
154
+ ----
155
+
156
+ == Verifying Integrity
157
+
158
+ === Basic Verification
159
+
160
+ ==== CLI
161
+
162
+ [source,sh]
163
+ ----
164
+ # Verify all files
165
+ omnizip parity verify backup.par2
166
+ ----
167
+
168
+ **Output (all intact):**
169
+ [source,text]
170
+ ----
171
+ Verifying backup.par2...
172
+
173
+ Files verified:
174
+ ✓ important.zip (2.4 MB) - OK
175
+ ✓ documents.tar.gz (1.8 MB) - OK
176
+
177
+ Summary:
178
+ Files: 2 verified, 0 damaged
179
+ Blocks: 256 verified, 0 damaged
180
+ Status: All files intact
181
+ ----
182
+
183
+ **Output (damage detected):**
184
+ [source,text]
185
+ ----
186
+ Files verified:
187
+ ✗ important.zip (2.4 MB) - DAMAGED (3 blocks corrupted)
188
+ ✓ documents.tar.gz (1.8 MB) - OK
189
+
190
+ Summary:
191
+ Files: 1 verified, 1 damaged
192
+ Blocks: 253 verified, 3 damaged
193
+ Status: DAMAGE DETECTED - Repairable
194
+ ----
195
+
196
+ ==== Ruby API
197
+
198
+ [source,ruby]
199
+ ----
200
+ require 'omnizip/parity'
201
+
202
+ # Verify files
203
+ verifier = Omnizip::Parity::Par2Verifier.new('backup.par2')
204
+ result = verifier.verify
205
+
206
+ if result.all_ok?
207
+ puts "All files intact!"
208
+ else
209
+ puts "Damaged files: #{result.damaged_files}"
210
+ puts "Damaged blocks: #{result.damaged_blocks.size}"
211
+ puts "Repairable: #{result.repairable?}"
212
+ end
213
+ ----
214
+
215
+ === Verbose Verification
216
+
217
+ [source,sh]
218
+ ----
219
+ # Show detailed block information
220
+ omnizip parity verify backup.par2 --verbose
221
+ ----
222
+
223
+ **Output:**
224
+ [source,text]
225
+ ----
226
+ Verifying backup.par2...
227
+
228
+ File: important.zip (2.4 MB, 150 blocks)
229
+ Block 0: ✓ OK (MD5: a1b2c3d4...)
230
+ Block 1: ✓ OK (MD5: e5f6g7h8...)
231
+ ...
232
+ Block 47: ✗ DAMAGED (expected: a1b2c3d4, got: ffffffff)
233
+ ...
234
+
235
+ Total: 147 OK, 3 damaged
236
+ Recovery available: Yes (10 recovery blocks)
237
+ ----
238
+
239
+ === Automated Verification
240
+
241
+ [source,ruby]
242
+ ----
243
+ # Verify before critical operations
244
+ def safe_extract(archive_file, par2_file)
245
+ verifier = Omnizip::Parity::Par2Verifier.new(par2_file)
246
+ result = verifier.verify
247
+
248
+ unless result.all_ok?
249
+ raise "Archive corrupted! Repair before extracting."
250
+ end
251
+
252
+ Omnizip.extract_archive(archive_file, 'output/')
253
+ end
254
+ ----
255
+
256
+ == Repairing Files
257
+
258
+ === Basic Repair
259
+
260
+ ==== CLI
261
+
262
+ [source,sh]
263
+ ----
264
+ # Repair damaged files in place
265
+ omnizip parity repair backup.par2
266
+ ----
267
+
268
+ **Output:**
269
+ [source,text]
270
+ ----
271
+ Repairing with backup.par2...
272
+
273
+ Analyzing damage:
274
+ important.zip: 3 damaged blocks (out of 150 total)
275
+
276
+ Loading recovery data:
277
+ backup.vol00+01.par2
278
+ backup.vol01+02.par2
279
+
280
+ Repairing:
281
+ important.zip: Reconstructing blocks 47, 89, 132... OK
282
+
283
+ Summary:
284
+ Files repaired: 1
285
+ Blocks recovered: 3
286
+ Status: All files successfully repaired
287
+ ----
288
+
289
+ ==== Ruby API
290
+
291
+ [source,ruby]
292
+ ----
293
+ require 'omnizip/parity'
294
+
295
+ # Repair damaged files
296
+ repairer = Omnizip::Parity::Par2Repairer.new('backup.par2')
297
+ result = repairer.repair
298
+
299
+ if result.success?
300
+ puts "Repaired files: #{result.recovered_files}"
301
+ puts "Recovered blocks: #{result.recovered_blocks}"
302
+ else
303
+ puts "Repair failed: #{result.error_message}"
304
+ end
305
+ ----
306
+
307
+ === Repair to Different Location
308
+
309
+ [source,sh]
310
+ ----
311
+ # Repair to separate directory (preserve originals)
312
+ omnizip parity repair backup.par2 --output-dir recovered/
313
+ ----
314
+
315
+ === Handling Missing Files
316
+
317
+ PAR2 can reconstruct completely missing files:
318
+
319
+ [source,sh]
320
+ ----
321
+ # Delete a file
322
+ rm important.zip
323
+
324
+ # PAR2 detects and reconstructs it
325
+ omnizip parity repair backup.par2
326
+ # Output: "Reconstructed missing file: important.zip"
327
+ ----
328
+
329
+ === Insufficient Recovery Data
330
+
331
+ [source,text]
332
+ ----
333
+ ERROR: Insufficient recovery data
334
+ Need 23 recovery blocks, but only 10 available
335
+ Cannot repair - 13 blocks unrecoverable
336
+
337
+ Recommendation: Increase redundancy to at least 16% for this scenario
338
+ ----
339
+
340
+ == Complete Workflow Examples
341
+
342
+ === Example 1: Archive Backup
343
+
344
+ [source,sh]
345
+ ----
346
+ # 1. Create archive
347
+ omnizip archive create backup.7z important_data/ --level 9
348
+
349
+ # 2. Create PAR2 (20% redundancy for critical data)
350
+ omnizip parity create --redundancy 20 backup.7z
351
+
352
+ # 3. Store together
353
+ mkdir backup-2025-11-23/
354
+ mv backup.7z backup.par2 backup.vol*.par2 backup-2025-11-23/
355
+
356
+ # Later: Verify before use
357
+ cd backup-2025-11-23/
358
+ omnizip parity verify backup.par2
359
+
360
+ # If needed: Repair
361
+ omnizip parity repair backup.par2
362
+ ----
363
+
364
+ === Example 2: Multi-File Protection
365
+
366
+ [source,ruby]
367
+ ----
368
+ require 'omnizip/parity'
369
+
370
+ # Create split archive
371
+ Omnizip::Formats::SevenZip.create('large.7z',
372
+ split_size: 50_000_000) do |archive|
373
+ archive.add_directory('massive_dataset/')
374
+ end
375
+ # Generates: large.7z.001, large.7z.002, ...
376
+
377
+ # Protect all volumes with PAR2
378
+ creator = Omnizip::Parity::Par2Creator.new(redundancy: 15)
379
+ Dir.glob('large.7z.*').each { |vol| creator.add_file(vol) }
380
+ creator.create('large')
381
+
382
+ # Verify all volumes
383
+ verifier = Omnizip::Parity::Par2Verifier.new('large.par2')
384
+ if verifier.verify.all_ok?
385
+ # Safe to extract
386
+ Omnizip::Formats::SevenZip::SplitArchiveReader.new('large.7z.001')
387
+ .extract_all('output/')
388
+ end
389
+ ----
390
+
391
+ === Example 3: Automated Testing
392
+
393
+ [source,ruby]
394
+ ----
395
+ require 'omnizip/parity'
396
+
397
+ def create_verified_archive(source_dir, archive_name)
398
+ # Create archive
399
+ Omnizip.compress_directory(source_dir, "#{archive_name}.7z")
400
+
401
+ # Create PAR2
402
+ creator = Omnizip::Parity::Par2Creator.new(redundancy: 10)
403
+ creator.add_file("#{archive_name}.7z")
404
+ creator.create(archive_name)
405
+
406
+ # Immediate verification
407
+ verifier = Omnizip::Parity::Par2Verifier.new("#{archive_name}.par2")
408
+ result = verifier.verify
409
+
410
+ unless result.all_ok?
411
+ raise "PAR2 creation failed verification!"
412
+ end
413
+
414
+ puts "✓ Created and verified: #{archive_name}.7z"
415
+ end
416
+ ----
417
+
418
+ == Best Practices
419
+
420
+ === Redundancy Guidelines
421
+
422
+ [cols="25,25,50",options="header"]
423
+ |===
424
+ |Scenario |Redundancy |Rationale
425
+
426
+ |Temporary files
427
+ |5%
428
+ |Minimal protection for short-term use
429
+
430
+ |Standard backups
431
+ |10-15%
432
+ |Good balance for most use cases
433
+
434
+ |Critical data
435
+ |20-30%
436
+ |Higher protection for important files
437
+
438
+ |Archival
439
+ |50-100%
440
+ |Maximum protection for long-term storage
441
+
442
+ |===
443
+
444
+ === Block Size Guidelines
445
+
446
+ [cols="25,25,50",options="header"]
447
+ |===
448
+ |File Size |Block Size |Rationale
449
+
450
+ |< 10 MB
451
+ |8 KB
452
+ |Fine-grained recovery for small files
453
+
454
+ |10-100 MB
455
+ |16 KB
456
+ |Default, good for most files
457
+
458
+ |100 MB - 1 GB
459
+ |32 KB
460
+ |Larger blocks for efficiency
461
+
462
+ |> 1 GB
463
+ |64 KB
464
+ |Minimize metadata overhead
465
+
466
+ |===
467
+
468
+ === Storage Recommendations
469
+
470
+ **Keep Together**: Store PAR2 files with protected files
471
+ [source,text]
472
+ ----
473
+ backup/
474
+ ├── data.7z
475
+ ├── data.par2
476
+ ├── data.vol00+01.par2
477
+ └── data.vol01+02.par2
478
+ ----
479
+
480
+ **Verify After Creation**: Always verify immediately after creating PAR2
481
+ [source,sh]
482
+ ----
483
+ omnizip parity create data.7z && omnizip parity verify data.par2
484
+ ----
485
+
486
+ **Test Recovery**: Periodically test repair functionality
487
+ [source,sh]
488
+ ----
489
+ # Make backup copy
490
+ cp important.zip important.zip.backup
491
+
492
+ # Simulate damage and test repair
493
+ dd if=/dev/zero of=important.zip bs=1024 count=100 seek=1000 conv=notrunc
494
+ omnizip parity repair important.par2
495
+
496
+ # Verify repair worked
497
+ diff important.zip important.zip.backup
498
+ ----
499
+
500
+ === Performance Optimization
501
+
502
+ **Parallel Processing**: Use appropriate block sizes for CPU utilization
503
+
504
+ **Memory Usage**: Larger files may require streaming mode (future feature)
505
+
506
+ **I/O Optimization**: Create PAR2 files on same drive as source files
507
+
508
+ == Troubleshooting
509
+
510
+ === Common Issues
511
+
512
+ **Issue**: "Insufficient recovery data"
513
+
514
+ **Solution**: Increase redundancy when creating PAR2:
515
+ [source,sh]
516
+ ----
517
+ omnizip parity create --redundancy 20 file.zip
518
+ ----
519
+
520
+ **Issue**: "File not found: xyz.par2"
521
+
522
+ **Solution**: Ensure .par2 index file is in current directory or specify full path:
523
+ [source,sh]
524
+ ----
525
+ omnizip parity verify /path/to/backup.par2
526
+ ----
527
+
528
+ **Issue**: Slow PAR2 creation
529
+
530
+ **Solution**: Increase block size for large files:
531
+ [source,sh]
532
+ ----
533
+ omnizip parity create --block-size 65536 huge-file.7z
534
+ ----
535
+
536
+ **Issue**: "MD5 mismatch" during verify
537
+
538
+ **Solution**: File is corrupted, use repair:
539
+ [source,sh]
540
+ ----
541
+ omnizip parity repair backup.par2
542
+ ----
543
+
544
+ === Debugging
545
+
546
+ **Verbose mode** for detailed information:
547
+ [source,sh]
548
+ ----
549
+ omnizip parity verify backup.par2 --verbose
550
+ omnizip parity repair backup.par2 --verbose
551
+ ----
552
+
553
+ **Check PAR2 file integrity**:
554
+ [source,ruby]
555
+ ----
556
+ require 'omnizip/parity'
557
+
558
+ begin
559
+ verifier = Omnizip::Parity::Par2Verifier.new('backup.par2')
560
+ result = verifier.verify
561
+ puts "PAR2 file is valid"
562
+ rescue => e
563
+ puts "PAR2 file is corrupted: #{e.message}"
564
+ end
565
+ ----
566
+
567
+ == Technical Details
568
+
569
+ === Reed-Solomon Encoding
570
+
571
+ PAR2 uses Reed-Solomon codes over Galois Field GF(2^16):
572
+
573
+ **Encoding**: Creates parity blocks from original blocks using Vandermonde matrix multiplication
574
+
575
+ **Decoding**: Reconstructs missing blocks via Gaussian elimination with partial pivoting
576
+
577
+ **Mathematics**: Each recovery block is a linear combination of original blocks in GF(2^16)
578
+
579
+ === File Format
580
+
581
+ **Main Packet** (`.par2`)::
582
+ * File descriptors with MD5 hashes
583
+ * Block checksums
584
+ * Recovery set information
585
+
586
+ **Recovery Volumes** (`.vol??+??.par2`)::
587
+ * Recovery blocks
588
+ * Indexed for efficient access
589
+ * Multiple volumes for large recovery sets
590
+
591
+ === Compatibility
592
+
593
+ Omnizip's PAR2 implementation is compatible with:
594
+
595
+ * **par2cmdline**: Reference implementation (tested and verified)
596
+ * **MultiPar**: Windows PAR2 tool
597
+ * **QuickPar**: Legacy Windows tool
598
+ * **gopar**: Go implementation
599
+
600
+ == See Also
601
+
602
+ * link:creating-archives.html[Creating Archives]
603
+ * link:../reference/cli/overview.html[CLI Reference]
604
+ * link:../reference/api/overview.html[Ruby API]
605
+ * link:../comparison/feature-matrix.html[Feature Comparison]
@@ -0,0 +1,88 @@
1
+ ---
2
+ title: Performance Tuning
3
+ nav_order: 5
4
+ parent: Guides
5
+ ---
6
+
7
+ == Performance Tuning
8
+
9
+ Guide to optimizing compression speed and ratio.
10
+
11
+ == Choosing Compression Level
12
+
13
+ [source,ruby]
14
+ ----
15
+ # Fast compression (level 1-3)
16
+ Omnizip.compress_file('file.txt', 'fast.lzma', level: 1)
17
+
18
+ # Balanced (level 4-6) - Default: 5
19
+ Omnizip.compress_file('file.txt', 'balanced.lzma', level: 5)
20
+
21
+ # Maximum compression (level 7-9)
22
+ Omnizip.compress_file('file.txt', 'best.lzma', level: 9)
23
+ ----
24
+
25
+ == Algorithm Selection
26
+
27
+ [source,ruby]
28
+ ----
29
+ # Fastest: Deflate
30
+ Omnizip.compress_file('file.txt', 'fast.zip', algorithm: :deflate, level: 1)
31
+
32
+ # Best ratio: LZMA2
33
+ Omnizip.compress_file('file.txt', 'best.7z', algorithm: :lzma2, level: 9)
34
+
35
+ # Balanced: BZip2
36
+ Omnizip.compress_file('file.txt', 'balanced.bz2', algorithm: :bzip2, level: 6)
37
+ ----
38
+
39
+ == Streaming for Large Files
40
+
41
+ [source,ruby]
42
+ ----
43
+ # Avoid loading entire file into memory
44
+ File.open('large_input.txt', 'rb') do |input|
45
+ File.open('large_output.lzma', 'wb') do |output|
46
+ algorithm = Omnizip::AlgorithmRegistry.get(:lzma).new(level: 5)
47
+ algorithm.compress(input, output)
48
+ end
49
+ end
50
+ ----
51
+
52
+ == Performance Characteristics
53
+
54
+ [cols="25,25,25,25",options="header"]
55
+ |===
56
+ |Algorithm |Speed |Ratio |Use Case
57
+
58
+ |Deflate
59
+ |Fast
60
+ |Good
61
+ |ZIP compatibility
62
+
63
+ |Deflate64
64
+ |Fast
65
+ |Better
66
+ |Large ZIP files
67
+
68
+ |BZip2
69
+ |Moderate
70
+ |Very Good
71
+ |Text files
72
+
73
+ |LZMA/LZMA2
74
+ |Slow
75
+ |Excellent
76
+ |Maximum compression
77
+
78
+ |Zstandard
79
+ |Very Fast
80
+ |Good
81
+ |Modern apps
82
+
83
+ |===
84
+
85
+ == See Also
86
+
87
+ * link:../comparison/feature-matrix.html[Feature Comparison]
88
+ * link:../reference/index.html[Reference Documentation]