Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package diffoscope for openSUSE:Factory checked in at 2026-10-08 11:56:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/diffoscope (Old) and /work/SRC/openSUSE:Factory/.diffoscope.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "diffoscope" Thu Oct 8 11:56:26 2026 rev:55 rq:1383095 version:332 Changes: -------- --- /work/SRC/openSUSE:Factory/diffoscope/diffoscope.changes 2026-09-12 21:26:00.194161713 +0200 +++ /work/SRC/openSUSE:Factory/.diffoscope.new.3698736/diffoscope.changes 2026-10-08 11:58:50.492613243 +0200 @@ -1,0 +2,6 @@ +Wed Oct 7 16:38:00 UTC 2026 - Dirk Müller <[email protected]> + +- update to 332: + * Support radare2 >= 5.9.0 + +------------------------------------------------------------------- Old: ---- diffoscope-329.tar.bz2 diffoscope-329.tar.bz2.asc New: ---- diffoscope-332.tar.bz2 diffoscope-332.tar.bz2.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ diffoscope.spec ++++++ --- /var/tmp/diff_new_pack.wUm8eE/_old 2026-10-08 11:58:51.351649161 +0200 +++ /var/tmp/diff_new_pack.wUm8eE/_new 2026-10-08 11:58:51.353649244 +0200 @@ -17,7 +17,7 @@ Name: diffoscope -Version: 329 +Version: 332 Release: 0 Summary: In-depth comparison of files, archives, and directories License: GPL-3.0-or-later ++++++ diffoscope-329.tar.bz2 -> diffoscope-332.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/debian/changelog new/diffoscope-332/debian/changelog --- old/diffoscope-329/debian/changelog 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/debian/changelog 2026-09-28 22:33:20.000000000 +0200 @@ -1,3 +1,35 @@ +diffoscope (332) unstable; urgency=medium + + [ Chris Lamb ] + * Do not Build-Depend on GNU Guix. Thanks to Vagrant and Holger for the + reports. (Closes: #1149132) + + [ Guillaume Girol ] + * Update more tests to support new versions of Radare. + (Closes: reproducible-builds/diffoscope#432) + + -- Chris Lamb <[email protected]> Mon, 28 Sep 2026 13:33:17 -0700 + +diffoscope (331) unstable; urgency=medium + + [ Chris Lamb ] + * Support radare2 >= 5.9.0. (Closes: reproducible-builds/diffoscope#432) + * Update debian/tests/control. + * Update copyright years. + + [ Christopher Baines ] + * Add support for .nar files via Guix. + + -- Chris Lamb <[email protected]> Fri, 25 Sep 2026 10:44:20 -0700 + +diffoscope (330) unstable; urgency=medium + + [ Chris Lamb ] + * Don't Build-Depend on apksigcopier as it has been removed from testing. + (Closes: #1146852) + + -- Chris Lamb <[email protected]> Mon, 21 Sep 2026 13:20:54 -0700 + diffoscope (329) unstable; urgency=medium [ Jochen Sprickerhof ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/debian/control new/diffoscope-332/debian/control --- old/diffoscope-329/debian/control 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/debian/control 2026-09-28 22:33:20.000000000 +0200 @@ -10,7 +10,7 @@ # aapt <!nocheck>, abootimg <!nocheck>, # androguard <!nocheck>, - apksigcopier <!nocheck>, +# apksigcopier <!nocheck>, apksigner <!nocheck>, bash-completion, binutils-multiarch <!nocheck>, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/debian/tests/control new/diffoscope-332/debian/tests/control --- old/diffoscope-329/debian/tests/control 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/debian/tests/control 2026-09-28 22:33:20.000000000 +0200 @@ -7,7 +7,7 @@ # $ mv debian/tests/control.tmp debian/tests/control Tests: pytest-with-recommends -Depends: python3-all, diffoscope, black, python3-pytest, python3-h5py, file, linux-image-amd64 [amd64] | linux-image-generic [amd64], 7zip, abootimg, acl, apksigcopier, apksigner, apktool, binutils-multiarch, bzip2, caca-utils, colord, coreboot-utils [!risv64], db-util, default-jdk-headless | default-jdk | java-sdk, device-tree-compiler, docx2txt, e2fsprogs, enjarify, ffmpeg, fontforge-extras, fonttools, fp-utils [!riscv64 !s390x], genisoimage, gettext, ghc, ghostscript, giflib-tools, gnumeric, gnupg-utils, gpg, hdf5-tools, html2text, imagemagick, jsbeautifier, libarchive-tools, libxmlb-utils, llvm, lz4, lzip, mono-devel (>= 6.14.1+ds-3) [!riscv64] | mono-utils (<< 6.14.1+ds-3) [!riscv64], ocaml, odt2txt, oggvideotools [!s390x], openssh-client, openssl, perl, pgpdump, poppler-utils, procyon-decompiler, python3-pdfminer, r-base-core, rpm2cpio, sng, sqlite3, squashfs-tools, systemd-ukify, tcpdump, u-boot-tools, unzip, wabt, xmlbeans, xxd, xz-utils, zip, zstd, python3-argcomplete, pyth on3-binwalk, python3-defusedxml, python3-distro, python3-guestfs [amd64 arm64 loong64 ppc64el riscv64 s390x], python3-jsondiff, python3-progressbar, python3-pypdf, python3-debian, python3-pyxattr, python3-rpm, python3-tlsh +Depends: python3-all, diffoscope, black, python3-pytest, python3-h5py, file, linux-image-amd64 [amd64] | linux-image-generic [amd64], 7zip, abootimg, acl, apksigner, apktool, binutils-multiarch, bzip2, caca-utils, colord, coreboot-utils [!risv64], db-util, default-jdk-headless | default-jdk | java-sdk, device-tree-compiler, docx2txt, e2fsprogs, enjarify, ffmpeg, fontforge-extras, fonttools, fp-utils [!riscv64 !s390x], genisoimage, gettext, ghc, ghostscript, giflib-tools, gnumeric, gnupg-utils, gpg, guix, hdf5-tools, html2text, imagemagick, jsbeautifier, libarchive-tools, libxmlb-utils, llvm, lz4, lzip, mono-devel (>= 6.14.1+ds-3) [!riscv64] | mono-utils (<< 6.14.1+ds-3) [!riscv64], ocaml, odt2txt, oggvideotools [!s390x], openssh-client, openssl, perl, pgpdump, poppler-utils, procyon-decompiler, python3-pdfminer, r-base-core, rpm2cpio, sng, sqlite3, squashfs-tools, systemd-ukify, tcpdump, u-boot-tools, unzip, wabt, xmlbeans, xxd, xz-utils, zip, zstd, python3-argcomplete, python3-binw alk, python3-defusedxml, python3-distro, python3-guestfs [amd64 arm64 loong64 ppc64el riscv64 s390x], python3-jsondiff, python3-progressbar, python3-pypdf, python3-debian, python3-pyxattr, python3-rpm, python3-tlsh Tests: pytest Depends: python3-all, diffoscope, python3-pytest, python3-h5py, file, python3-tlsh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/debian/tests/control.sh new/diffoscope-332/debian/tests/control.sh --- old/diffoscope-329/debian/tests/control.sh 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/debian/tests/control.sh 2026-09-28 22:33:20.000000000 +0200 @@ -34,3 +34,4 @@ sed -i "s#aapt, ##" debian/tests/control.tmp sed -i "s#dexdump, ##" debian/tests/control.tmp sed -i "s#python3-androguard, ##" debian/tests/control.tmp +sed -i "s#apksigcopier, ##" debian/tests/control.tmp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/__init__.py new/diffoscope-332/diffoscope/__init__.py --- old/diffoscope-329/diffoscope/__init__.py 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/diffoscope/__init__.py 2026-09-28 22:33:20.000000000 +0200 @@ -17,4 +17,4 @@ # You should have received a copy of the GNU General Public License # along with diffoscope. If not, see <https://www.gnu.org/licenses/>. -VERSION = "329" +VERSION = "332" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/comparators/__init__.py new/diffoscope-332/diffoscope/comparators/__init__.py --- old/diffoscope-329/diffoscope/comparators/__init__.py 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/diffoscope/comparators/__init__.py 2026-09-28 22:33:20.000000000 +0200 @@ -58,6 +58,7 @@ ("bzip2.Bzip2File",), ("cpio.CpioFile",), ("deb.DebFile",), + ("nar.NarFile",), ("hdf.Hdf5File",), ("dex.DexFile",), ("elf.ElfFile",), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/comparators/decompile.py new/diffoscope-332/diffoscope/comparators/decompile.py --- old/diffoscope-329/diffoscope/comparators/decompile.py 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/diffoscope/comparators/decompile.py 2026-09-28 22:33:20.000000000 +0200 @@ -2,7 +2,7 @@ # diffoscope: in-depth comparison of files, archives, and directories # # Copyright © 2020 Jean-Romain Garnier <[email protected]> -# Copyright © 2020-2022 Chris Lamb <[email protected]> +# Copyright © 2020-2022, 2026 Chris Lamb <[email protected]> # # diffoscope is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -242,7 +242,11 @@ @property def offset(self): - return self.data_dict["offset"] + try: + return self.data_dict["addr"] + except KeyError: + # Be backwards compatible with version < 5.9.0 + return self.data_dict["offset"] @property def size(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/comparators/nar.py new/diffoscope-332/diffoscope/comparators/nar.py --- old/diffoscope-329/diffoscope/comparators/nar.py 1970-01-01 01:00:00.000000000 +0100 +++ new/diffoscope-332/diffoscope/comparators/nar.py 2026-09-28 22:33:20.000000000 +0200 @@ -0,0 +1,245 @@ +# +# diffoscope: in-depth comparison of files, archives, and directories +# +# Copyright © 2024, 2026 Chris Lamb <[email protected]> +# Copyright © 2022 Christopher Baines <[email protected]> +# +# diffoscope is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# diffoscope is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with diffoscope. If not, see <https://www.gnu.org/licenses/>. + +import os +import stat +import pathlib +import logging +import subprocess + +from diffoscope.difference import Difference +from diffoscope.tools import tool_required +from diffoscope.tempfiles import get_temporary_directory + +from .directory import Directory +from .symlink import Symlink + +from .utils.file import File +from .utils.archive import Archive, ArchiveMember + +logger = logging.getLogger(__name__) + +# The top-level node of a NAR is unnamed, so use this when referring to it in +# file listings. +NAR_ROOT = "." + +# "guix archive --extract" would be the obvious way to unpack a NAR, but it +# insists on connecting to guix-daemon, so use "guix repl" to call the +# underlying (guix serialization) code directly instead. +RESTORE_NAR_SCRIPT = str( + pathlib.Path(__file__).parent.parent.joinpath("scripts", "restore-nar.scm") +) + + +class NarMember(ArchiveMember): + @property + def path(self): + # We unpack the archive in one go, so point at the already-extracted + # file rather than letting ArchiveMember create a temporary directory + # per-member. + return self.container.get_member_path(self._name) + + +class NarDirectory(Directory, NarMember): + def __init__(self, container, member_name): + NarMember.__init__(self, container, member_name) + + def compare(self, other, source=None): + return None + + def has_same_content_as(self, other): + return False + + def is_directory(self): + return True + + def get_member_names(self): + raise ValueError("archives are compared as a whole.") # noqa + + def get_member(self, member_name): + raise ValueError("archives are compared as a whole.") # noqa + + +class NarSymlink(Symlink, NarMember): + def __init__(self, container, member_name, destination): + NarMember.__init__(self, container, member_name) + self._destination = destination + + @property + def symlink_destination(self): + return self._destination + + def is_symlink(self): + return True + + +class NarContainer(Archive): + def open_archive(self): + return True + + def close_archive(self): + pass + + def get_member_names(self): + self.ensure_unpacked() + + if not self._root_is_directory: + return [self._root_member_name] + + return list(self.walk()) + + def get_member(self, member_name): + path = self.get_member_path(member_name) + + if os.path.islink(path): + return NarSymlink(self, member_name, os.readlink(path)) + + if os.path.isdir(path): + return NarDirectory(self, member_name) + + return NarMember(self, member_name) + + def get_member_path(self, member_name): + self.ensure_unpacked() + + if not self._root_is_directory: + if member_name != self._root_member_name: + raise KeyError(member_name) + return self._root + + path = os.path.join(self._root, member_name) + if not os.path.lexists(path): + raise KeyError(member_name) + + return path + + def extract(self, member_name, dest_dir): + # Ignore dest_dir; the archive is already unpacked in one go. + return self.get_member_path(member_name) + + def walk(self, relative_to=""): + """ + Yield the name of every node underneath the top-level directory, + relative to it and in the order NAR stores them (ie. sorted), with + directories appearing before their contents. + """ + + directory = os.path.join(self._root, relative_to) + + for name in sorted(os.listdir(directory)): + member_name = os.path.join(relative_to, name) + yield member_name + + path = os.path.join(self._root, member_name) + if not os.path.islink(path) and os.path.isdir(path): + yield from self.walk(member_name) + + def listing(self): + """ + Describe the archive in terms of what NAR actually records: the type of + each node, whether regular files are executable and where symlinks + point. + """ + + self.ensure_unpacked() + + def describe(name, path): + mode = os.lstat(path).st_mode + + if stat.S_ISLNK(mode): + return f"symlink {name} -> {os.readlink(path)}\n" + if stat.S_ISDIR(mode): + return f"directory {name}\n" + if mode & stat.S_IXUSR: + return f"executable {name}\n" + + return f"regular {name}\n" + + yield describe(NAR_ROOT, self._root) + + if self._root_is_directory: + for member_name in self.walk(): + yield describe( + member_name, os.path.join(self._root, member_name) + ) + + def compare(self, other, **kwargs): + differences = [] + + # Always include the file list; without it, added, removed or + # newly-executable files would only show up as a binary diff. + if other.source: + differences.append( + Difference.from_text_readers( + self.listing(), + other.listing(), + self.source.path, + other.source.path, + source="file list", + ) + ) + + differences.extend(super().compare(other, **kwargs)) + + return differences + + @tool_required("guix") + def ensure_unpacked(self): + if hasattr(self, "_root"): + return + + self._temp_dir_object = get_temporary_directory(suffix="nar") + root = os.path.join(self._temp_dir_object.name, "contents") + + logger.debug("Extracting %s to %s", self.source.path, root) + + with open(self.source.path, "rb") as f: + subprocess.run( + ("guix", "repl", "--", RESTORE_NAR_SCRIPT, root), + stdin=f, + # The script is tiny, so byte-compiling it would cost more than + # it saves (and would need a writable cache directory). + env=dict(os.environ, GUILE_AUTO_COMPILE="0"), + capture_output=True, + check=True, + ) + + self._root = root + self._root_is_directory = not os.path.islink(root) and os.path.isdir( + root + ) + + if self._root_is_directory: + # NAR restores directories read-only, which would prevent us from + # removing the unpacked files again later. + for dirpath, _, _ in os.walk(root): + os.chmod(dirpath, os.lstat(dirpath).st_mode | stat.S_IWUSR) + else: + # A NAR containing a single file or symlink does not record a name + # for it, so fall back to naming it after the archive itself. + self._root_member_name = self.get_compressed_content_name(".nar") + + +class NarFile(File): + DESCRIPTION = "nar files" + CONTAINER_CLASSES = [NarContainer] + + FALLBACK_FILE_TYPE_HEADER_PREFIX = ( + len("nix-archive-1").to_bytes(8, byteorder="little") + b"nix-arch" + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/external_tools.py new/diffoscope-332/diffoscope/external_tools.py --- old/diffoscope-329/diffoscope/external_tools.py 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/diffoscope/external_tools.py 2026-09-28 22:33:20.000000000 +0200 @@ -86,6 +86,7 @@ "guix": "gnupg", }, "guestfs": {"debian": "python3-guestfs"}, + "guix": {"debian": "guix"}, "gzip": {"debian": "gzip", "arch": "gzip", "guix": "gzip"}, "h5dump": {"debian": "hdf5-tools", "arch": "hdf5", "guix": "hdf5"}, "html2text": {"debian": "html2text", "guix": "html2text"}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/diffoscope/scripts/restore-nar.scm new/diffoscope-332/diffoscope/scripts/restore-nar.scm --- old/diffoscope-329/diffoscope/scripts/restore-nar.scm 1970-01-01 01:00:00.000000000 +0100 +++ new/diffoscope-332/diffoscope/scripts/restore-nar.scm 2026-09-28 22:33:20.000000000 +0200 @@ -0,0 +1,11 @@ +;;; Restore the NAR read from standard input into the directory named +;;; by the first command-line argument. +;;; +;;; We cannot use "guix archive --extract" for this as it handles +;;; --extract from within a (with-store ...) form, and therefore +;;; insists on connecting to guix-daemon even though restoring a NAR +;;; needs nothing from the store. This should be fixed in the future. + +(use-modules (guix serialization)) + +(restore-file (current-input-port) (cadr (command-line))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/tests/comparators/test_nar.py new/diffoscope-332/tests/comparators/test_nar.py --- old/diffoscope-329/tests/comparators/test_nar.py 1970-01-01 01:00:00.000000000 +0100 +++ new/diffoscope-332/tests/comparators/test_nar.py 2026-09-28 22:33:20.000000000 +0200 @@ -0,0 +1,87 @@ +# +# diffoscope: in-depth comparison of files, archives, and directories +# +# Copyright © 2024, 2026 Chris Lamb <[email protected]> +# Copyright © 2022 Christopher Baines <[email protected]> +# +# diffoscope is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# diffoscope is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with diffoscope. If not, see <https://www.gnu.org/licenses/>. + +import pytest + +from diffoscope.comparators.nar import NarFile + +from ..utils.data import load_fixture, assert_diff +from ..utils.nonexisting import assert_non_existing +from ..utils.tools import skip_unless_tools_exist + +# test1.nar and test2.nar contain a single regular file; test3.nar and +# test4.nar contain a "dir" directory holding a "text" file and a "link" +# symlink. +nar1 = load_fixture("test1.nar") +nar2 = load_fixture("test2.nar") +nar3 = load_fixture("test3.nar") +nar4 = load_fixture("test4.nar") + + +def test_identification(nar1): + assert isinstance(nar1, NarFile) + + +def test_no_differences(nar1): + difference = nar1.compare(nar1) + assert difference is None + + [email protected] +def single_file_differences(nar1, nar2): + return nar1.compare(nar2).details + + [email protected] +def differences(nar3, nar4): + return nar3.compare(nar4).details + + +@skip_unless_tools_exist("guix") +def test_single_file(single_file_differences): + # A NAR holding a single file does not record a name for it, so it is + # named after the archive itself. + assert single_file_differences[0].source1 == "test1" + assert single_file_differences[0].source2 == "test2" + assert_diff(single_file_differences[0], "text_ascii_expected_diff") + + +@skip_unless_tools_exist("guix") +def test_listing(differences): + assert_diff(differences[0], "nar_listing_expected_diff") + + +@skip_unless_tools_exist("guix") +def test_symlinks(differences): + assert differences[1].source1 == "dir/link" + assert differences[1].source2 == "dir/link" + assert differences[1].comment == "symlink" + assert_diff(differences[1], "symlink_expected_diff") + + +@skip_unless_tools_exist("guix") +def test_text_file(differences): + assert differences[2].source1 == "dir/text" + assert differences[2].source2 == "dir/text" + assert_diff(differences[2], "text_ascii_expected_diff") + + +@skip_unless_tools_exist("guix") +def test_compare_non_existing(monkeypatch, nar3): + assert_non_existing(monkeypatch, nar3) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/tests/data/elf_obj_radare2_expected_diff new/diffoscope-332/tests/data/elf_obj_radare2_expected_diff --- old/diffoscope-329/tests/data/elf_obj_radare2_expected_diff 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/tests/data/elf_obj_radare2_expected_diff 2026-09-28 22:33:20.000000000 +0200 @@ -1,13 +1,11 @@ -@@ -1,11 +1,11 @@ - - // This function contains 1 basic blocks and its 11 long. - function sym.f () { - loc_0x8000040: - push rbp //[01] -r-x section size 11 named .text - rbp = rsp -- eax = 0x2a //'*' ; 42 -+ eax = 0xffffffff //-1 - //rsp ; rsp - return - (break) +@@ -1,9 +1,9 @@ + // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4); + void sym.f (void) { + push (rbp) // [01] -r-x section size 11 named .text + rbp = rsp +- eax = 0x2a // '*' // 42 ++ eax = 0xffffffff // -1 + rbp = pop () // rsp // rsp + return } + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/tests/data/macho_obj_radare2_expected_diff_main new/diffoscope-332/tests/data/macho_obj_radare2_expected_diff_main --- old/diffoscope-329/tests/data/macho_obj_radare2_expected_diff_main 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/tests/data/macho_obj_radare2_expected_diff_main 2026-09-28 22:33:20.000000000 +0200 @@ -1,33 +1,9 @@ -@@ -1,23 +1,21 @@ +@@ -1,6 +1,6 @@ + // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4); + int printf (const char *format, ...) { +- // CALL XREF from main @ 0x100000f3f(x) +- goto loc_qword [reloc.printf] // [0x100001010:8]=0x100000f68 // "h\x0f" // [01] -r-x section size 6 named 1.__TEXT.__stubs ++ // CALL XREF from main @ 0x100000f58(x) ++ goto loc_qword [reloc.printf] // [0x100001010:8]=0x100000f80 "h" // [01] -r-x section size 6 named 1.__TEXT.__stubs + } --// This function contains 1 basic blocks and its 49 long. -+// This function contains 1 basic blocks and its 42 long. - function main () { -- loc_0x100000f20: -- push rbp //[00] -r-x section size 49 named 0.__TEXT.__text -+ loc_0x100000f40: -+ push rbp //[00] -r-x section size 42 named 0.__TEXT.__text - rbp = rsp - rsp -= 0x10 -- rdi = rip + 0x43 //section.3.__TEXT.__cstring -- //0x100000f72 ; "%s %s\n" -- rsi = rip + 0x43 //str.17:31:50 -- //0x100000f79 ; "17:31:50" -- rdx = rip + 0x45 //str.Wed_Dec__2_17:31:49_2015 -- //0x100000f82 ; "Wed Dec 2 17:31:49 2015" -+ rdi = rip + 0x3b //section.3.__TEXT.__cstring -+ //0x100000f8a ; "%s\n" -+ rsi = rip + 0x38 //str.15:52:34 -+ //0x100000f8e ; "15:52:34" - al = 0 -- 0x100000f3f -- int printf("%s %s\n") -+ 0x100000f58 -+ int printf("%s\n") - ecx = 0 - dword [var_4h] = eax - eax = ecx - rsp += 0x10 - //rsp ; rsp - return - (break) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/tests/data/macho_obj_radare2_expected_diff_printf new/diffoscope-332/tests/data/macho_obj_radare2_expected_diff_printf --- old/diffoscope-329/tests/data/macho_obj_radare2_expected_diff_printf 2026-08-21 17:26:26.000000000 +0200 +++ new/diffoscope-332/tests/data/macho_obj_radare2_expected_diff_printf 2026-09-28 22:33:20.000000000 +0200 @@ -1,12 +1,22 @@ -@@ -1,8 +1,8 @@ - - // This function contains 1 basic blocks and its 6 long. - function sym.imp.printf () { -- loc_0x100000f52: -- //CALL XREF from main @ 0x100000f3f -- goto qword [reloc.printf] //[0x100001010:8]=0x100000f68 "h" ; "h\x0f" ; [01] -r-x section size 6 named 1.__TEXT.__stubs -+ loc_0x100000f6a: -+ //CALL XREF from main @ 0x100000f58 -+ goto qword [reloc.printf] //[0x100001010:8]=0x100000f80 "h" ; [01] -r-x section size 6 named 1.__TEXT.__stubs - (break) +@@ -1,17 +1,16 @@ + // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4); + int main (int argc, char **argv, char **envp) { +- push (rbp) // [00] -r-x section size 49 named 0.__TEXT.__text ++ push (rbp) // [00] -r-x section size 42 named 0.__TEXT.__text + rbp = rsp + rsp -= 0x10 +- rdi = rip + 0x43 // section.3.__TEXT.__cstring // 0x100000f72 // "%s %s\n" +- rsi = rip + 0x43 // str.17:31:50 // 0x100000f79 // "17:31:50" +- rdx = rip + 0x45 // str.Wed_Dec__2_17:31:49_2015 // 0x100000f82 // "Wed Dec 2 17:31:49 2015" ++ rdi = rip + 0x3b // section.3.__TEXT.__cstring // 0x100000f8a // "%s\n" ++ rsi = rip + 0x38 // str.15:52:34 // 0x100000f8e // "15:52:34" + al = 0 +- sym.imp.printf () // int printf("%s %s\n", "17:31:50", "Wed Dec 2 17:31:49 2015") ++ sym.imp.printf () // int printf("%s\n", "15:52:34") + ecx = 0 + dword [var_4h] = eax + eax = ecx + rsp += 0x10 + rbp = pop () + return // rsp // rsp } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/diffoscope-329/tests/data/nar_listing_expected_diff new/diffoscope-332/tests/data/nar_listing_expected_diff --- old/diffoscope-329/tests/data/nar_listing_expected_diff 1970-01-01 01:00:00.000000000 +0100 +++ new/diffoscope-332/tests/data/nar_listing_expected_diff 2026-09-28 22:33:20.000000000 +0200 @@ -0,0 +1,6 @@ +@@ -1,4 +1,4 @@ + directory . + directory dir +-symlink dir/link -> broken ++symlink dir/link -> really-broken + regular dir/text Binary files old/diffoscope-329/tests/data/test1.nar and new/diffoscope-332/tests/data/test1.nar differ Binary files old/diffoscope-329/tests/data/test2.nar and new/diffoscope-332/tests/data/test2.nar differ Binary files old/diffoscope-329/tests/data/test3.nar and new/diffoscope-332/tests/data/test3.nar differ Binary files old/diffoscope-329/tests/data/test4.nar and new/diffoscope-332/tests/data/test4.nar differ
