omnizip 0.4.7-arm-linux

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 (632) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +293 -0
  5. data/CHANGELOG.md +1647 -0
  6. data/CONTEXT.md +68 -0
  7. data/COPYING +502 -0
  8. data/Gemfile +19 -0
  9. data/LICENSE +12 -0
  10. data/README.adoc +1327 -0
  11. data/Rakefile +15 -0
  12. data/TODO.refactor/00-overview.md +67 -0
  13. data/TODO.refactor/01-registry-base-class.md +81 -0
  14. data/TODO.refactor/02-error-hierarchy.md +57 -0
  15. data/TODO.refactor/03-autoload-entry-point.md +69 -0
  16. data/TODO.refactor/04-filter-base-consolidation.md +49 -0
  17. data/TODO.refactor/05-send-private-methods.md +64 -0
  18. data/TODO.refactor/06-instance-variable-access.md +69 -0
  19. data/TODO.refactor/07-respond-to-replacement.md +237 -0
  20. data/TODO.refactor/08-spec-doubles.md +27 -0
  21. data/TODO.refactor/09-cli-shared-module.md +35 -0
  22. data/TODO.refactor/10-format-detector-ocp.md +34 -0
  23. data/TODO.refactor/11-convenience-decoupling.md +38 -0
  24. data/TODO.refactor/12-thread-safety.md +8 -0
  25. data/TODO.refactor/13-lutaml-model-migration.md +158 -0
  26. data/TODO.refactor/14-add-missing-specs.md +25 -0
  27. data/benchmark/README.md +260 -0
  28. data/benchmark/benchmark_suite.rb +125 -0
  29. data/benchmark/compression_bench.rb +181 -0
  30. data/benchmark/filter_bench.rb +180 -0
  31. data/benchmark/models/benchmark_result.rb +59 -0
  32. data/benchmark/models/comparison_result.rb +69 -0
  33. data/benchmark/profile_suite.rb +167 -0
  34. data/benchmark/reporter.rb +150 -0
  35. data/benchmark/run_benchmarks.rb +66 -0
  36. data/benchmark/test_data.rb +137 -0
  37. data/config/formats/rar3_spec.yml +92 -0
  38. data/config/formats/rar5_spec.yml +102 -0
  39. data/docs/.github/workflows/docs.yml +142 -0
  40. data/docs/.gitignore +21 -0
  41. data/docs/.lychee.toml +67 -0
  42. data/docs/Gemfile +13 -0
  43. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  44. data/docs/README.md +101 -0
  45. data/docs/_config.yml +112 -0
  46. data/docs/assets/logo.svg +1 -0
  47. data/docs/assets/omnizip-logo.pdf +1540 -11
  48. data/docs/comparison/feature-matrix.adoc +694 -0
  49. data/docs/comparison/index.adoc +113 -0
  50. data/docs/comparison/vs-7zip.adoc +309 -0
  51. data/docs/comparison/vs-peazip.adoc +77 -0
  52. data/docs/comparison/vs-rubyzip.adoc +342 -0
  53. data/docs/comparison/vs-winrar.adoc +100 -0
  54. data/docs/compatibility.adoc +579 -0
  55. data/docs/concepts/index.adoc +129 -0
  56. data/docs/developer/architecture.adoc +256 -0
  57. data/docs/developer/contributing.adoc +158 -0
  58. data/docs/developer/index.adoc +25 -0
  59. data/docs/developer/testing.adoc +212 -0
  60. data/docs/getting-started/basic-usage.adoc +263 -0
  61. data/docs/getting-started/index.adoc +42 -0
  62. data/docs/getting-started/installation.adoc +138 -0
  63. data/docs/getting-started/quick-start.adoc +183 -0
  64. data/docs/getting-started/your-first-archive.adoc +219 -0
  65. data/docs/guides/advanced-features/encryption.adoc +277 -0
  66. data/docs/guides/advanced-features/index.adoc +59 -0
  67. data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
  68. data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
  69. data/docs/guides/advanced-features/streaming.adoc +142 -0
  70. data/docs/guides/archive-formats/gzip-format.adoc +105 -0
  71. data/docs/guides/archive-formats/index.adoc +160 -0
  72. data/docs/guides/archive-formats/ole-format.adoc +151 -0
  73. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  74. data/docs/guides/archive-formats/rar5.adoc +521 -0
  75. data/docs/guides/archive-formats/rpm-format.adoc +108 -0
  76. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  77. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  78. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  79. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  80. data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
  81. data/docs/guides/compression-algorithms/deflate.adoc +313 -0
  82. data/docs/guides/compression-algorithms/index.adoc +190 -0
  83. data/docs/guides/compression-algorithms/lzma.adoc +394 -0
  84. data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
  85. data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
  86. data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
  87. data/docs/guides/creating-archives.adoc +348 -0
  88. data/docs/guides/extracting-archives.adoc +53 -0
  89. data/docs/guides/format-conversion.adoc +64 -0
  90. data/docs/guides/index.adoc +49 -0
  91. data/docs/guides/migration-rubyzip.adoc +217 -0
  92. data/docs/guides/parity-archives.adoc +605 -0
  93. data/docs/guides/performance-tuning.adoc +88 -0
  94. data/docs/index.adoc +228 -0
  95. data/docs/lychee.toml +67 -0
  96. data/docs/reference/api/overview.adoc +187 -0
  97. data/docs/reference/cli/compress-command.adoc +114 -0
  98. data/docs/reference/cli/overview.adoc +140 -0
  99. data/docs/reference/index.adoc +26 -0
  100. data/docs/resources/faq.adoc +185 -0
  101. data/docs/resources/quick-reference.adoc +222 -0
  102. data/docs/rust-backend.md +0 -0
  103. data/docs/troubleshooting/index.adoc +207 -0
  104. data/docs/xar_format.md +216 -0
  105. data/examples/api_comparison.rb +205 -0
  106. data/examples/deflate64_example.rb +96 -0
  107. data/examples/par2_demo.rb +121 -0
  108. data/examples/quick_start_native.rb +150 -0
  109. data/examples/quick_start_rubyzip.rb +115 -0
  110. data/examples/rubyzip_compatibility_demo.rb +194 -0
  111. data/exe/omnizip +27 -0
  112. data/lib/omnizip/algorithm.rb +176 -0
  113. data/lib/omnizip/algorithm_registry.rb +65 -0
  114. data/lib/omnizip/algorithms/.keep +0 -0
  115. data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
  116. data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
  117. data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
  118. data/lib/omnizip/algorithms/bzip2.rb +108 -0
  119. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  120. data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
  121. data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
  122. data/lib/omnizip/algorithms/deflate.rb +135 -0
  123. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  124. data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
  125. data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
  126. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
  127. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
  128. data/lib/omnizip/algorithms/deflate64.rb +118 -0
  129. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  130. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  131. data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
  132. data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
  133. data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
  134. data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
  135. data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
  136. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
  137. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
  138. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
  139. data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
  140. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
  141. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  142. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  143. data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
  144. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  145. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
  146. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
  147. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  148. data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
  149. data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
  150. data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
  151. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  152. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
  153. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
  154. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
  155. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
  156. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
  157. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
  158. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  159. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
  160. data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
  161. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
  162. data/lib/omnizip/algorithms/lzma.rb +266 -0
  163. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
  164. data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
  165. data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
  166. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
  167. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  168. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
  169. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  170. data/lib/omnizip/algorithms/lzma2.rb +133 -0
  171. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  172. data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
  173. data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
  174. data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
  175. data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
  176. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  177. data/lib/omnizip/algorithms/ppmd7.rb +146 -0
  178. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  179. data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
  180. data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
  181. data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
  182. data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
  183. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  184. data/lib/omnizip/algorithms/ppmd8.rb +122 -0
  185. data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
  186. data/lib/omnizip/algorithms/registration.rb +28 -0
  187. data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
  188. data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
  189. data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
  190. data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
  191. data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
  192. data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
  193. data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
  194. data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
  195. data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
  196. data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
  197. data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
  198. data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
  199. data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
  200. data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
  201. data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
  202. data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
  203. data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
  204. data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
  205. data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
  206. data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
  207. data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
  208. data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
  209. data/lib/omnizip/algorithms/zstandard.rb +210 -0
  210. data/lib/omnizip/algorithms.rb +35 -0
  211. data/lib/omnizip/archive/builder.rb +48 -0
  212. data/lib/omnizip/archive/reader_session.rb +67 -0
  213. data/lib/omnizip/archive.rb +86 -0
  214. data/lib/omnizip/archive_handler.rb +82 -0
  215. data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
  216. data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
  217. data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
  218. data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
  219. data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
  220. data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
  221. data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
  222. data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
  223. data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
  224. data/lib/omnizip/archive_handlers.rb +18 -0
  225. data/lib/omnizip/backends.rb +160 -0
  226. data/lib/omnizip/buffer/memory_archive.rb +246 -0
  227. data/lib/omnizip/buffer/memory_extractor.rb +234 -0
  228. data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
  229. data/lib/omnizip/buffer.rb +187 -0
  230. data/lib/omnizip/checksum_registry.rb +41 -0
  231. data/lib/omnizip/checksums/crc32.rb +101 -0
  232. data/lib/omnizip/checksums/crc64.rb +102 -0
  233. data/lib/omnizip/checksums/crc_base.rb +158 -0
  234. data/lib/omnizip/checksums/registration.rb +16 -0
  235. data/lib/omnizip/checksums/verifier.rb +130 -0
  236. data/lib/omnizip/checksums.rb +11 -0
  237. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  238. data/lib/omnizip/chunked/reader.rb +78 -0
  239. data/lib/omnizip/chunked/writer.rb +123 -0
  240. data/lib/omnizip/chunked.rb +123 -0
  241. data/lib/omnizip/cli/output_formatter.rb +112 -0
  242. data/lib/omnizip/cli.rb +604 -0
  243. data/lib/omnizip/commands/.keep +0 -0
  244. data/lib/omnizip/commands/archive_create_command.rb +245 -0
  245. data/lib/omnizip/commands/archive_extract_command.rb +231 -0
  246. data/lib/omnizip/commands/archive_list_command.rb +204 -0
  247. data/lib/omnizip/commands/archive_repair_command.rb +129 -0
  248. data/lib/omnizip/commands/archive_verify_command.rb +115 -0
  249. data/lib/omnizip/commands/compress_command.rb +115 -0
  250. data/lib/omnizip/commands/decompress_command.rb +149 -0
  251. data/lib/omnizip/commands/list_command.rb +51 -0
  252. data/lib/omnizip/commands/metadata_command.rb +215 -0
  253. data/lib/omnizip/commands/parity_create_command.rb +114 -0
  254. data/lib/omnizip/commands/parity_repair_command.rb +120 -0
  255. data/lib/omnizip/commands/parity_verify_command.rb +122 -0
  256. data/lib/omnizip/commands/profile_list_command.rb +54 -0
  257. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  258. data/lib/omnizip/commands.rb +21 -0
  259. data/lib/omnizip/convenience.rb +389 -0
  260. data/lib/omnizip/converter/conversion_registry.rb +50 -0
  261. data/lib/omnizip/converter/conversion_strategy.rb +108 -0
  262. data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
  263. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
  264. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
  265. data/lib/omnizip/converter.rb +124 -0
  266. data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
  267. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  268. data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
  269. data/lib/omnizip/crypto/aes256.rb +102 -0
  270. data/lib/omnizip/crypto.rb +11 -0
  271. data/lib/omnizip/entry.rb +44 -0
  272. data/lib/omnizip/error.rb +110 -0
  273. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
  274. data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
  275. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  276. data/lib/omnizip/eta/sample_history.rb +143 -0
  277. data/lib/omnizip/eta/time_estimator.rb +106 -0
  278. data/lib/omnizip/eta.rb +68 -0
  279. data/lib/omnizip/extraction/filter_chain.rb +179 -0
  280. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  281. data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
  282. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  283. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  284. data/lib/omnizip/extraction/selective_extractor.rb +247 -0
  285. data/lib/omnizip/extraction.rb +115 -0
  286. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  287. data/lib/omnizip/file_type.rb +117 -0
  288. data/lib/omnizip/filter.rb +141 -0
  289. data/lib/omnizip/filter_pipeline.rb +108 -0
  290. data/lib/omnizip/filter_registry.rb +113 -0
  291. data/lib/omnizip/filters/bcj.rb +277 -0
  292. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  293. data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
  294. data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
  295. data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
  296. data/lib/omnizip/filters/bcj2.rb +93 -0
  297. data/lib/omnizip/filters/bcj_arm.rb +174 -0
  298. data/lib/omnizip/filters/bcj_arm64.rb +242 -0
  299. data/lib/omnizip/filters/bcj_ia64.rb +194 -0
  300. data/lib/omnizip/filters/bcj_ppc.rb +188 -0
  301. data/lib/omnizip/filters/bcj_sparc.rb +174 -0
  302. data/lib/omnizip/filters/bcj_x86.rb +191 -0
  303. data/lib/omnizip/filters/delta.rb +195 -0
  304. data/lib/omnizip/filters/xz_delta.rb +258 -0
  305. data/lib/omnizip/filters.rb +20 -0
  306. data/lib/omnizip/format_detector.rb +166 -0
  307. data/lib/omnizip/formats/.keep +0 -0
  308. data/lib/omnizip/formats/bzip2_file.rb +159 -0
  309. data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
  310. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  311. data/lib/omnizip/formats/cpio/entry.rb +389 -0
  312. data/lib/omnizip/formats/cpio/reader.rb +194 -0
  313. data/lib/omnizip/formats/cpio/writer.rb +232 -0
  314. data/lib/omnizip/formats/cpio.rb +132 -0
  315. data/lib/omnizip/formats/format_spec_loader.rb +228 -0
  316. data/lib/omnizip/formats/gzip.rb +236 -0
  317. data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
  318. data/lib/omnizip/formats/iso/directory_record.rb +162 -0
  319. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  320. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  321. data/lib/omnizip/formats/iso/reader.rb +194 -0
  322. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  323. data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
  324. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  325. data/lib/omnizip/formats/iso/writer.rb +543 -0
  326. data/lib/omnizip/formats/iso.rb +133 -0
  327. data/lib/omnizip/formats/lzip.rb +161 -0
  328. data/lib/omnizip/formats/lzma_alone.rb +149 -0
  329. data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
  330. data/lib/omnizip/formats/msi/constants.rb +157 -0
  331. data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
  332. data/lib/omnizip/formats/msi/entry.rb +134 -0
  333. data/lib/omnizip/formats/msi/reader.rb +301 -0
  334. data/lib/omnizip/formats/msi/string_pool.rb +246 -0
  335. data/lib/omnizip/formats/msi/table_parser.rb +244 -0
  336. data/lib/omnizip/formats/msi.rb +73 -0
  337. data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
  338. data/lib/omnizip/formats/ole/constants.rb +61 -0
  339. data/lib/omnizip/formats/ole/dirent.rb +439 -0
  340. data/lib/omnizip/formats/ole/header.rb +199 -0
  341. data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
  342. data/lib/omnizip/formats/ole/storage.rb +482 -0
  343. data/lib/omnizip/formats/ole/types/variant.rb +338 -0
  344. data/lib/omnizip/formats/ole.rb +143 -0
  345. data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
  346. data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
  347. data/lib/omnizip/formats/rar/block_parser.rb +282 -0
  348. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  349. data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
  350. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
  351. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
  352. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  353. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  354. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  355. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  356. data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
  357. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
  358. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
  359. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
  360. data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
  361. data/lib/omnizip/formats/rar/compression.rb +17 -0
  362. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  363. data/lib/omnizip/formats/rar/constants.rb +88 -0
  364. data/lib/omnizip/formats/rar/decompressor.rb +316 -0
  365. data/lib/omnizip/formats/rar/external_writer.rb +311 -0
  366. data/lib/omnizip/formats/rar/header.rb +209 -0
  367. data/lib/omnizip/formats/rar/license_validator.rb +111 -0
  368. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  369. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  370. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  371. data/lib/omnizip/formats/rar/models.rb +14 -0
  372. data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
  373. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
  374. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
  375. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  376. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  377. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
  378. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  379. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
  380. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  381. data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
  382. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  383. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  384. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  385. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  386. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  387. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
  388. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  389. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
  390. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
  391. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
  392. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  393. data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
  394. data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
  395. data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
  396. data/lib/omnizip/formats/rar/reader.rb +377 -0
  397. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  398. data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
  399. data/lib/omnizip/formats/rar/writer.rb +437 -0
  400. data/lib/omnizip/formats/rar.rb +193 -0
  401. data/lib/omnizip/formats/rar3/compressor.rb +71 -0
  402. data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
  403. data/lib/omnizip/formats/rar3/reader.rb +107 -0
  404. data/lib/omnizip/formats/rar3/writer.rb +220 -0
  405. data/lib/omnizip/formats/rar3.rb +15 -0
  406. data/lib/omnizip/formats/rar5/compressor.rb +71 -0
  407. data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
  408. data/lib/omnizip/formats/rar5/reader.rb +130 -0
  409. data/lib/omnizip/formats/rar5/writer.rb +65 -0
  410. data/lib/omnizip/formats/rar5.rb +15 -0
  411. data/lib/omnizip/formats/rpm/constants.rb +58 -0
  412. data/lib/omnizip/formats/rpm/entry.rb +106 -0
  413. data/lib/omnizip/formats/rpm/header.rb +106 -0
  414. data/lib/omnizip/formats/rpm/lead.rb +132 -0
  415. data/lib/omnizip/formats/rpm/tag.rb +228 -0
  416. data/lib/omnizip/formats/rpm/writer.rb +652 -0
  417. data/lib/omnizip/formats/rpm.rb +458 -0
  418. data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
  419. data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
  420. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  421. data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
  422. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
  423. data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
  424. data/lib/omnizip/formats/seven_zip/header.rb +102 -0
  425. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
  426. data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
  427. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  428. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
  429. data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
  430. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  431. data/lib/omnizip/formats/seven_zip/models.rb +20 -0
  432. data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
  433. data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
  434. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
  435. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
  436. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  437. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
  438. data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
  439. data/lib/omnizip/formats/seven_zip.rb +179 -0
  440. data/lib/omnizip/formats/tar/constants.rb +73 -0
  441. data/lib/omnizip/formats/tar/entry.rb +98 -0
  442. data/lib/omnizip/formats/tar/header.rb +206 -0
  443. data/lib/omnizip/formats/tar/reader.rb +119 -0
  444. data/lib/omnizip/formats/tar/writer.rb +212 -0
  445. data/lib/omnizip/formats/tar.rb +74 -0
  446. data/lib/omnizip/formats/xar/constants.rb +119 -0
  447. data/lib/omnizip/formats/xar/entry.rb +268 -0
  448. data/lib/omnizip/formats/xar/header.rb +223 -0
  449. data/lib/omnizip/formats/xar/reader.rb +400 -0
  450. data/lib/omnizip/formats/xar/toc.rb +570 -0
  451. data/lib/omnizip/formats/xar/writer.rb +461 -0
  452. data/lib/omnizip/formats/xar.rb +145 -0
  453. data/lib/omnizip/formats/xz/reader.rb +121 -0
  454. data/lib/omnizip/formats/xz/writer.rb +416 -0
  455. data/lib/omnizip/formats/xz.rb +210 -0
  456. data/lib/omnizip/formats/xz_const.rb +49 -0
  457. data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
  458. data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
  459. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  460. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
  461. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  462. data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
  463. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
  464. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
  465. data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
  466. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
  467. data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
  468. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
  469. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  470. data/lib/omnizip/formats/xz_impl.rb +52 -0
  471. data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
  472. data/lib/omnizip/formats/zip/constants.rb +69 -0
  473. data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
  474. data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
  475. data/lib/omnizip/formats/zip/reader.rb +376 -0
  476. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  477. data/lib/omnizip/formats/zip/writer.rb +489 -0
  478. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
  479. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
  480. data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
  481. data/lib/omnizip/formats/zip.rb +50 -0
  482. data/lib/omnizip/formats.rb +29 -0
  483. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  484. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  485. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  486. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  487. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  488. data/lib/omnizip/implementations/base.rb +19 -0
  489. data/lib/omnizip/implementations/rust/archive.rb +93 -0
  490. data/lib/omnizip/implementations/rust/library.rb +221 -0
  491. data/lib/omnizip/implementations/rust.rb +26 -0
  492. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
  493. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
  494. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
  495. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
  496. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
  497. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
  498. data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
  499. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
  500. data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
  501. data/lib/omnizip/implementations/seven_zip.rb +11 -0
  502. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
  503. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
  504. data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
  505. data/lib/omnizip/implementations/xz_utils.rb +10 -0
  506. data/lib/omnizip/implementations.rb +25 -0
  507. data/lib/omnizip/io/buffered_input.rb +147 -0
  508. data/lib/omnizip/io/buffered_output.rb +106 -0
  509. data/lib/omnizip/io/source.rb +143 -0
  510. data/lib/omnizip/io/stream_manager.rb +117 -0
  511. data/lib/omnizip/io.rb +15 -0
  512. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  513. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  514. data/lib/omnizip/link_handler.rb +129 -0
  515. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  516. data/lib/omnizip/metadata/entry_metadata.rb +153 -0
  517. data/lib/omnizip/metadata/metadata_editor.rb +169 -0
  518. data/lib/omnizip/metadata/metadata_registry.rb +71 -0
  519. data/lib/omnizip/metadata/metadata_validator.rb +101 -0
  520. data/lib/omnizip/metadata.rb +58 -0
  521. data/lib/omnizip/models/.keep +0 -0
  522. data/lib/omnizip/models/algorithm_metadata.rb +41 -0
  523. data/lib/omnizip/models/attribute_apply.rb +40 -0
  524. data/lib/omnizip/models/compression_options.rb +53 -0
  525. data/lib/omnizip/models/conversion_options.rb +79 -0
  526. data/lib/omnizip/models/conversion_result.rb +141 -0
  527. data/lib/omnizip/models/eta_result.rb +45 -0
  528. data/lib/omnizip/models/extraction_rule.rb +115 -0
  529. data/lib/omnizip/models/filter_chain.rb +142 -0
  530. data/lib/omnizip/models/filter_config.rb +148 -0
  531. data/lib/omnizip/models/match_result.rb +141 -0
  532. data/lib/omnizip/models/optimization_suggestion.rb +95 -0
  533. data/lib/omnizip/models/parallel_options.rb +116 -0
  534. data/lib/omnizip/models/performance_result.rb +85 -0
  535. data/lib/omnizip/models/profile_report.rb +116 -0
  536. data/lib/omnizip/models/progress_options.rb +39 -0
  537. data/lib/omnizip/models/split_options.rb +116 -0
  538. data/lib/omnizip/optimization_registry.rb +45 -0
  539. data/lib/omnizip/parallel/engine.rb +52 -0
  540. data/lib/omnizip/parallel/job_queue.rb +209 -0
  541. data/lib/omnizip/parallel/job_scheduler.rb +225 -0
  542. data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
  543. data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
  544. data/lib/omnizip/parallel/thread_pool.rb +60 -0
  545. data/lib/omnizip/parallel/worker_pool.rb +227 -0
  546. data/lib/omnizip/parallel.rb +156 -0
  547. data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
  548. data/lib/omnizip/parity/galois16.rb +145 -0
  549. data/lib/omnizip/parity/models/creator_packet.rb +71 -0
  550. data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
  551. data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
  552. data/lib/omnizip/parity/models/main_packet.rb +126 -0
  553. data/lib/omnizip/parity/models/packet.rb +156 -0
  554. data/lib/omnizip/parity/models/packet_registry.rb +102 -0
  555. data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
  556. data/lib/omnizip/parity/models.rb +27 -0
  557. data/lib/omnizip/parity/par2_creator.rb +496 -0
  558. data/lib/omnizip/parity/par2_repairer.rb +409 -0
  559. data/lib/omnizip/parity/par2_verifier.rb +373 -0
  560. data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
  561. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  562. data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
  563. data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
  564. data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
  565. data/lib/omnizip/parity.rb +207 -0
  566. data/lib/omnizip/password/encryption_registry.rb +26 -0
  567. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  568. data/lib/omnizip/password/password_validator.rb +129 -0
  569. data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
  570. data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
  571. data/lib/omnizip/password.rb +88 -0
  572. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  573. data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
  574. data/lib/omnizip/pipe.rb +120 -0
  575. data/lib/omnizip/platform/ntfs_streams.rb +200 -0
  576. data/lib/omnizip/platform.rb +189 -0
  577. data/lib/omnizip/profile/archive_profile.rb +36 -0
  578. data/lib/omnizip/profile/balanced_profile.rb +31 -0
  579. data/lib/omnizip/profile/binary_profile.rb +33 -0
  580. data/lib/omnizip/profile/compression_profile.rb +157 -0
  581. data/lib/omnizip/profile/custom_profile.rb +155 -0
  582. data/lib/omnizip/profile/fast_profile.rb +31 -0
  583. data/lib/omnizip/profile/maximum_profile.rb +31 -0
  584. data/lib/omnizip/profile/profile_detector.rb +108 -0
  585. data/lib/omnizip/profile/profile_registry.rb +160 -0
  586. data/lib/omnizip/profile/text_profile.rb +33 -0
  587. data/lib/omnizip/profile.rb +261 -0
  588. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  589. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  590. data/lib/omnizip/profiler/report_generator.rb +158 -0
  591. data/lib/omnizip/profiler.rb +192 -0
  592. data/lib/omnizip/progress/callback_reporter.rb +34 -0
  593. data/lib/omnizip/progress/console_reporter.rb +59 -0
  594. data/lib/omnizip/progress/log_reporter.rb +89 -0
  595. data/lib/omnizip/progress/operation_progress.rb +118 -0
  596. data/lib/omnizip/progress/progress_bar.rb +156 -0
  597. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  598. data/lib/omnizip/progress/progress_tracker.rb +215 -0
  599. data/lib/omnizip/progress/silent_reporter.rb +22 -0
  600. data/lib/omnizip/progress.rb +131 -0
  601. data/lib/omnizip/registry.rb +111 -0
  602. data/lib/omnizip/rubyzip_compat.rb +61 -0
  603. data/lib/omnizip/temp/safe_extract.rb +124 -0
  604. data/lib/omnizip/temp/temp_file.rb +123 -0
  605. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  606. data/lib/omnizip/temp.rb +184 -0
  607. data/lib/omnizip/version.rb +5 -0
  608. data/lib/omnizip/zip/entry.rb +160 -0
  609. data/lib/omnizip/zip/file.rb +485 -0
  610. data/lib/omnizip/zip/input_stream.rb +270 -0
  611. data/lib/omnizip/zip/output_stream.rb +320 -0
  612. data/lib/omnizip/zip.rb +23 -0
  613. data/lib/omnizip.rb +157 -0
  614. data/lib/tasks/msi_test_files.rake +66 -0
  615. data/lib/tasks/platform_gems.rake +147 -0
  616. data/lib/tasks/rust_backend.rake +48 -0
  617. data/readme-docs/advanced-features.adoc +514 -0
  618. data/readme-docs/api-usage.adoc +445 -0
  619. data/readme-docs/architecture.adoc +450 -0
  620. data/readme-docs/archive-formats.adoc +479 -0
  621. data/readme-docs/cli-usage.adoc +222 -0
  622. data/readme-docs/compression-algorithms.adoc +446 -0
  623. data/readme-docs/compression-profiles.adoc +247 -0
  624. data/readme-docs/encryption-checksums.adoc +328 -0
  625. data/readme-docs/format-converter.adoc +316 -0
  626. data/readme-docs/installation.adoc +228 -0
  627. data/readme-docs/par2-archives.adoc +608 -0
  628. data/readme-docs/performance-profiler.adoc +389 -0
  629. data/readme-docs/preprocessing-filters.adoc +280 -0
  630. data/vendor/libomnizip_ffi.so +0 -0
  631. data/xz-file-format-1.2.1.txt +1174 -0
  632. metadata +768 -0
@@ -0,0 +1,65 @@
1
+ # frozen_string: true
2
+
3
+ require "fileutils"
4
+ require "tmpdir"
5
+
6
+ module Omnizip
7
+ module Formats
8
+ module Rar5
9
+ # RAR v5 archive writer
10
+ #
11
+ # @example Writing a RAR5 archive
12
+ # writer = Rar5::Writer.new
13
+ # File.open("archive.rar", "wb") do |file|
14
+ # entries = [
15
+ # {name: "file.txt", data: "content", time: Time.now}
16
+ # ]
17
+ # writer.write_archive(file, entries)
18
+ # end
19
+ class Writer < Omnizip::Formats::Rar::RarFormatBase
20
+ # Initialize a RAR v5 writer
21
+ def initialize
22
+ super("rar5")
23
+ end
24
+
25
+ # Write a RAR v5 archive
26
+ #
27
+ # Delegates to the primary `Formats::Rar::Rar5::Writer` so the
28
+ # output is spec-conformant and unrar-verified: entries spill
29
+ # to a temporary file, the primary writer produces the
30
+ # archive, and the bytes are copied into the given IO.
31
+ # Compression methods above :store are not official-RAR
32
+ # compatible, so the primary writer stores them (with a
33
+ # warning) rather than emitting an undecodable stream.
34
+ #
35
+ # @param io [IO] The output stream
36
+ # @param entries [Array<Hash>] The entries to write
37
+ # @return [void]
38
+ def write_archive(io, entries)
39
+ Dir.mktmpdir("omnizip_rar5_write") do |tmp|
40
+ archive_path = File.join(tmp, "archive.rar")
41
+ primary = Rar::Rar5::Writer.new(archive_path,
42
+ include_mtime: true,
43
+ include_crc32: true)
44
+
45
+ entries.each do |entry|
46
+ name = entry[:name] || entry["name"]
47
+ data = entry[:data] || entry["data"]
48
+ mtime = entry[:time] || entry["time"] || Time.now
49
+
50
+ file_path = File.join(tmp, "entries", name)
51
+ FileUtils.mkdir_p(File.dirname(file_path))
52
+ File.binwrite(file_path, data.to_s)
53
+ File.utime(mtime, mtime, file_path)
54
+
55
+ primary.add_file(file_path, name)
56
+ end
57
+
58
+ primary.write
59
+ io.write(File.binread(archive_path))
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ # Standalone RAR5 reader/writer tree (see Formats::Rar for the
6
+ # primary RAR support). Classes under this namespace load lazily;
7
+ # require "omnizip" first so sibling namespaces resolve.
8
+ module Rar5
9
+ autoload :Compressor, "omnizip/formats/rar5/compressor"
10
+ autoload :Decompressor, "omnizip/formats/rar5/decompressor"
11
+ autoload :Reader, "omnizip/formats/rar5/reader"
12
+ autoload :Writer, "omnizip/formats/rar5/writer"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Rpm
6
+ # RPM format constants
7
+ #
8
+ # Defines magic numbers, header constants, and type definitions
9
+ # for RPM package parsing.
10
+ module Constants
11
+ # RPM lead magic bytes
12
+ LEAD_MAGIC = "\xed\xab\xee\xdb".b
13
+
14
+ # RPM header magic bytes (8 bytes)
15
+ HEADER_MAGIC = "\x8e\xad\xe8\x01\x00\x00\x00\x00".b
16
+
17
+ # Lead structure size (96 bytes)
18
+ LEAD_SIZE = 96
19
+
20
+ # Header header size (16 bytes: magic + index_count + data_length)
21
+ HEADER_HEADER_SIZE = 16
22
+
23
+ # Tag entry size (16 bytes: tag + type + offset + count)
24
+ TAG_ENTRY_SIZE = 16
25
+
26
+ # Header signed type (signature present)
27
+ HEADER_SIGNED_TYPE = 5
28
+
29
+ # Package types
30
+ PACKAGE_BINARY = 0
31
+ PACKAGE_SOURCE = 1
32
+
33
+ # Dependency flags
34
+ FLAG_LESS = (1 << 1)
35
+ FLAG_GREATER = (1 << 2)
36
+ FLAG_EQUAL = (1 << 3)
37
+
38
+ # File flags
39
+ FILE_CONFIG = (1 << 0)
40
+ FILE_DOC = (1 << 1)
41
+ FILE_LICENSE = (1 << 3)
42
+ FILE_README = (1 << 4)
43
+
44
+ # Tag types
45
+ TYPE_NULL = 0
46
+ TYPE_CHAR = 1
47
+ TYPE_INT8 = 2
48
+ TYPE_INT16 = 3
49
+ TYPE_INT32 = 4
50
+ TYPE_INT64 = 5
51
+ TYPE_STRING = 6
52
+ TYPE_BINARY = 7
53
+ TYPE_STRING_ARRAY = 8
54
+ TYPE_I18NSTRING = 9
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Rpm
6
+ # RPM file entry
7
+ #
8
+ # Represents a single file within an RPM package.
9
+ # File information is assembled from multiple header tags.
10
+ class Entry
11
+ include Omnizip::Entry
12
+ include Omnizip::Formats::Rpm::Constants
13
+
14
+ def entry_name = path
15
+ def entry_directory? = mode && ::File.directory?(mode)
16
+ def entry_size = size
17
+ def entry_mtime = mtime
18
+
19
+ # @return [String] File path
20
+ attr_accessor :path
21
+
22
+ # @return [Integer] File size
23
+ attr_accessor :size
24
+
25
+ # @return [Integer] File mode
26
+ attr_accessor :mode
27
+
28
+ # @return [Integer] User ID
29
+ attr_accessor :uid
30
+
31
+ # @return [Integer] Group ID
32
+ attr_accessor :gid
33
+
34
+ # @return [Time] Modification time
35
+ attr_accessor :mtime
36
+
37
+ # @return [String] File digest (MD5/SHA)
38
+ attr_accessor :digest
39
+
40
+ # @return [String] User name
41
+ attr_accessor :user
42
+
43
+ # @return [String] Group name
44
+ attr_accessor :group
45
+
46
+ # @return [Integer] File flags
47
+ attr_accessor :flags
48
+
49
+ # @return [String] Symlink target (if symlink)
50
+ attr_accessor :link_to
51
+
52
+ # Check if entry is a directory
53
+ #
54
+ # @return [Boolean]
55
+ def directory?
56
+ (@mode & 0o170_000) == 0o040_000
57
+ end
58
+
59
+ # Check if entry is a regular file
60
+ #
61
+ # @return [Boolean]
62
+ def file?
63
+ (@mode & 0o170_000) == 0o100_000
64
+ end
65
+
66
+ # Check if entry is a symbolic link
67
+ #
68
+ # @return [Boolean]
69
+ def symlink?
70
+ (@mode & 0o170_000) == 0o120_000
71
+ end
72
+
73
+ # Check if file is a config file
74
+ #
75
+ # @return [Boolean]
76
+ def config?
77
+ @flags.anybits?(FILE_CONFIG)
78
+ end
79
+
80
+ # Check if file is documentation
81
+ #
82
+ # @return [Boolean]
83
+ def doc?
84
+ @flags.anybits?(FILE_DOC)
85
+ end
86
+
87
+ # Get permission string
88
+ #
89
+ # @return [String] Unix-style permission string
90
+ def permissions
91
+ perms = (@mode & 0o777).to_s(8).rjust(3, "0")
92
+
93
+ type_char = if directory?
94
+ "d"
95
+ elsif symlink?
96
+ "l"
97
+ else
98
+ "-"
99
+ end
100
+
101
+ "#{type_char}#{perms}"
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Rpm
6
+ # RPM header parser
7
+ #
8
+ # Parses RPM header structure including the 16-byte header header,
9
+ # tag entries, and data blob. Used for both signature and main headers.
10
+ class Header
11
+ include Omnizip::Formats::Rpm::Constants
12
+
13
+ # @return [String] 8-byte header magic
14
+ attr_reader :magic
15
+
16
+ # @return [Integer] Number of tag entries
17
+ attr_reader :entry_count
18
+
19
+ # @return [Integer] Data blob length
20
+ attr_reader :data_length
21
+
22
+ # @return [Array<Tag>] Parsed tags
23
+ attr_reader :tags
24
+
25
+ # @return [Integer] Total header length
26
+ attr_reader :length
27
+
28
+ # Parse header from IO
29
+ #
30
+ # @param io [IO] Input stream positioned at header
31
+ # @return [Header] Parsed header object
32
+ # @raise [ArgumentError] If magic is invalid
33
+ def self.parse(io)
34
+ new.tap { |header| header.parse!(io) }
35
+ end
36
+
37
+ # Get tag value by name
38
+ #
39
+ # @param name [Symbol] Tag name
40
+ # @return [Object, nil] Tag value or nil if not found
41
+ def [](name)
42
+ tag = find_tag(name)
43
+ tag&.value
44
+ end
45
+
46
+ # Find tag by name
47
+ #
48
+ # @param name [Symbol] Tag name
49
+ # @return [Tag, nil] Tag object or nil
50
+ def find_tag(name)
51
+ @tags.find { |t| t.name == name }
52
+ end
53
+
54
+ # Get all tags as hash
55
+ #
56
+ # @return [Hash] Tag names to values
57
+ def to_h
58
+ @tags.to_h do |tag|
59
+ [tag.name, tag.value]
60
+ end
61
+ end
62
+
63
+ # Validate header
64
+ #
65
+ # @raise [ArgumentError] If validation fails
66
+ def validate!
67
+ unless @magic == HEADER_MAGIC
68
+ raise ArgumentError,
69
+ "Invalid header magic: #{@magic.inspect}"
70
+ end
71
+ end
72
+
73
+ def parse!(io)
74
+ # Read header header (16 bytes)
75
+ header_data = io.read(HEADER_HEADER_SIZE)
76
+ raise ArgumentError, "Failed to read RPM header" unless header_data
77
+
78
+ @magic = header_data[0, 8]
79
+ @entry_count = header_data[8, 4].unpack1("N")
80
+ @data_length = header_data[12, 4].unpack1("N")
81
+
82
+ validate!
83
+
84
+ # Read tag entries
85
+ tag_data_size = @entry_count * TAG_ENTRY_SIZE
86
+ tag_entries_data = io.read(tag_data_size)
87
+
88
+ # Read data blob
89
+ data_blob = io.read(@data_length)
90
+
91
+ # Parse tags
92
+ @tags = []
93
+ @entry_count.times do |i|
94
+ offset = i * TAG_ENTRY_SIZE
95
+ entry = tag_entries_data[offset, TAG_ENTRY_SIZE].unpack("NNNN")
96
+
97
+ tag = Tag.new(entry[0], entry[1], entry[2], entry[3], data_blob)
98
+ @tags << tag
99
+ end
100
+
101
+ @length = HEADER_HEADER_SIZE + tag_data_size + @data_length
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Rpm
6
+ # RPM lead structure parser
7
+ #
8
+ # The lead is a 96-byte deprecated header at the start of RPM files.
9
+ # It contains basic package identification but most information
10
+ # is now stored in the main header.
11
+ class Lead
12
+ include Omnizip::Formats::Rpm::Constants
13
+
14
+ # @return [String] 4-byte magic
15
+ attr_reader :magic
16
+
17
+ # @return [Integer] Major version
18
+ attr_reader :major_version
19
+
20
+ # @return [Integer] Minor version
21
+ attr_reader :minor_version
22
+
23
+ # @return [Integer] Package type (binary=0, source=1)
24
+ attr_reader :type
25
+
26
+ # @return [Integer] Architecture number
27
+ attr_reader :architecture
28
+
29
+ # @return [String] Package name (66 bytes)
30
+ attr_reader :name
31
+
32
+ # @return [Integer] OS number
33
+ attr_reader :os
34
+
35
+ # @return [Integer] Signature type
36
+ attr_reader :signature_type
37
+
38
+ # @return [Integer] Total length (always 96)
39
+ attr_reader :length
40
+
41
+ # Initialize a parsed lead. All attributes are required; use
42
+ # +Lead.parse(io)+ for the typical read path.
43
+ def initialize(magic:, major_version:, minor_version:, type:,
44
+ architecture:, name:, os:, signature_type:,
45
+ length: LEAD_SIZE)
46
+ @magic = magic
47
+ @major_version = major_version
48
+ @minor_version = minor_version
49
+ @type = type
50
+ @architecture = architecture
51
+ @name = name
52
+ @os = os
53
+ @signature_type = signature_type
54
+ @length = length
55
+ end
56
+
57
+ # Parse lead from IO
58
+ #
59
+ # @param io [IO] Input stream positioned at lead
60
+ # @return [Lead] Parsed lead object
61
+ # @raise [ArgumentError] If magic is invalid
62
+ def self.parse(io)
63
+ data = io.read(LEAD_SIZE)
64
+ raise ArgumentError, "Failed to read RPM lead" unless data
65
+ raise ArgumentError, "Truncated RPM lead" if data.bytesize < LEAD_SIZE
66
+
67
+ # Unpack lead structure
68
+ # A4 = 4-byte string (magic)
69
+ # CC = 2 unsigned chars (major, minor)
70
+ # n = big-endian short (type)
71
+ # n = big-endian short (architecture)
72
+ # A66 = 66-byte string (name)
73
+ # n = big-endian short (os)
74
+ # n = big-endian short (signature_type)
75
+ # A16 = 16-byte reserved
76
+ magic, major, minor, type, arch, name, os, sig_type = data.unpack("A4 CC n n A66 n n A16")
77
+
78
+ new(
79
+ magic: magic,
80
+ major_version: major,
81
+ minor_version: minor,
82
+ type: type,
83
+ architecture: arch,
84
+ name: name.strip,
85
+ os: os,
86
+ signature_type: sig_type,
87
+ ).tap(&:validate!)
88
+ end
89
+
90
+ # Validate lead structure
91
+ #
92
+ # @raise [ArgumentError] If validation fails
93
+ def validate!
94
+ if @magic.nil? || @magic.bytesize < 4
95
+ raise ArgumentError, "Invalid RPM magic: missing or truncated"
96
+ end
97
+
98
+ unless @magic == LEAD_MAGIC
99
+ raise ArgumentError,
100
+ format("Invalid RPM magic: 0x%08x (expected 0x%08x)",
101
+ @magic.unpack1("N"), LEAD_MAGIC.unpack1("N"))
102
+ end
103
+
104
+ unless [PACKAGE_BINARY, PACKAGE_SOURCE].include?(@type)
105
+ raise ArgumentError, "Invalid RPM type: #{@type}"
106
+ end
107
+ end
108
+
109
+ # Check if package is binary
110
+ #
111
+ # @return [Boolean]
112
+ def binary?
113
+ @type == PACKAGE_BINARY
114
+ end
115
+
116
+ # Check if package is source
117
+ #
118
+ # @return [Boolean]
119
+ def source?
120
+ @type == PACKAGE_SOURCE
121
+ end
122
+
123
+ # Get type name
124
+ #
125
+ # @return [Symbol] :binary or :source
126
+ def type_name
127
+ binary? ? :binary : :source
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,228 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Rpm
6
+ # RPM tag definitions and value extraction
7
+ #
8
+ # Maps tag IDs to symbolic names and handles typed value extraction
9
+ # from the header data blob.
10
+ class Tag
11
+ include Omnizip::Formats::Rpm::Constants
12
+
13
+ # Tag ID to name mapping (from rpm/rpmtag.h)
14
+ TAG_IDS = {
15
+ # Signature tags
16
+ 257 => :sigsize,
17
+ 261 => :sigmd5,
18
+ 262 => :siggpg,
19
+ 263 => :sigpgp5,
20
+ 267 => :dsaheader,
21
+ 268 => :rsaheader,
22
+ 269 => :sha1header,
23
+ 270 => :longsigsize,
24
+ 271 => :longarchivesize,
25
+
26
+ # Header tags
27
+ 1000 => :name,
28
+ 1001 => :version,
29
+ 1002 => :release,
30
+ 1003 => :epoch,
31
+ 1004 => :summary,
32
+ 1005 => :description,
33
+ 1006 => :buildtime,
34
+ 1007 => :buildhost,
35
+ 1009 => :size,
36
+ 1010 => :distribution,
37
+ 1011 => :vendor,
38
+ 1014 => :license,
39
+ 1015 => :packager,
40
+ 1016 => :group,
41
+ 1020 => :url,
42
+ 1021 => :os,
43
+ 1022 => :arch,
44
+ 1023 => :prein,
45
+ 1024 => :postin,
46
+ 1025 => :preun,
47
+ 1026 => :postun,
48
+ 1027 => :oldfilenames,
49
+ 1028 => :filesizes,
50
+ 1029 => :filestates,
51
+ 1030 => :filemodes,
52
+ 1031 => :fileuids,
53
+ 1032 => :filegids,
54
+ 1033 => :filerdevs,
55
+ 1034 => :filemtimes,
56
+ 1035 => :filedigests,
57
+ 1036 => :filelinktos,
58
+ 1037 => :fileflags,
59
+ 1039 => :fileusername,
60
+ 1040 => :filegroupname,
61
+ 1044 => :sourcerpm,
62
+ 1046 => :archivesize,
63
+ 1047 => :providename,
64
+ 1048 => :requireflags,
65
+ 1049 => :requirename,
66
+ 1050 => :requireversion,
67
+ 1053 => :conflictflags,
68
+ 1054 => :conflictname,
69
+ 1055 => :conflictversion,
70
+ 1064 => :rpmversion,
71
+ 1090 => :obsoletename,
72
+ 1112 => :provideflags,
73
+ 1113 => :provideversion,
74
+ 1114 => :obsoleteflags,
75
+ 1115 => :obsoleteversion,
76
+ 1116 => :dirindexes,
77
+ 1117 => :basenames,
78
+ 1118 => :dirnames,
79
+ 1124 => :payloadformat,
80
+ 1125 => :payloadcompressor,
81
+ 1126 => :payloadflags,
82
+
83
+ # Extended tags
84
+ 5000 => :filenames,
85
+ 5008 => :longfilesizes,
86
+ 5009 => :longsize,
87
+ 5013 => :evr,
88
+ 5014 => :nvr,
89
+ 5016 => :nevra,
90
+ 5019 => :epochnum,
91
+ }.freeze
92
+
93
+ # Type ID to name mapping
94
+ TYPE_NAMES = {
95
+ TYPE_NULL => :null,
96
+ TYPE_CHAR => :char,
97
+ TYPE_INT8 => :int8,
98
+ TYPE_INT16 => :int16,
99
+ TYPE_INT32 => :int32,
100
+ TYPE_INT64 => :int64,
101
+ TYPE_STRING => :string,
102
+ TYPE_BINARY => :binary,
103
+ TYPE_STRING_ARRAY => :string_array,
104
+ TYPE_I18NSTRING => :i18nstring,
105
+ }.freeze
106
+
107
+ # @return [Integer] Tag ID
108
+ attr_reader :tag_id
109
+
110
+ # @return [Integer] Tag type
111
+ attr_reader :type_id
112
+
113
+ # @return [Integer] Offset into data blob
114
+ attr_reader :offset
115
+
116
+ # @return [Integer] Count of items
117
+ attr_reader :count
118
+
119
+ # @return [String] Data blob reference
120
+ attr_reader :data
121
+
122
+ # Initialize tag
123
+ #
124
+ # @param tag_id [Integer] Tag identifier
125
+ # @param type_id [Integer] Type identifier
126
+ # @param offset [Integer] Offset into data blob
127
+ # @param count [Integer] Item count
128
+ # @param data [String] Reference to data blob
129
+ def initialize(tag_id, type_id, offset, count, data)
130
+ @tag_id = tag_id
131
+ @type_id = type_id
132
+ @offset = offset
133
+ @count = count
134
+ @data = data
135
+ @value = nil
136
+ end
137
+
138
+ # Get tag name
139
+ #
140
+ # @return [Symbol, Integer] Tag name or ID if unknown
141
+ def name
142
+ TAG_IDS.fetch(@tag_id, @tag_id)
143
+ end
144
+
145
+ # Get type name
146
+ #
147
+ # @return [Symbol, Integer] Type name or ID if unknown
148
+ def type
149
+ TYPE_NAMES.fetch(@type_id, @type_id)
150
+ end
151
+
152
+ # Get tag value (lazy extraction)
153
+ #
154
+ # @return [Object] Extracted value based on type
155
+ def value
156
+ return @value if @value
157
+
158
+ @value = extract_value
159
+ end
160
+
161
+ private
162
+
163
+ # Extract value based on type
164
+ #
165
+ # @return [Object] Extracted value
166
+ def extract_value
167
+ case type
168
+ when :string, :i18nstring
169
+ extract_string
170
+ when :string_array
171
+ extract_string_array
172
+ when :binary
173
+ extract_binary
174
+ when :int8
175
+ extract_int8
176
+ when :int16
177
+ extract_int16
178
+ when :int32
179
+ extract_int32
180
+ when :int64
181
+ extract_int64
182
+ when :char
183
+ extract_char
184
+ else
185
+ extract_binary
186
+ end
187
+ end
188
+
189
+ def extract_string
190
+ @data[@offset..]&.split("\0", 2)&.first || ""
191
+ end
192
+
193
+ def extract_string_array
194
+ @data[@offset..].to_s.split("\0")[0...@count] || []
195
+ end
196
+
197
+ def extract_binary
198
+ @data[@offset, @count] || ""
199
+ end
200
+
201
+ def extract_int8
202
+ @data[@offset, @count].unpack("C" * @count)
203
+ end
204
+
205
+ def extract_int16
206
+ @data[@offset, 2 * @count].unpack("n" * @count)
207
+ end
208
+
209
+ def extract_int32
210
+ @data[@offset, 4 * @count].unpack("N" * @count)
211
+ end
212
+
213
+ def extract_int64
214
+ values = []
215
+ @count.times do |i|
216
+ high, low = @data[@offset + (i * 8), 8].unpack("NN")
217
+ values << ((high << 32) | low)
218
+ end
219
+ values
220
+ end
221
+
222
+ def extract_char
223
+ @data[@offset, @count].unpack("a" * @count)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end