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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +754 -0
- data/COPYING +502 -0
- data/Gemfile +17 -0
- data/LICENSE +12 -0
- data/README.adoc +1045 -0
- data/Rakefile +12 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +91 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +271 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +185 -0
- data/docs/getting-started/your-first-archive.adoc +218 -0
- data/docs/guides/advanced-features/encryption.adoc +300 -0
- data/docs/guides/advanced-features/index.adoc +49 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
- data/docs/guides/advanced-features/streaming.adoc +212 -0
- data/docs/guides/archive-formats/gzip-format.adoc +107 -0
- data/docs/guides/archive-formats/index.adoc +130 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
- data/docs/guides/compression-algorithms/deflate.adoc +319 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +398 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
- data/docs/guides/creating-archives.adoc +354 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +218 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +188 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/troubleshooting/index.adoc +208 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +130 -0
- data/lib/omnizip/algorithm_registry.rb +86 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
- data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
- data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
- data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
- data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
- data/lib/omnizip/algorithms/bzip2.rb +130 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
- data/lib/omnizip/algorithms/deflate.rb +128 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
- data/lib/omnizip/algorithms/deflate64.rb +109 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
- data/lib/omnizip/algorithms/lzma.rb +238 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +141 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +116 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +82 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
- data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
- data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
- data/lib/omnizip/algorithms/zstandard.rb +138 -0
- data/lib/omnizip/buffer/memory_archive.rb +251 -0
- data/lib/omnizip/buffer/memory_extractor.rb +224 -0
- data/lib/omnizip/buffer.rb +176 -0
- data/lib/omnizip/checksum_registry.rb +114 -0
- data/lib/omnizip/checksums/crc32.rb +100 -0
- data/lib/omnizip/checksums/crc64.rb +101 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/verifier.rb +131 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +120 -0
- data/lib/omnizip/chunked.rb +129 -0
- data/lib/omnizip/cli/output_formatter.rb +104 -0
- data/lib/omnizip/cli.rb +572 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +427 -0
- data/lib/omnizip/commands/archive_extract_command.rb +272 -0
- data/lib/omnizip/commands/archive_list_command.rb +218 -0
- data/lib/omnizip/commands/archive_repair_command.rb +131 -0
- data/lib/omnizip/commands/archive_verify_command.rb +117 -0
- data/lib/omnizip/commands/compress_command.rb +117 -0
- data/lib/omnizip/commands/decompress_command.rb +120 -0
- data/lib/omnizip/commands/list_command.rb +53 -0
- data/lib/omnizip/commands/metadata_command.rb +153 -0
- data/lib/omnizip/commands/parity_create_command.rb +122 -0
- data/lib/omnizip/commands/parity_repair_command.rb +122 -0
- data/lib/omnizip/commands/parity_verify_command.rb +124 -0
- data/lib/omnizip/commands/profile_list_command.rb +56 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/convenience.rb +359 -0
- data/lib/omnizip/converter/conversion_registry.rb +49 -0
- data/lib/omnizip/converter/conversion_strategy.rb +121 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
- data/lib/omnizip/converter.rb +105 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/error.rb +106 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +63 -0
- data/lib/omnizip/extraction/filter_chain.rb +177 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +240 -0
- data/lib/omnizip/extraction.rb +111 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +113 -0
- data/lib/omnizip/filter.rb +139 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +166 -0
- data/lib/omnizip/filters/bcj.rb +279 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
- data/lib/omnizip/filters/bcj2.rb +99 -0
- data/lib/omnizip/filters/bcj_arm.rb +176 -0
- data/lib/omnizip/filters/bcj_arm64.rb +244 -0
- data/lib/omnizip/filters/bcj_ia64.rb +196 -0
- data/lib/omnizip/filters/bcj_ppc.rb +190 -0
- data/lib/omnizip/filters/bcj_sparc.rb +176 -0
- data/lib/omnizip/filters/bcj_x86.rb +193 -0
- data/lib/omnizip/filters/delta.rb +196 -0
- data/lib/omnizip/filters/filter_base.rb +72 -0
- data/lib/omnizip/filters/registry.rb +123 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/format_detector.rb +162 -0
- data/lib/omnizip/format_registry.rb +59 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +172 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +385 -0
- data/lib/omnizip/formats/cpio/reader.rb +196 -0
- data/lib/omnizip/formats/cpio/writer.rb +234 -0
- data/lib/omnizip/formats/cpio.rb +140 -0
- data/lib/omnizip/formats/format_spec_loader.rb +230 -0
- data/lib/omnizip/formats/gzip.rb +238 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
- data/lib/omnizip/formats/iso/directory_record.rb +152 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +197 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +530 -0
- data/lib/omnizip/formats/iso.rb +140 -0
- data/lib/omnizip/formats/lzip.rb +175 -0
- data/lib/omnizip/formats/lzma_alone.rb +171 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
- data/lib/omnizip/formats/rar/block_parser.rb +243 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +82 -0
- data/lib/omnizip/formats/rar/decompressor.rb +238 -0
- data/lib/omnizip/formats/rar/external_writer.rb +312 -0
- data/lib/omnizip/formats/rar/header.rb +192 -0
- data/lib/omnizip/formats/rar/license_validator.rb +109 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
- data/lib/omnizip/formats/rar/reader.rb +366 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
- data/lib/omnizip/formats/rar/writer.rb +431 -0
- data/lib/omnizip/formats/rar.rb +205 -0
- data/lib/omnizip/formats/rar3/compressor.rb +73 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar3/reader.rb +386 -0
- data/lib/omnizip/formats/rar3/writer.rb +219 -0
- data/lib/omnizip/formats/rar5/compressor.rb +73 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar5/reader.rb +342 -0
- data/lib/omnizip/formats/rar5/writer.rb +214 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
- data/lib/omnizip/formats/seven_zip/header.rb +106 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
- data/lib/omnizip/formats/seven_zip.rb +93 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +94 -0
- data/lib/omnizip/formats/tar/header.rb +168 -0
- data/lib/omnizip/formats/tar/reader.rb +121 -0
- data/lib/omnizip/formats/tar/writer.rb +216 -0
- data/lib/omnizip/formats/tar.rb +84 -0
- data/lib/omnizip/formats/xz/reader.rb +116 -0
- data/lib/omnizip/formats/xz.rb +237 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
- data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
- data/lib/omnizip/formats/zip/reader.rb +250 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +375 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
- data/lib/omnizip/io/buffered_input.rb +146 -0
- data/lib/omnizip/io/buffered_output.rb +105 -0
- data/lib/omnizip/io/stream_manager.rb +115 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +124 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +146 -0
- data/lib/omnizip/metadata/metadata_editor.rb +171 -0
- data/lib/omnizip/metadata/metadata_registry.rb +64 -0
- data/lib/omnizip/metadata/metadata_validator.rb +99 -0
- data/lib/omnizip/metadata.rb +57 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +73 -0
- data/lib/omnizip/models/compression_options.rb +71 -0
- data/lib/omnizip/models/conversion_options.rb +87 -0
- data/lib/omnizip/models/conversion_result.rb +135 -0
- data/lib/omnizip/models/eta_result.rb +46 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +144 -0
- data/lib/omnizip/models/filter_config.rb +183 -0
- data/lib/omnizip/models/match_result.rb +124 -0
- data/lib/omnizip/models/optimization_suggestion.rb +91 -0
- data/lib/omnizip/models/parallel_options.rb +104 -0
- data/lib/omnizip/models/performance_result.rb +79 -0
- data/lib/omnizip/models/profile_report.rb +82 -0
- data/lib/omnizip/models/progress_options.rb +38 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +81 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +203 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
- data/lib/omnizip/parallel/worker_pool.rb +223 -0
- data/lib/omnizip/parallel.rb +149 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +73 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
- data/lib/omnizip/parity/models/main_packet.rb +128 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +109 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
- data/lib/omnizip/parity/par2_creator.rb +531 -0
- data/lib/omnizip/parity/par2_repairer.rb +407 -0
- data/lib/omnizip/parity/par2_verifier.rb +364 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
- data/lib/omnizip/parity.rb +186 -0
- data/lib/omnizip/password/encryption_registry.rb +65 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
- data/lib/omnizip/password.rb +87 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
- data/lib/omnizip/pipe.rb +121 -0
- data/lib/omnizip/platform/ntfs_streams.rb +201 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +39 -0
- data/lib/omnizip/profile/balanced_profile.rb +33 -0
- data/lib/omnizip/profile/binary_profile.rb +36 -0
- data/lib/omnizip/profile/compression_profile.rb +158 -0
- data/lib/omnizip/profile/custom_profile.rb +157 -0
- data/lib/omnizip/profile/fast_profile.rb +33 -0
- data/lib/omnizip/profile/maximum_profile.rb +33 -0
- data/lib/omnizip/profile/profile_detector.rb +110 -0
- data/lib/omnizip/profile/profile_registry.rb +161 -0
- data/lib/omnizip/profile/text_profile.rb +36 -0
- data/lib/omnizip/profile.rb +190 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +169 -0
- data/lib/omnizip/profiler.rb +204 -0
- data/lib/omnizip/progress/callback_reporter.rb +36 -0
- data/lib/omnizip/progress/console_reporter.rb +62 -0
- data/lib/omnizip/progress/log_reporter.rb +91 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +190 -0
- data/lib/omnizip/progress/silent_reporter.rb +24 -0
- data/lib/omnizip/progress.rb +127 -0
- data/lib/omnizip/rubyzip_compat.rb +63 -0
- data/lib/omnizip/temp/safe_extract.rb +168 -0
- data/lib/omnizip/temp/temp_file.rb +124 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +181 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +156 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +273 -0
- data/lib/omnizip/zip/output_stream.rb +324 -0
- data/lib/omnizip.rb +156 -0
- data/readme-docs/advanced-features.adoc +515 -0
- data/readme-docs/api-usage.adoc +444 -0
- data/readme-docs/architecture.adoc +449 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +442 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +325 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- 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]
|