diffoscope 331__tar.gz → 336__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffoscope-331/diffoscope.egg-info → diffoscope-336}/PKG-INFO +2 -5
- {diffoscope-331 → diffoscope-336}/diffoscope/__init__.py +1 -1
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/apk.py +7 -1
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/nar.py +1 -1
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/pdf.py +4 -3
- diffoscope-336/diffoscope/comparators/tar.py +232 -0
- {diffoscope-331 → diffoscope-336/diffoscope.egg-info}/PKG-INFO +2 -5
- {diffoscope-331 → diffoscope-336}/diffoscope.egg-info/SOURCES.txt +3 -0
- {diffoscope-331 → diffoscope-336}/setup.py +3 -6
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_nar.py +1 -1
- diffoscope-336/tests/comparators/test_tar.py +275 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elf_obj_radare2_expected_diff +1 -0
- diffoscope-336/tests/data/macho_obj_radare2_expected_diff_main +9 -0
- diffoscope-336/tests/data/macho_obj_radare2_expected_diff_printf +22 -0
- diffoscope-336/tests/data/tar_acl_diff +9 -0
- diffoscope-336/tests/data/tar_atime_diff +5 -0
- diffoscope-336/tests/data/tar_translator_diff +0 -0
- diffoscope-331/diffoscope/comparators/tar.py +0 -46
- diffoscope-331/tests/comparators/test_tar.py +0 -81
- diffoscope-331/tests/data/macho_obj_radare2_expected_diff_main +0 -33
- diffoscope-331/tests/data/macho_obj_radare2_expected_diff_printf +0 -12
- {diffoscope-331 → diffoscope-336}/CONTRIBUTING.md +0 -0
- {diffoscope-331 → diffoscope-336}/COPYING +0 -0
- {diffoscope-331 → diffoscope-336}/MANIFEST.in +0 -0
- {diffoscope-331 → diffoscope-336}/README.rst +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/changes.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/android.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ar.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/arsc.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/asar.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/berkeley_db.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/binary.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/binwalk.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/bzip2.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/cbfs.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/cpio.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/deb.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/debian.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/debian_fallback.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/decompile.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/device.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/dex.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/directory.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/docx.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/dtb.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/elf.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ffprobe.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/fit.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/fontconfig.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/fonts.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/fsimage.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/gettext.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/gif.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/git.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/gnumeric.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/gzip.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/haskell.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/hdf.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/html.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/icc.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/image.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ipk.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/iso9660.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/java.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/javascript.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/json.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/kbx.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/llvm.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/lz4.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/lzip.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/lzma.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/macho.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/missing_file.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/mono.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ocaml.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/odt.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ogg.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/openssh.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/openssl.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/pcap.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/pe32.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/pgp.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/png.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ppu.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/ps.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/python.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/rdata.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/rpm.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/rpm_fallback.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/rust.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/sevenz.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/socket_or_fifo.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/sphinx.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/sqlite.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/squashfs.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/symlink.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/text.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/uimage.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/uki.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/archive.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/command.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/compare.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/container.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/file.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/fuzzy.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/libarchive.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/operation.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/utils/specialize.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/vmlinuz.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/wasm.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/xar.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/xml.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/xmlb.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/xsb.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/xz.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/zip.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/comparators/zst.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/config.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/diff.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/difference.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/environ.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/exc.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/excludes.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/external_tools.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/feeders.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/logging.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/main.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/path.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/formats.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/html/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/html/html.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/html/templates.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/icon.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/json.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/markdown.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/restructuredtext.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/text.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/presenters/utils.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/profiling.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/progress.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/readers/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/readers/json.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/readers/utils.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/scripts/extract-vmlinux +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/scripts/restore-nar.scm +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/tempfiles.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/tools.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope/utils.py +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope.egg-info/dependency_links.txt +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope.egg-info/entry_points.txt +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope.egg-info/requires.txt +0 -0
- {diffoscope-331 → diffoscope-336}/diffoscope.egg-info/top_level.txt +0 -0
- {diffoscope-331 → diffoscope-336}/extras_require.json +0 -0
- {diffoscope-331 → diffoscope-336}/pyproject.toml +0 -0
- {diffoscope-331 → diffoscope-336}/setup.cfg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_android.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_apk.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_archive.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_arsc.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_asar.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_berkeley_db.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_binary.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_binwalk.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_bzip2.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_cbfs.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_containers.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_cpio.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_deb.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_debian.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_device.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_dex.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_directory.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_docx.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_dtb.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_elf.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_elf_decompiler.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_epub.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ffprobe.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_fit.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_fontconfig.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_fonts.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_fsimage.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_gettext.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_gif.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_git.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_gnumeric.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_gzip.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_haskell.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_hdf.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_html.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_icc.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ico_image.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ipk.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_iso9660.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_java.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_javascript.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_jpeg_image.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_json.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_kbx.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_lz4.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_lzip.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_lzma.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_macho.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_macho_decompiler.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_mono.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ocaml.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_odt.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ogg.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_openssh_pub_key.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_openssl.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_pcap.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_pdf.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_pgp.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_png.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ppu.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_ps.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_python.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_rdata.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_rlib.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_rpm.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_sevenz.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_sockets.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_sphinx.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_sqlite.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_squashfs.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_symlink.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_text.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_uimage.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_uki.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_utils.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_wasm.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_xml.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_xsb.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_xz.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_zip.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/comparators/test_zst.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/conftest.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/Samyak-Malayalam1.ttf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/Samyak-Malayalam2.ttf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/Test1.class +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/Test2.class +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/android1.img +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/android2.img +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/android_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/apk_manifest_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/apk_zipinfo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/archive1.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/archive12.diff.txt +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/archive2.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/arsc_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/base-files_157-r45695_ar71xx.ipk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/base-files_157-r45918_ar71xx.ipk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/berkeley6_db_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/berkeley_db_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/binary1 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/binary2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/binary_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/binary_hexdump_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/binwalk_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug881937_1.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug881937_2.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug881937_control_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903391_1.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903391_2.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903401_1.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903401_2.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903565_1.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/bug903565_2.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/comment_zipdetails_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/comment_zipinfo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/a.tar.bz2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/a.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/a.tar.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/b.tar.bz2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/b.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/b.tar.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/containers/different_files_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/cpio_listing_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/add/test-dbgsym-dbgsym_1_amd64.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/add/test-dbgsym_1_amd64.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/mult/test-dbgsym-dbgsym_1_amd64.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/mult/test-dbgsym_1_amd64.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/test-dbgsym_1.dsc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dbgsym/test-dbgsym_1.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/deb_metadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/debian-bug-875281.collapsed-diff.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/debian-bug-876316-control.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/device_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/device_expected_diff_freebsd +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/device_expected_diff_reverse +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/device_expected_diff_reverse_freebsd +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/devicetree1.dtb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/devicetree2.dtb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/devicetree_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dex_expected_diffs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dex_javap_14_expected_diffs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/docx_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_buildinfo_fallback_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_changes_description_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_changes_different_contents_and_identical_files_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_changes_fallback_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_changes_identical_contents_and_different_files_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dot_dsc_fallback_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/dummyx64.efi.stub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elf_lib_metadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elf_lib_objdump_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elf_obj_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elf_obj_ghidra_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix1.not_a +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix2.a +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_disassembly_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_mach_o_expected_diff__text +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_mach_o_expected_diff__text_16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_src_c_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_x_obj_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/elfmix_x_obj_objdump_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/encrypted1.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/encrypted2.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/epub_expected_diffs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ext4_expected_diffs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fat12_expected_diffs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fit_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fontconfig_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fuzzy-tar-in-tar1.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fuzzy-tar-in-tar2.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fuzzy1.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fuzzy2.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/fuzzy3.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/gif_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/git_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/git_expected_diff_freebsd +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/gnu_debuglink_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/gnumeric_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/gzip_metadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/haskell_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/hdf5_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/hello1.wasm +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/hello2.wasm +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/html_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/html_text_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/icc_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ico_image_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ico_image_meta_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ico_image_meta_expected_diff_v2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ignore_readelf_errors_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/inv_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ipk_metadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/iso9660_content_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/iso9660_content_expected_diff_cdrtools +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/iso9660_rockridge_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/iso9660_rockridge_expected_diff_cdrtools +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/javap_14_class_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/javap_class_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/javascript_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/jmod_zipdetails_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/jmod_zipinfo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/jpeg_image_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/jpeg_image_meta_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/json_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/json_expected_ordering_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/kbx_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__cstring +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__eh_frame +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__la_symbol_ptr +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__stub_helper +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__stub_helper_16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__stubs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__stubs_16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__text +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__text_16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff__unwind_info +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_dyn_relocations +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_dyn_symbols +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_file_headers +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_needed_libs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_relocations +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_strings +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_symbols +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_llvm_expected_diff_symbols_llvm_11 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_obj_ghidra_expected_diff_main +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff__cstring +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff__data +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff__text +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff_headers +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff_indirect_symbols +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff_libraries +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/macho_otool_expected_diff_strings +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/mo_charsets_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/mo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/mozzip_zipinfo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/mp3_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/nar_listing_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/no-perms.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/nupkg_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ocaml_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/odt_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ogg_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/openssh_pub_key_expected_diff_12 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/openssh_pub_key_expected_diff_23 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/order1a.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/order1b.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output.colored.txt +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output.md +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output.rst +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output.txt +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output_expected_363.html +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output_expected_372.html +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/output_regression_875281.html +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pcap_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pdf_annotations_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pdf_metadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pdf_text_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pe_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pgp_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pgp_signature_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pgp_signed_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/png_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ppu_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/procyon_class_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ps_internal_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ps_text_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/pyc_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine_a.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine_b.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine_deb_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/quine_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rdb_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rds_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/resources1.arsc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/resources2.arsc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_armap_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_elf_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_10 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_15 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_21 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_22 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_5 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rlib_llvm_dis_expected_diff_7 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rpm_fallback_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rpm_header_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/rpm_listing_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/salsa-issue-363.diff.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/salsa-issue-372.diff.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/sqlite3_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/squashfs_root_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/squashfs_superblock_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/symlink_expected_destination_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/symlink_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/tar_listing_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1-le64.cache-4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.a +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.apk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.asar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.asc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.binwalk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.buildinfo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.bz2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.changes +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.cpio +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.db +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.debsrc.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.debug +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.dex +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.disk.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.docx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.dsc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.epub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.exe +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.ext4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.fat12 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.fat16 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.fat32 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.gif +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.git-index +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.gnumeric +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.hi +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.html +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.icc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.ico +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.inv +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.iso +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.jmod +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.jpg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.js +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.kbx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.lz4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.lzip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.lzma +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.macho +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.mo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.mozzip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.mp3 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.nar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.nupkg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.o +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.odt +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.ogg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.pcap +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.pgp +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.png +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.ppu +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.ps +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.pyc-renamed +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.rdb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.rdx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.rlib +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.rpm +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.sqlite3 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.squashfs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.xml +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.xsb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1_meta.ico +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1_meta.jpg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1_root.squashfs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test1_signed.pgp +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2-le64.cache-4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.a +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.apk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.asar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.asc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.binwalk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.buildinfo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.bz2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.changes +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.cpio +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.db +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.deb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.debsrc.tar.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.debug +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.dex +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.disk.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.docx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.dsc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.epub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.exe +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.ext4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.fat12 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.gif +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.git-index +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.gnumeric +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.gz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.hi +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.html +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.icc +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.ico +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.inv +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.iso +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.jmod +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.jpg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.js +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.kbx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.lz4 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.lzip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.lzma +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.macho +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.mo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.mozzip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.mp3 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.nar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.nupkg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.o +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.odt +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.ogg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.pcap +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.pgp +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.png +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.ppu +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.ps +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.pyc-renamed +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.rdb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.rdx +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.rlib +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.rpm +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.sqlite3 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.squashfs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.tar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.xml +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.xsb +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2_meta.ico +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2_meta.jpg +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2_root.squashfs +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test2_signed.pgp +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.apk +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.changes +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.gif +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.nar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.xml +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test3.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.changes +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.gif +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.nar +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.xml +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test4.xz +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test5.changes +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_comment1.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_comment2.zip +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_directory_a_b_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_directory_b_a_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_directory_device_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_directory_file_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_directory_symlink_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_invalid.json +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_invalid.xml +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_iso8859-1.mo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_no_charset.mo +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_openssh_pub_key1.pub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_openssh_pub_key2.pub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_openssh_pub_key3.pub +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_weird_non_unicode_chars1.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_weird_non_unicode_chars2.pdf +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_xml_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/test_xml_ordering_differences_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_ascii1 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_ascii2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_ascii_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_endings1 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_endings2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_endings_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_iso8859 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_iso8859_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_order1 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_order2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_order_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_sevenzmetadata_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_unicode1 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_unicode2 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_unicode_binary_fallback +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_unicode_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/text_xz_list +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ttf_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/ttf_ttx_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/uimage_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/uimage_expected_diff_pre_5_41 +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/uki_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/wasm_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/xsb_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/zip2_zipdetails_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/zip_bsdtar_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/zip_zipdetails_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/data/zip_zipinfo_expected_diff +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_diff_mask.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_difference.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_excludes.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_main.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_presenters.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_progress.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_quines.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_readers.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_source.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_tools.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/test_versions.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/utils/__init__.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/utils/data.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/utils/nonexisting.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/utils/tools.py +0 -0
- {diffoscope-331 → diffoscope-336}/tests/utils/versions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffoscope
|
|
3
|
-
Version:
|
|
3
|
+
Version: 336
|
|
4
4
|
Summary: in-depth comparison of files, archives, and directories
|
|
5
5
|
Home-page: https://diffoscope.org/
|
|
6
6
|
Author: Diffoscope developers
|
|
@@ -14,12 +14,9 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
|
|
|
14
14
|
Classifier: Operating System :: POSIX
|
|
15
15
|
Classifier: Programming Language :: Python
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
18
|
Classifier: Topic :: Utilities
|
|
22
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.10
|
|
23
20
|
Description-Content-Type: text/x-rst
|
|
24
21
|
License-File: COPYING
|
|
25
22
|
Requires-Dist: python-magic
|
|
@@ -331,11 +331,17 @@ def get_v2_signing_keys(path):
|
|
|
331
331
|
except Exception:
|
|
332
332
|
return ""
|
|
333
333
|
|
|
334
|
+
try:
|
|
335
|
+
pairs = instance._v2_blocks.items()
|
|
336
|
+
except AttributeError:
|
|
337
|
+
# Androguard >= 4.1.4-1 (approx)
|
|
338
|
+
pairs = [(b.id, b.data) for b in instance._v2_blocks]
|
|
339
|
+
|
|
334
340
|
def format_key(x):
|
|
335
341
|
return "\n".join(textwrap.wrap(binascii.hexlify(x).decode("utf-8")))
|
|
336
342
|
|
|
337
343
|
output = []
|
|
338
|
-
for k, v in sorted(
|
|
344
|
+
for k, v in sorted(pairs):
|
|
339
345
|
output.append("Key {}:\n{}\n".format(hex(k), format_key(v)))
|
|
340
346
|
|
|
341
347
|
return "\n".join(output)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#
|
|
2
2
|
# diffoscope: in-depth comparison of files, archives, and directories
|
|
3
3
|
#
|
|
4
|
-
# Copyright © 2024 Chris Lamb <lamby@debian.org>
|
|
4
|
+
# Copyright © 2024, 2026 Chris Lamb <lamby@debian.org>
|
|
5
5
|
# Copyright © 2022 Christopher Baines <mail@cbaines.net>
|
|
6
6
|
#
|
|
7
7
|
# diffoscope is free software: you can redistribute it and/or modify
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# diffoscope: in-depth comparison of files, archives, and directories
|
|
3
3
|
#
|
|
4
4
|
# Copyright © 2014-2015 Jérémy Bobbio <lunar@debian.org>
|
|
5
|
-
# Copyright © 2015-2016, 2018-2024 Chris Lamb <lamby@debian.org>
|
|
5
|
+
# Copyright © 2015-2016, 2018-2024, 2026 Chris Lamb <lamby@debian.org>
|
|
6
6
|
# Copyright © 2023 Mattia Rizzolo <mattia@debian.org>
|
|
7
7
|
#
|
|
8
8
|
# diffoscope is free software: you can redistribute it and/or modify
|
|
@@ -23,6 +23,7 @@ import os
|
|
|
23
23
|
import re
|
|
24
24
|
|
|
25
25
|
from diffoscope.tools import (
|
|
26
|
+
find_executable,
|
|
26
27
|
python_module_missing,
|
|
27
28
|
tool_required,
|
|
28
29
|
get_package_provider,
|
|
@@ -86,7 +87,7 @@ class Pdftotext(Command):
|
|
|
86
87
|
class Dumppdf(Command):
|
|
87
88
|
@tool_required("dumppdf")
|
|
88
89
|
def cmdline(self):
|
|
89
|
-
return ["dumppdf", "-at", self.path]
|
|
90
|
+
return [find_executable("dumppdf"), "-at", self.path]
|
|
90
91
|
|
|
91
92
|
|
|
92
93
|
class PdfFile(File):
|
|
@@ -105,7 +106,7 @@ class PdfFile(File):
|
|
|
105
106
|
Difference.from_operation(Dumppdf, self.path, other.path)
|
|
106
107
|
)
|
|
107
108
|
|
|
108
|
-
# Always
|
|
109
|
+
# Always prepend metadata differences
|
|
109
110
|
xs[:0] = self.gen_metadata_differences(other)
|
|
110
111
|
|
|
111
112
|
return xs
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#
|
|
2
|
+
# diffoscope: in-depth comparison of files, archives, and directories
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2014-2015 Jérémy Bobbio <lunar@debian.org>
|
|
5
|
+
# Copyright © 2015-2016, 2018-2020, 2026 Chris Lamb <lamby@debian.org>
|
|
6
|
+
#
|
|
7
|
+
# diffoscope is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
# (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# diffoscope is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
# GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You should have received a copy of the GNU General Public License
|
|
18
|
+
# along with diffoscope. If not, see <https://www.gnu.org/licenses/>.
|
|
19
|
+
|
|
20
|
+
import datetime
|
|
21
|
+
import re
|
|
22
|
+
import struct
|
|
23
|
+
import tarfile
|
|
24
|
+
|
|
25
|
+
from diffoscope.difference import Difference
|
|
26
|
+
|
|
27
|
+
from .utils.file import File
|
|
28
|
+
from .utils.libarchive import LibarchiveContainer, list_libarchive
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TarContainer(LibarchiveContainer):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TarFile(File):
|
|
36
|
+
DESCRIPTION = "tape archives (.tar)"
|
|
37
|
+
CONTAINER_CLASSES = [TarContainer]
|
|
38
|
+
FILE_TYPE_RE = re.compile(r"\btar archive\b")
|
|
39
|
+
|
|
40
|
+
def compare_details(self, other, source=None):
|
|
41
|
+
libarchive_result = Difference.from_text_readers(
|
|
42
|
+
list_libarchive(self.path),
|
|
43
|
+
list_libarchive(other.path),
|
|
44
|
+
self.path,
|
|
45
|
+
other.path,
|
|
46
|
+
source="file list",
|
|
47
|
+
)
|
|
48
|
+
if libarchive_result is not None:
|
|
49
|
+
return [libarchive_result]
|
|
50
|
+
|
|
51
|
+
# The libarchive based reader is not able to spot differences in
|
|
52
|
+
# POSIX.1-2001 PAX headers. libarchive itself is capable of reading
|
|
53
|
+
# this information (the archive_entry_xattr_* functions) but it
|
|
54
|
+
# doesn't seem to expose the relevant functions via libarchive.ffi.
|
|
55
|
+
#
|
|
56
|
+
# The PAX header stores information like
|
|
57
|
+
# * very long filenames and linknames
|
|
58
|
+
# * extended attributes
|
|
59
|
+
# * POSIX ACLs
|
|
60
|
+
# * atime and ctime with sub-second resolution
|
|
61
|
+
# * GNU/Hurd translators
|
|
62
|
+
# * sparse files
|
|
63
|
+
# * files larger than 8 GiB
|
|
64
|
+
# * device major and minor numbers with more than 21 bits
|
|
65
|
+
# * uid/gid with more than 21 bits
|
|
66
|
+
#
|
|
67
|
+
# If libarchive is unable to see a difference between the tarballs
|
|
68
|
+
# we fall back to the Python tarfile module and try to print more
|
|
69
|
+
# information.
|
|
70
|
+
return [
|
|
71
|
+
Difference.from_text_readers(
|
|
72
|
+
list_pytarfile(self.path),
|
|
73
|
+
list_pytarfile(other.path),
|
|
74
|
+
self.path,
|
|
75
|
+
other.path,
|
|
76
|
+
source="file list",
|
|
77
|
+
),
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def timestamp2str(ts):
|
|
82
|
+
try:
|
|
83
|
+
return str(datetime.datetime.fromtimestamp(float(ts), datetime.UTC))
|
|
84
|
+
except ValueError:
|
|
85
|
+
return f"Unable to parse: {ts}"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def read_number(v):
|
|
89
|
+
try:
|
|
90
|
+
return int(v)
|
|
91
|
+
except ValueError:
|
|
92
|
+
return f"Unable to parse: {v}"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# from https://salsa.debian.org/josch/seedfiles-integration-tests/-/blob/main/test.py
|
|
96
|
+
def parse_xattr(acl):
|
|
97
|
+
# see uapi/linux/posix_acl.h
|
|
98
|
+
POSIX_ACL_XATTR_VERSION = 0x0002
|
|
99
|
+
assert (POSIX_ACL_XATTR_VERSION,) == struct.unpack("<I", acl[:4])
|
|
100
|
+
acl = acl[4:]
|
|
101
|
+
assert (1,) == struct.unpack("<H", acl[:2]) # a_refcount
|
|
102
|
+
(count,) = struct.unpack("<H", acl[2:4])
|
|
103
|
+
assert b"\xff\xff\xff\xff" == acl[4:8] # filler?
|
|
104
|
+
# make sure that the acl minus the header is a multiple of 8
|
|
105
|
+
assert len(acl) % 8 == 0
|
|
106
|
+
assert count >= len(acl) / 8
|
|
107
|
+
count = len(acl) / 8
|
|
108
|
+
result = ""
|
|
109
|
+
# see linux/posix_acl.h
|
|
110
|
+
while acl:
|
|
111
|
+
e_tag, e_perm, e_id = struct.unpack("<hHI", acl[:8])
|
|
112
|
+
match e_tag:
|
|
113
|
+
case 0x01:
|
|
114
|
+
e_tag = "ACL_USER_OBJ"
|
|
115
|
+
case 0x02:
|
|
116
|
+
e_tag = "ACL_USER"
|
|
117
|
+
case 0x04:
|
|
118
|
+
e_tag = "ACL_GROUP_OBJ"
|
|
119
|
+
case 0x08:
|
|
120
|
+
e_tag = "ACL_GROUP"
|
|
121
|
+
case 0x10:
|
|
122
|
+
e_tag = "ACL_MASK"
|
|
123
|
+
case 0x20:
|
|
124
|
+
e_tag = "ACL_OTHER"
|
|
125
|
+
case _:
|
|
126
|
+
e_tag = f"Unknown e_tag: {e_tag}"
|
|
127
|
+
e_perm_str = ""
|
|
128
|
+
if e_perm & 0x04:
|
|
129
|
+
e_perm_str += "r"
|
|
130
|
+
if e_perm & 0x02:
|
|
131
|
+
e_perm_str += "w"
|
|
132
|
+
if e_perm & 0x01:
|
|
133
|
+
e_perm_str += "x"
|
|
134
|
+
if e_id + 1 == 2**32:
|
|
135
|
+
e_id = "2^32-1"
|
|
136
|
+
result += f"\n {e_tag:>13} {e_perm_str:<3} {e_id}"
|
|
137
|
+
acl = acl[8:]
|
|
138
|
+
return result
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def list_pytarfile(path):
|
|
142
|
+
with tarfile.open(path) as tar:
|
|
143
|
+
for member in tar:
|
|
144
|
+
if not member.pax_headers:
|
|
145
|
+
continue
|
|
146
|
+
for k, v in sorted(member.pax_headers.items()):
|
|
147
|
+
p = f"{member.name} PAX header {k}"
|
|
148
|
+
match k:
|
|
149
|
+
case "GNU.sparse.numblocks":
|
|
150
|
+
yield f"{p} raw value: {v}\n"
|
|
151
|
+
case "GNU.sparse.offset":
|
|
152
|
+
yield f"{p}: {read_number(v)}\n"
|
|
153
|
+
case "GNU.sparse.numbytes":
|
|
154
|
+
yield f"{p}: {read_number(v)}\n"
|
|
155
|
+
case "GNU.sparse.size":
|
|
156
|
+
yield f"{p}: {read_number(v)}\n"
|
|
157
|
+
case "GNU.sparse.map":
|
|
158
|
+
yield f"{p} raw value: {v}\n"
|
|
159
|
+
case "GNU.sparse.major":
|
|
160
|
+
yield f"{p}: {read_number(v)}\n"
|
|
161
|
+
case "GNU.sparse.minor":
|
|
162
|
+
yield f"{p}: {read_number(v)}\n"
|
|
163
|
+
case "GNU.sparse.name":
|
|
164
|
+
yield f"{p}: {v}\n"
|
|
165
|
+
case "GNU.sparse.realsize":
|
|
166
|
+
yield f"{p}: {read_number(v)}\n"
|
|
167
|
+
case "LIBARCHIVE.creationtime":
|
|
168
|
+
yield f"{p}: {timestamp2str(v)}\n"
|
|
169
|
+
case "LIBARCHIVE.symlinktype":
|
|
170
|
+
match v:
|
|
171
|
+
case "file" | "dir":
|
|
172
|
+
yield f"{p}: {v}\n"
|
|
173
|
+
case _:
|
|
174
|
+
yield f"{p}: Unknown value: {v}"
|
|
175
|
+
case "LIBARCHIVE.xattr":
|
|
176
|
+
yield f"{p} raw value: {v}\n"
|
|
177
|
+
case "RHT.security.selinux":
|
|
178
|
+
yield f"{p} raw value: {v}\n"
|
|
179
|
+
case "SCHILY.acl.access":
|
|
180
|
+
yield f"{p} raw value: {v}\n"
|
|
181
|
+
case "SCHILY.acl.default":
|
|
182
|
+
yield f"{p} raw value: {v}\n"
|
|
183
|
+
case "SCHILY.acl.ace":
|
|
184
|
+
yield f"{p} raw value: {v}\n"
|
|
185
|
+
case "SCHILY.devmajor":
|
|
186
|
+
yield f"{p}: {read_number(v)}\n"
|
|
187
|
+
case "SCHILY.devminor":
|
|
188
|
+
yield f"{p}: {read_number(v)}\n"
|
|
189
|
+
case "SCHILY.fflags":
|
|
190
|
+
yield f"{p} raw value: {v}\n"
|
|
191
|
+
case "SCHILY.dev":
|
|
192
|
+
yield f"{p}: {read_number(v)}\n"
|
|
193
|
+
case "SCHILY.ino":
|
|
194
|
+
yield f"{p}: {read_number(v)}\n"
|
|
195
|
+
case "SCHILY.nlink":
|
|
196
|
+
yield f"{p}: {read_number(v)}\n"
|
|
197
|
+
case "SCHILY.realsize":
|
|
198
|
+
yield f"{p}: {read_number(v)}\n"
|
|
199
|
+
case "SCHILY.xattr.gnu.translator":
|
|
200
|
+
yield f"{p} raw value: {v}\n"
|
|
201
|
+
case "SCHILY.xattr.system.posix_acl_default":
|
|
202
|
+
yield f"{p}: {parse_xattr(v.encode(errors='surrogateescape'))}\n"
|
|
203
|
+
case "SCHILY.xattr.user":
|
|
204
|
+
yield f"{p} raw value: {v}\n"
|
|
205
|
+
case "SCHILY.xattr.trusted":
|
|
206
|
+
yield f"{p} raw value: {v}\n"
|
|
207
|
+
case "SCHILY.xattr.security":
|
|
208
|
+
yield f"{p} raw value: {v}\n"
|
|
209
|
+
case "SCHILY.xattr.gnu.author":
|
|
210
|
+
yield f"{p} raw value: {v}\n"
|
|
211
|
+
case "SUN.holesdata":
|
|
212
|
+
yield f"{p} raw value: {v}\n"
|
|
213
|
+
case "atime" | "ctime" | "mtime":
|
|
214
|
+
yield f"{p}: {timestamp2str(v)}\n"
|
|
215
|
+
case "gid" | "uid":
|
|
216
|
+
yield f"{p}: {read_number(v)}\n"
|
|
217
|
+
case "gname" | "uname":
|
|
218
|
+
yield f"{p}: {v}\n"
|
|
219
|
+
case "hdrcharset":
|
|
220
|
+
match v:
|
|
221
|
+
case "BINARY":
|
|
222
|
+
yield "{p}: BINARY\n"
|
|
223
|
+
case "ISO-IR 10646 2000 UTF-8":
|
|
224
|
+
yield "{p}: UTF-8\n"
|
|
225
|
+
case _:
|
|
226
|
+
yield f"{p}: Unknown value: {v}"
|
|
227
|
+
case "linkpath":
|
|
228
|
+
yield f"{p}: {v}\n"
|
|
229
|
+
case "path":
|
|
230
|
+
yield f"{p}: {v}\n"
|
|
231
|
+
case "size":
|
|
232
|
+
yield f"{p}: {read_number(v)}\n"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffoscope
|
|
3
|
-
Version:
|
|
3
|
+
Version: 336
|
|
4
4
|
Summary: in-depth comparison of files, archives, and directories
|
|
5
5
|
Home-page: https://diffoscope.org/
|
|
6
6
|
Author: Diffoscope developers
|
|
@@ -14,12 +14,9 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
|
|
|
14
14
|
Classifier: Operating System :: POSIX
|
|
15
15
|
Classifier: Programming Language :: Python
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
18
|
Classifier: Topic :: Utilities
|
|
22
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.10
|
|
23
20
|
Description-Content-Type: text/x-rst
|
|
24
21
|
License-File: COPYING
|
|
25
22
|
Requires-Dist: python-magic
|
|
@@ -445,7 +445,10 @@ tests/data/squashfs_root_expected_diff
|
|
|
445
445
|
tests/data/squashfs_superblock_expected_diff
|
|
446
446
|
tests/data/symlink_expected_destination_diff
|
|
447
447
|
tests/data/symlink_expected_diff
|
|
448
|
+
tests/data/tar_acl_diff
|
|
449
|
+
tests/data/tar_atime_diff
|
|
448
450
|
tests/data/tar_listing_expected_diff
|
|
451
|
+
tests/data/tar_translator_diff
|
|
449
452
|
tests/data/test1-le64.cache-4
|
|
450
453
|
tests/data/test1.a
|
|
451
454
|
tests/data/test1.apk
|
|
@@ -6,8 +6,8 @@ import sys
|
|
|
6
6
|
|
|
7
7
|
from setuptools import setup, find_packages
|
|
8
8
|
|
|
9
|
-
if sys.version_info < (3,
|
|
10
|
-
print("diffoscope requires at least python 3.
|
|
9
|
+
if sys.version_info < (3, 10):
|
|
10
|
+
print("diffoscope requires at least python 3.10", file=sys.stderr)
|
|
11
11
|
sys.exit(1)
|
|
12
12
|
|
|
13
13
|
|
|
@@ -36,7 +36,7 @@ setup(
|
|
|
36
36
|
"libarchive-c",
|
|
37
37
|
],
|
|
38
38
|
extras_require=extras_require,
|
|
39
|
-
python_requires=">=3.
|
|
39
|
+
python_requires=">=3.10",
|
|
40
40
|
classifiers=[
|
|
41
41
|
"Development Status :: 5 - Production/Stable",
|
|
42
42
|
"Intended Audience :: Developers",
|
|
@@ -44,9 +44,6 @@ setup(
|
|
|
44
44
|
"Operating System :: POSIX",
|
|
45
45
|
"Programming Language :: Python",
|
|
46
46
|
"Programming Language :: Python :: 3",
|
|
47
|
-
"Programming Language :: Python :: 3.7",
|
|
48
|
-
"Programming Language :: Python :: 3.8",
|
|
49
|
-
"Programming Language :: Python :: 3.9",
|
|
50
47
|
"Programming Language :: Python :: 3.10",
|
|
51
48
|
"Topic :: Utilities",
|
|
52
49
|
],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#
|
|
2
2
|
# diffoscope: in-depth comparison of files, archives, and directories
|
|
3
3
|
#
|
|
4
|
-
# Copyright © 2024 Chris Lamb <lamby@debian.org>
|
|
4
|
+
# Copyright © 2024, 2026 Chris Lamb <lamby@debian.org>
|
|
5
5
|
# Copyright © 2022 Christopher Baines <mail@cbaines.net>
|
|
6
6
|
#
|
|
7
7
|
# diffoscope is free software: you can redistribute it and/or modify
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
#
|
|
2
|
+
# diffoscope: in-depth comparison of files, archives, and directories
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2015 Jérémy Bobbio <lunar@debian.org>
|
|
5
|
+
# Copyright © 2015-2017, 2020, 2026 Chris Lamb <lamby@debian.org>
|
|
6
|
+
#
|
|
7
|
+
# diffoscope is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
# (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# diffoscope is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
# GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You should have received a copy of the GNU General Public License
|
|
18
|
+
# along with diffoscope. If not, see <https://www.gnu.org/licenses/>.
|
|
19
|
+
|
|
20
|
+
import gzip
|
|
21
|
+
import os.path
|
|
22
|
+
import pytest
|
|
23
|
+
import struct
|
|
24
|
+
|
|
25
|
+
from diffoscope.config import Config
|
|
26
|
+
from diffoscope.comparators.tar import TarFile
|
|
27
|
+
from diffoscope.comparators.missing_file import MissingFile
|
|
28
|
+
from diffoscope.comparators.utils.specialize import specialize
|
|
29
|
+
from diffoscope.comparators.binary import FilesystemFile
|
|
30
|
+
|
|
31
|
+
from ..utils.data import load_fixture, get_data, assert_diff
|
|
32
|
+
from ..utils.nonexisting import assert_non_existing
|
|
33
|
+
|
|
34
|
+
tar1 = load_fixture("test1.tar")
|
|
35
|
+
tar2 = load_fixture("test2.tar")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_identification(tar1):
|
|
39
|
+
assert isinstance(tar1, TarFile)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_no_differences(tar1):
|
|
43
|
+
difference = tar1.compare(tar1)
|
|
44
|
+
assert difference is None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.fixture
|
|
48
|
+
def differences(tar1, tar2):
|
|
49
|
+
return tar1.compare(tar2).details
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_listing(differences):
|
|
53
|
+
expected_diff = get_data("tar_listing_expected_diff")
|
|
54
|
+
assert differences[0].unified_diff == expected_diff
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_symlinks(differences):
|
|
58
|
+
assert differences[2].source1 == "dir/link"
|
|
59
|
+
assert differences[2].source2 == "dir/link"
|
|
60
|
+
assert differences[2].comment == "symlink"
|
|
61
|
+
expected_diff = get_data("symlink_expected_diff")
|
|
62
|
+
assert differences[2].unified_diff == expected_diff
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_text_file(differences):
|
|
66
|
+
assert differences[1].source1 == "dir/text"
|
|
67
|
+
assert differences[1].source2 == "dir/text"
|
|
68
|
+
expected_diff = get_data("text_ascii_expected_diff")
|
|
69
|
+
assert differences[1].unified_diff == expected_diff
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_compare_non_existing(monkeypatch, tar1):
|
|
73
|
+
assert_non_existing(monkeypatch, tar1)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
no_permissions_tar = load_fixture("no-perms.tar")
|
|
77
|
+
|
|
78
|
+
# Reported as Debian #797164. This is a good way to notice if we unpack directories
|
|
79
|
+
# as we won't be able to remove files in one if we don't have write permissions.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_no_permissions_dir_in_tarball(monkeypatch, no_permissions_tar):
|
|
83
|
+
# We want to make sure OSError is not raised.
|
|
84
|
+
# Comparing with non-existing file makes it easy to make sure all files are unpacked
|
|
85
|
+
monkeypatch.setattr(Config(), "new_file", True)
|
|
86
|
+
no_permissions_tar.compare(MissingFile("/nonexistent", no_permissions_tar))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# The result of
|
|
90
|
+
# $ tar --format=pax --no-recursion -C /var/log -cf journal.tar ./journal
|
|
91
|
+
# once with and once without the --xattrs option
|
|
92
|
+
tar_acl_bytes = bytes.fromhex(
|
|
93
|
+
"1f8b080085ad436a02ffedd44f4bc3301806f02813a5273f42bf8069fef6ad87"
|
|
94
|
+
"9dbc4cf02078f224a1ad30e9ac3419d44faf2fdb4419a2286e179f1f94276d42"
|
|
95
|
+
"d2439fcae23a8cb33634ed108b877e393c864efc31c54ae756c9b6535947423b"
|
|
96
|
+
"6b4a22e734afd39ab411f928f660195318f855c4ff64551ed27cd14e35558648"
|
|
97
|
+
"3932d2581e91b72ee3d97a3d5b92f59a942269cfb5afac336556f9fce6627679"
|
|
98
|
+
"752bc790d220e3734ced423ef5713ede85bae3ab6e639c1ef23907e258bcb089"
|
|
99
|
+
"385ae509e7849f9f6eeef34d6655f9cda64d7b1f965dfad9ae023e27df4a5fec"
|
|
100
|
+
"ee0caeb821ef3ff65e13775ebddbeabf2d9d16b9df67ff87be4f5fad5b7f87cd"
|
|
101
|
+
"d98efe910000000000000000000000000000000000bff10adb0252ab00280000"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
tar_noacl_bytes = bytes.fromhex(
|
|
106
|
+
"1f8b0800b4ad436a02ffedd43d6a0331108661d53ec55ec0bbfa19699cc2bdcb"
|
|
107
|
+
"5c41c45bc4c459d85d83737b0f0e263f458a101b82dfa719a11990407c6abbc7"
|
|
108
|
+
"7adcf475db8f53b71b0ee36b7d717fcc9b2272aee67bf55ec50549b1a88a049b"
|
|
109
|
+
"0b41bdbae6e86ee030cd75b4abb8fb947c53e7e77dbf0eba8aaa5e34b631d94a"
|
|
110
|
+
"739285759fdebb4553b657f1daa687905749625938fc7bed25f4ddf5ceb08447"
|
|
111
|
+
"cdf973ee838a7ee4dff6bee63f1509aec9b7ccff380cf34f73d3db34f7fbedf2"
|
|
112
|
+
"4a7f24000000000000000000000000f01b278df8083500280000"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# We run tar with --clamp-mtime --mtime=0 but the ctime and atime
|
|
116
|
+
# will still be stored in pax headers. Re-create like this:
|
|
117
|
+
# $ tar --clamp-mtime --mtime=0 --format=pax --no-recursion -cf bin1.tar ./bin
|
|
118
|
+
# $ touch ./bin
|
|
119
|
+
# $ tar --clamp-mtime --mtime=0 --format=pax --no-recursion -cf bin2.tar ./bin
|
|
120
|
+
|
|
121
|
+
tar_before_bytes = bytes.fromhex(
|
|
122
|
+
"1f8b0800000000000003edd3cd0a8240148661d75d8557a067fe6dd1be65b760"
|
|
123
|
+
"256450411a74f94d861006b508b3c5fb6c0ecc37301f0c27cb57e5755995dbea"
|
|
124
|
+
"dce4ebfa988c40226f6d37a3e1140936514e6b71de191bcf95846092f43a4699"
|
|
125
|
+
"a14bd396e758e5176ffd212369d9d6876aa142a10be38cf299b7f107bcf6c52c"
|
|
126
|
+
"a69b97d4e898cadccea6ee8eef65f7a5cfc77da35bf1e0ee530527cfb337d87f"
|
|
127
|
+
"25da25a91bb7d643bffffb53b3d9bdb9f7290700000000000000000000000026"
|
|
128
|
+
"7003acf6139900280000"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
tar_after_bytes = bytes.fromhex(
|
|
132
|
+
"1f8b0800000000000003edd3cd0a8240148661d75d8557a0f3e39971d3be65b7"
|
|
133
|
+
"60266450811678f98d861042b508b3c5fb6c3e983370cee64bd26dd16daa625f"
|
|
134
|
+
"356dbaabcfd10c54e0b26cc8609a4af92cd2628c1227360bef5a796fa3b89be3"
|
|
135
|
+
"98a95b7b2d9a70ca2f76fd21abe2e25a9faab5f6b9c9ad5897275a7b63c439b7"
|
|
136
|
+
"0ad3f2f574e9dbf1bda42f7d3aef8ea1e25efad45ed4738e26fdd7ca4814cbbc"
|
|
137
|
+
"673d8cfd3f5edaf2f0e6dfa739000000000000000000000000b0803be9796d3f"
|
|
138
|
+
"00280000"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# Generates a PAX format tarball with a single entry which has the GNU/Hurd
|
|
143
|
+
# translator given in the content argument attached to it in a PAX header
|
|
144
|
+
def generate_pax(
|
|
145
|
+
name, mode, type, linktarget=None, major=None, minor=None, content=None
|
|
146
|
+
):
|
|
147
|
+
entries = []
|
|
148
|
+
if content is not None:
|
|
149
|
+
content = "SCHILY.xattr.gnu.translator=" + content
|
|
150
|
+
# In the beginning the decimal length of the field is recorded.
|
|
151
|
+
# But the length includes the length of the number itself.
|
|
152
|
+
# Luckily we only need to support decimal numbers with two digits.
|
|
153
|
+
assert 9 < len(content) + 4 < 100
|
|
154
|
+
dirname, basename = os.path.split(name)
|
|
155
|
+
paxname = dirname + "/PaxHeaders/" + basename
|
|
156
|
+
content = f"{len(content) +4} {content}\n"
|
|
157
|
+
entries.append((paxname, 0, "x", None, None, None, content))
|
|
158
|
+
entries.append((name, mode, type, linktarget, major, minor, None))
|
|
159
|
+
|
|
160
|
+
mtime = int(1612543740) # an arbitrary reproducible date
|
|
161
|
+
devtar = b""
|
|
162
|
+
for file in entries:
|
|
163
|
+
fname, mode, type, linktarget, major, minor, content = file
|
|
164
|
+
assert len(fname) <= 100
|
|
165
|
+
buf = struct.pack(
|
|
166
|
+
"@100s8s8s8s12s12s8s1s100s6s2s32s32s8s8s155s12s",
|
|
167
|
+
fname.encode(),
|
|
168
|
+
f"{mode:07o}".encode(),
|
|
169
|
+
b"0" * 7,
|
|
170
|
+
b"0" * 7,
|
|
171
|
+
f"{len(content) if content is not None else 0:011o}".encode(),
|
|
172
|
+
f"{0 if type == 'x' else mtime:011o}".encode(),
|
|
173
|
+
b" " * 8,
|
|
174
|
+
type.encode(),
|
|
175
|
+
linktarget.encode() if linktarget is not None else b"",
|
|
176
|
+
b"ustar",
|
|
177
|
+
b"00",
|
|
178
|
+
b"",
|
|
179
|
+
b"",
|
|
180
|
+
(f"{major:07o}" if major is not None else "").encode(),
|
|
181
|
+
(f"{minor:07o}" if minor is not None else "").encode(),
|
|
182
|
+
b"",
|
|
183
|
+
b"",
|
|
184
|
+
)
|
|
185
|
+
chksum = 256 + sum(struct.unpack_from("148B8x356B", buf))
|
|
186
|
+
buf = buf[:-364] + f"{chksum:06o}\0".encode() + buf[-357:]
|
|
187
|
+
devtar += buf
|
|
188
|
+
if content is not None:
|
|
189
|
+
devtar += struct.pack("@512s", content.encode())
|
|
190
|
+
return struct.pack("@10240s", devtar)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def tar_fixture(content, prefix):
|
|
194
|
+
@pytest.fixture
|
|
195
|
+
def pax_tar(tmp_path, tar1, tar2):
|
|
196
|
+
match prefix:
|
|
197
|
+
case "test1":
|
|
198
|
+
tar = tar1
|
|
199
|
+
case "test2":
|
|
200
|
+
tar = tar2
|
|
201
|
+
case _:
|
|
202
|
+
raise Exception(f"Invalid prefix: {prefix}")
|
|
203
|
+
tar_path = tmp_path / f"{prefix}.tar"
|
|
204
|
+
with open(tar_path, "wb") as t_fp:
|
|
205
|
+
t_fp.write(content)
|
|
206
|
+
with open(tar.path, "rb") as r_fp:
|
|
207
|
+
t_fp.write(bytes(r_fp.read()))
|
|
208
|
+
return specialize(FilesystemFile(str(tar_path)))
|
|
209
|
+
|
|
210
|
+
return pax_tar
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
tar_acl = tar_fixture(gzip.decompress(tar_acl_bytes), "test1")
|
|
214
|
+
tar_noacl = tar_fixture(gzip.decompress(tar_noacl_bytes), "test2")
|
|
215
|
+
|
|
216
|
+
tar_before = tar_fixture(gzip.decompress(tar_before_bytes), "test1")
|
|
217
|
+
tar_after = tar_fixture(gzip.decompress(tar_after_bytes), "test2")
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# The translator of tar_fd1_translator is wrong -- don't do this at home, kids!
|
|
221
|
+
tar_fd0_translator = tar_fixture(
|
|
222
|
+
generate_pax(
|
|
223
|
+
name="./dev/fd0", mode=0o640, type="0", content="/hurd/storeio\0fd0\0"
|
|
224
|
+
),
|
|
225
|
+
"test1",
|
|
226
|
+
)
|
|
227
|
+
tar_fd1_translator = tar_fixture(
|
|
228
|
+
generate_pax(
|
|
229
|
+
name="./dev/fd0", mode=0o640, type="0", content="/hurd/storeio\0fd1\0"
|
|
230
|
+
),
|
|
231
|
+
"test2",
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def test_identification(
|
|
236
|
+
tar_acl,
|
|
237
|
+
tar_noacl,
|
|
238
|
+
tar_before,
|
|
239
|
+
tar_after,
|
|
240
|
+
tar_fd0_translator,
|
|
241
|
+
tar_fd1_translator,
|
|
242
|
+
):
|
|
243
|
+
assert isinstance(tar_acl, TarFile)
|
|
244
|
+
assert isinstance(tar_noacl, TarFile)
|
|
245
|
+
assert isinstance(tar_before, TarFile)
|
|
246
|
+
assert isinstance(tar_after, TarFile)
|
|
247
|
+
assert isinstance(tar_fd0_translator, TarFile)
|
|
248
|
+
assert isinstance(tar_fd1_translator, TarFile)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
@pytest.fixture
|
|
252
|
+
def differences_acl(tar_acl, tar_noacl):
|
|
253
|
+
return tar_acl.compare(tar_noacl).details
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def test_listing_acl(differences_acl):
|
|
257
|
+
assert_diff(differences_acl[0], "tar_acl_diff")
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@pytest.fixture
|
|
261
|
+
def differences_atime(tar_before, tar_after):
|
|
262
|
+
return tar_before.compare(tar_after).details
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def test_listing_atime(differences_atime):
|
|
266
|
+
assert_diff(differences_atime[0], "tar_atime_diff")
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
@pytest.fixture
|
|
270
|
+
def differences_translator(tar_fd0_translator, tar_fd1_translator):
|
|
271
|
+
return tar_fd0_translator.compare(tar_fd1_translator).details
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def test_listing_translator(differences_translator):
|
|
275
|
+
assert_diff(differences_translator[0], "tar_translator_diff")
|