Package: diffoscope Version: 81 Severity: wishlist Tags: patch I've worked on support for diffing .dtb files, a format used to describe systems such as powerpc, arm and mips.
Attached are two patches, the first implementing support, and the second adding tests. They're also available as a git branch: https://anonscm.debian.org/cgit/reproducible/diffoscope.git/log/?h=vagrant/dtb I basically copied the openssh pub key diffing support and modifed to support .dtb files instead. Any comments, suggestions or improvements welcome! live well, vagrant
From c55c67da65ed37bd4268005fbdede27767b1331b Mon Sep 17 00:00:00 2001 From: Vagrant Cascadian <[email protected]> Date: Mon, 24 Apr 2017 10:21:21 -0700 Subject: [PATCH 1/2] Add support for .dtb (device tree blob) files. --- diffoscope/comparators/__init__.py | 1 + diffoscope/comparators/dtb.py | 39 ++++++++++++++++++++++++++++++++++++++ diffoscope/external_tools.py | 3 +++ 3 files changed, 43 insertions(+) create mode 100644 diffoscope/comparators/dtb.py diff --git a/diffoscope/comparators/__init__.py b/diffoscope/comparators/__init__.py index 81f6d16..6527b6d 100644 --- a/diffoscope/comparators/__init__.py +++ b/diffoscope/comparators/__init__.py @@ -84,6 +84,7 @@ class ComparatorManager(object): ('gif.GifFile',), ('pcap.PcapFile',), ('pgp.PgpFile',), + ('dtb.DeviceTreeFile',), ) _singleton = {} diff --git a/diffoscope/comparators/dtb.py b/diffoscope/comparators/dtb.py new file mode 100644 index 0000000..12dbf39 --- /dev/null +++ b/diffoscope/comparators/dtb.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# diffoscope: in-depth comparison of files, archives, and directories +# +# Copyright © 2016 Emanuel Bronshtein <[email protected]> +# Copyright © 2016 Vagrant Cascadian <[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 re + +from diffoscope.tools import tool_required +from diffoscope.difference import Difference + +from .utils.file import File +from .utils.command import Command + + +class DeviceTreeContents(Command): + @tool_required('fdtdump') + def cmdline(self): + return ['fdtdump', self.path] + +class DeviceTreeFile(File): + RE_FILE_TYPE = re.compile(r'^Device Tree Blob') + + def compare_details(self, other, source=None): + return [Difference.from_command(DeviceTreeContents, self.path, other.path)] diff --git a/diffoscope/external_tools.py b/diffoscope/external_tools.py index 3ce2cbd..8788936 100644 --- a/diffoscope/external_tools.py +++ b/diffoscope/external_tools.py @@ -57,6 +57,9 @@ EXTERNAL_TOOLS = { 'debian': 'enjarify', 'arch': 'enjarify', }, + 'fdtdump': { + 'debian': 'device-tree-compiler', + }, 'file': { 'debian': 'file', 'arch': 'file', -- 2.11.0
From 78d43c516db58a89c23ee41a1eb23e47bf2109c8 Mon Sep 17 00:00:00 2001 From: Vagrant Cascadian <[email protected]> Date: Mon, 24 Apr 2017 10:35:52 -0700 Subject: [PATCH 2/2] Add tests for .dtb files. --- debian/control | 1 + debian/copyright | 12 ++++++ tests/comparators/test_dtb.py | 57 +++++++++++++++++++++++++++++ tests/data/devicetree1.dtb | Bin 0 -> 68260 bytes tests/data/devicetree2.dtb | Bin 0 -> 68323 bytes tests/data/devicetree_expected_diff | 71 ++++++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+) create mode 100644 tests/comparators/test_dtb.py create mode 100644 tests/data/devicetree1.dtb create mode 100644 tests/data/devicetree2.dtb create mode 100644 tests/data/devicetree_expected_diff diff --git a/debian/control b/debian/control index d0eef28..e3cbc55 100644 --- a/debian/control +++ b/debian/control @@ -19,6 +19,7 @@ Build-Depends: dh-python (>= 2.20160818~), docx2txt <!nocheck>, dpkg-dev (>= 1.17.14), + device-tree-compiler <!nocheck>, enjarify <!nocheck>, fontforge-extras <!nocheck>, fp-utils <!nocheck>, diff --git a/debian/copyright b/debian/copyright index ac52ac0..8c0e230 100644 --- a/debian/copyright +++ b/debian/copyright @@ -93,6 +93,18 @@ Copyright: 2007-2014 OpenWrt.org 2010 Vertical Communications License: GPL-2 +Files: tests/data/devicetree*.dtb +Copyright: + 2015 Nikolaus Schaller <[email protected]> + 2012 Texas Instruments Incorporated - http:www.ti.com/ + 2011 Texas Instruments Incorporated - http:www.ti.com/ + 2013 Linaro, Ltd. + 2015 Sakari Ailus + 2011 Texas Instruments Incorporated - http:www.ti.com/ + 2017 Texas Instruments Incorporated - http:www.ti.com/ + 2009-2010 Texas Instruments / 2009 Nokia +License: GPL-2 + Files: debian/* Copyright: 2014-2015 Jérémy Bobbio <[email protected]> License: GPL-3+ diff --git a/tests/comparators/test_dtb.py b/tests/comparators/test_dtb.py new file mode 100644 index 0000000..8dbc6c3 --- /dev/null +++ b/tests/comparators/test_dtb.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# diffoscope: in-depth comparison of files, archives, and directories +# +# Copyright © 2016 Emanuel Bronshtein <[email protected]> +# Copyright © 2017 Vagrant Cascadian <[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 +import subprocess + +from diffoscope.config import Config +from diffoscope.comparators.dtb import DeviceTreeFile +from diffoscope.comparators.missing_file import MissingFile + +from utils.data import load_fixture, get_data +from utils.tools import skip_unless_tools_exist + +# Generated by: dtc --in-format=dts --out-format=dtb --out=devicetree1.dtb devicetree1.dts +dtb1 = load_fixture('devicetree1.dtb') +# Generated by: dtc --in-format=dts --out-format=dtb --out=devicetree2.dtb devicetree2.dts +dtb2 = load_fixture('devicetree2.dtb') + +def test_identification(dtb1): + assert isinstance(dtb1, DeviceTreeFile) + +def test_no_differences(dtb1): + difference = dtb1.compare(dtb1) + assert difference is None + [email protected] +def differences(dtb1, dtb2): + return dtb1.compare(dtb2).details + +@skip_unless_tools_exist('fdtdump') +def test_diff(differences): + expected_diff = get_data('devicetree_expected_diff') + assert differences[0].unified_diff == expected_diff + +@skip_unless_tools_exist('fdtdump') +def test_compare_non_existing(monkeypatch, dtb1): + monkeypatch.setattr(Config(), 'new_file', True) + difference = dtb1.compare(MissingFile('/nonexisting', dtb1)) + assert difference.source2 == '/nonexisting' + assert len(difference.details) > 0 diff --git a/tests/data/devicetree1.dtb b/tests/data/devicetree1.dtb new file mode 100644 index 0000000000000000000000000000000000000000..996dc01710be662f1d73895edbe09e286e341710 GIT binary patch literal 68260 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 Qsf_vZM6I-hZE^Jf0pVA0-v9sr literal 0 HcmV?d00001 diff --git a/tests/data/devicetree2.dtb b/tests/data/devicetree2.dtb new file mode 100644 index 0000000000000000000000000000000000000000..8e4fb0c33e0cd3f894d1549464f566725901b58e GIT binary patch literal 68323 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 literal 0 HcmV?d00001 diff --git a/tests/data/devicetree_expected_diff b/tests/data/devicetree_expected_diff new file mode 100644 index 0000000..7e4f5ed --- /dev/null +++ b/tests/data/devicetree_expected_diff @@ -0,0 +1,71 @@ +@@ -1,18 +1,18 @@ + /dts-v1/; + // magic: 0xd00dfeed +-// totalsize: 0x10aa4 (68260) ++// totalsize: 0x10ae3 (68323) + // off_dt_struct: 0x38 +-// off_dt_strings: 0x10234 ++// off_dt_strings: 0x10264 + // off_mem_rsvmap: 0x28 + // version: 17 + // last_comp_version: 16 + // boot_cpuid_phys: 0x0 +-// size_dt_strings: 0x870 +-// size_dt_struct: 0x101fc ++// size_dt_strings: 0x87f ++// size_dt_struct: 0x1022c + + / { + compatible = "openpandora,omap3-pandora-1ghz", "ti,omap36xx", "ti,omap3"; + interrupt-parent = <0x00000001>; + #address-cells = <0x00000001>; + #size-cells = <0x00000001>; + model = "Pandora Handheld Console 1GHz"; +@@ -82,14 +82,15 @@ + #size-cells = <0x00000001>; + ranges = <0x00000000 0x00002000 0x00002000>; + pinmux@30 { + compatible = "ti,omap3-padconf", "pinctrl-single"; + reg = <0x00000030 0x00000238>; + #address-cells = <0x00000001>; + #size-cells = <0x00000000>; ++ #pinctrl-cells = <0x00000001>; + #interrupt-cells = <0x00000001>; + interrupt-controller; + pinctrl-single,register-width = <0x00000010>; + pinctrl-single,function-mask = <0x0000ff1f>; + linux,phandle = <0x000000e4>; + phandle = <0x000000e4>; + pinmux_mmc1_pins { +@@ -240,14 +241,15 @@ + clockdomains { + }; + pinmux@a00 { + compatible = "ti,omap3-padconf", "pinctrl-single"; + reg = <0x00000a00 0x0000005c>; + #address-cells = <0x00000001>; + #size-cells = <0x00000000>; ++ #pinctrl-cells = <0x00000001>; + #interrupt-cells = <0x00000001>; + interrupt-controller; + pinctrl-single,register-width = <0x00000010>; + pinctrl-single,function-mask = <0x0000ff1f>; + pinmux_twl4030_vpins { + pinctrl-single,pins = <0x00000000 0x00000100 0x00000002 0x00000100 0x00000006 0x00000000 0x00000018 0x00000000>; + linux,phandle = <0x000000e7>; +@@ -3500,14 +3502,15 @@ + ti,abb_info = <0x000f7314 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00124f80 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x001437c8 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x0014fb18 0x00000001 0x00000000 0x00000000 0x00000000 0x00000000>; + }; + pinmux@480025a0 { + compatible = "ti,omap3-padconf", "pinctrl-single"; + reg = <0x480025a0 0x0000005c>; + #address-cells = <0x00000001>; + #size-cells = <0x00000000>; ++ #pinctrl-cells = <0x00000001>; + #interrupt-cells = <0x00000001>; + interrupt-controller; + pinctrl-single,register-width = <0x00000010>; + pinctrl-single,function-mask = <0x0000ff1f>; + pinctrl-names = "default"; + pinctrl-0 = <0x00000106 0x00000107>; + pinmux_hsusb2_2_pins { -- 2.11.0
signature.asc
Description: PGP signature

