base16-schemes: unstable-2024-06-21 -> unstable-2024-11-12 (#356361)
[NixPkgs.git] / pkgs / tools / misc / diffoscope / default.nix
blob31f8c6b2c8e4fdc6011815c1189583e515cb9cf8
2   lib,
3   stdenv,
4   abootimg,
5   acl,
6   apksigcopier,
7   apksigner,
8   apktool,
9   binutils-unwrapped-all-targets,
10   bzip2,
11   cbfstool,
12   cdrkit,
13   colord,
14   colordiff,
15   coreutils,
16   cpio,
17   db,
18   diffutils,
19   docutils,
20   dtc,
21   e2fsprogs,
22   enableBloat ? true,
23   enjarify,
24   fetchurl,
25   file,
26   findutils,
27   fontforge-fonttools,
28   ffmpeg,
29   fpc,
30   gettext,
31   ghc,
32   ghostscriptX,
33   giflib,
34   gnumeric,
35   gnupg,
36   gnutar,
37   gzip,
38   hdf5,
39   help2man,
40   html2text,
41   imagemagick,
42   installShellFiles,
43   jdk,
44   libarchive,
45   libcaca,
46   libxmlb,
47   llvm,
48   lz4,
49   lzip,
50   mono,
51   ocaml,
52   odt2txt,
53   oggvideotools,
54   openssh,
55   openssl,
56   pdftk,
57   pgpdump,
58   poppler_utils,
59   procyon,
60   python3,
61   qemu,
62   R,
63   sng,
64   sqlite,
65   squashfsTools,
66   tcpdump,
67   ubootTools,
68   unzip,
69   wabt,
70   xmlbeans,
71   xxd,
72   xz,
73   zip,
74   zstd,
75   # updater only
76   writeScript,
79 let
80   python = python3.override {
81     self = python;
82     packageOverrides = final: prev: {
83       # version 4 or newer would log the followng error but tests currently don't fail because radare2 is disabled
84       # ValueError: argument TNULL is not a TLSH hex string
85       tlsh = prev.tlsh.overridePythonAttrs (
86         { src, ... }:
87         let
88           version = "3.19.1";
89         in
90         {
91           inherit version;
92           src = src.override {
93             rev = version;
94             hash = "sha256-ZYEjT/yShfA4+zpbGOtaFOx1nSSOWPtMvskPhHv3c9U=";
95           };
96         }
97       );
98     };
99   };
102 # Note: when upgrading this package, please run the list-missing-tools.sh script as described below!
103 python.pkgs.buildPythonApplication rec {
104   pname = "diffoscope";
105   version = "283";
107   src = fetchurl {
108     url = "https://diffoscope.org/archive/diffoscope-${version}.tar.bz2";
109     hash = "sha256-4kAM1MmWbFh0fqFSnulhm4lHR59PMNPR3z5nzBgI6WY=";
110   };
112   outputs = [
113     "out"
114     "man"
115   ];
117   patches = [ ./ignore_links.patch ];
119   postPatch = ''
120     # Upstream doesn't provide a PKG-INFO file
121     sed -i setup.py -e "/'rpm-python',/d"
123     # When generating manpage, use the installed version
124     substituteInPlace doc/Makefile --replace "../bin" "$out/bin"
125   '';
127   nativeBuildInputs = [
128     docutils
129     help2man
130     installShellFiles
131   ];
133   # Most of the non-Python dependencies here are optional command-line tools for various file-format parsers.
134   # To help figuring out what's missing from the list, run: ./pkgs/tools/misc/diffoscope/list-missing-tools.sh
135   #
136   # Still missing these tools:
137   # Android-specific tools:
138   # aapt2
139   # dexdump
140   # Darwin-specific tools:
141   # lipo
142   # otool
143   # Other tools:
144   # docx2txt <- makes tests broken:
145   # > FAILED tests/comparators/test_docx.py::test_diff - IndexError: list index out of range
146   # > FAILED tests/comparators/test_docx.py::test_compare_non_existing - AssertionError
147   # radare2
148   # > FAILED tests/comparators/test_elf_decompiler.py::test_ghidra_diff - IndexError: list index out of range
149   # > FAILED tests/comparators/test_elf_decompiler.py::test_radare2_diff - AssertionError
150   # > FAILED tests/comparators/test_macho_decompiler.py::test_ghidra_diff - assert 0 == 1
151   # > FAILED tests/comparators/test_macho_decompiler.py::test_radare2_diff - AssertionError
152   #
153   # We filter automatically all packages for the host platform (some dependencies are not supported on Darwin, aarch64, etc.).
154   # Packages which are marked broken for a platform are not automatically filtered to avoid accidentally removing them without noticing it.
155   pythonPath = lib.filter (lib.meta.availableOn stdenv.hostPlatform) (
156     [
157       acl
158       binutils-unwrapped-all-targets
159       bzip2
160       cdrkit
161       colordiff
162       coreutils
163       cpio
164       db
165       diffutils
166       dtc
167       e2fsprogs
168       file
169       findutils
170       fontforge-fonttools
171       gettext
172       gnutar
173       gzip
174       html2text
175       libarchive
176       libxmlb
177       lz4
178       lzip
179       openssl
180       pgpdump
181       sng
182       sqlite
183       squashfsTools
184       unzip
185       xxd
186       xz
187       zip
188       zstd
189     ]
190     ++ (with python.pkgs; [
191       argcomplete
192       debian
193       defusedxml
194       jsbeautifier
195       jsondiff
196       libarchive-c
197       progressbar33
198       pypdf
199       python-magic
200       pyxattr
201       rpm
202       tlsh
203     ])
204     ++ lib.optionals enableBloat (
205       [
206         abootimg
207         apksigcopier
208         apksigner
209         apktool
210         cbfstool
211         colord
212         enjarify
213         ffmpeg
214         fpc
215         ghc
216         ghostscriptX
217         giflib
218         gnupg
219         hdf5
220         imagemagick
221         jdk
222         libcaca
223         llvm
224         mono
225         ocaml
226         odt2txt
227         openssh
228         pdftk
229         poppler_utils
230         procyon
231         qemu
232         R
233         tcpdump
234         ubootTools
235         wabt
236         xmlbeans
237       ]
238       ++ (with python.pkgs; [
239         androguard
240         binwalk
241         guestfs
242         h5py
243         pdfminer-six
244         r2pipe
245         # docx2txt, nixpkgs packages another project named the same, which does not work
246       ])
247       # oggvideotools is broken on Darwin, please put it back when it will be fixed?
248       ++ lib.optionals stdenv.hostPlatform.isLinux [ oggvideotools ]
249       # This doesn't work on aarch64-darwin
250       ++ lib.optionals (stdenv.hostPlatform.system != "aarch64-darwin") [ gnumeric ]
251     )
252   );
254   nativeCheckInputs = with python.pkgs; [ pytestCheckHook ] ++ pythonPath;
256   pytestFlagsArray = [
257     # Always show more information when tests fail
258     "-vv"
259   ];
261   postInstall = ''
262     make -C doc
263     installManPage doc/diffoscope.1
264   '';
266   disabledTests =
267     [
268       "test_sbin_added_to_path"
269       "test_diff_meta"
270       "test_diff_meta2"
272       # Fails because it fails to determine llvm version
273       "test_item3_deflate_llvm_bitcode"
274     ]
275     ++ lib.optionals stdenv.hostPlatform.isDarwin [
276       # Disable flaky tests on Darwin
277       "test_non_unicode_filename"
278       "test_listing"
279       "test_symlink_root"
281       # Appears to be a sandbox related issue
282       "test_trim_stderr_in_command"
283       # Seems to be a bug caused by having different versions of rdata than
284       # expected. Will file upstream.
285       "test_item_rdb"
286       # Caused by getting an otool command instead of llvm-objdump. Could be Nix
287       # setup, could be upstream bug. Will file upstream.
288       "test_libmix_differences"
289     ];
291   disabledTestPaths = lib.optionals stdenv.hostPlatform.isDarwin [
292     "tests/comparators/test_git.py"
293     "tests/comparators/test_java.py"
294     "tests/comparators/test_uimage.py"
295     "tests/comparators/test_device.py"
296     "tests/comparators/test_macho.py"
297   ];
299   passthru = {
300     updateScript = writeScript "update-diffoscope" ''
301       #!/usr/bin/env nix-shell
302       #!nix-shell -i bash -p curl pcre common-updater-scripts
304       set -eu -o pipefail
306       # Expect the text in format of "Latest release: 198 (31 Dec 2021)"'.
307       newVersion="$(curl -s https://diffoscope.org/ | pcregrep -o1 'Latest release: ([0-9]+)')"
308       update-source-version ${pname} "$newVersion"
309     '';
310   };
312   meta = with lib; {
313     description = "Perform in-depth comparison of files, archives, and directories";
314     longDescription = ''
315       diffoscope will try to get to the bottom of what makes files or directories
316       different. It will recursively unpack archives of many kinds and transform
317       various binary formats into more human readable form to compare them. It can
318       compare two tarballs, ISO images, or PDF just as easily. The differences can
319       be shown in a text or HTML report.
321       diffoscope is developed as part of the "reproducible builds" Debian
322       project and was formerly known as "debbindiff".
323     '';
324     homepage = "https://diffoscope.org/";
325     changelog = "https://diffoscope.org/news/diffoscope-${version}-released/";
326     license = licenses.gpl3Plus;
327     maintainers = with maintainers; [
328       dezgeg
329       danielfullmer
330       raitobezarius
331     ];
332     platforms = platforms.unix;
333     mainProgram = "diffoscope";
334   };