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

Reply via email to