[Git][reproducible-builds/diffoscope][master] 2 commits: Add lz4 comparator

Mattia Rizzolo gitlab at salsa.debian.org
Sun Jul 8 11:04:11 CEST 2018


Mattia Rizzolo pushed to branch master at Reproducible Builds / diffoscope


Commits:
d494730e by Xavier Briand at 2018-06-15T15:48:21-04:00
Add lz4 comparator

Closes: #901548

- - - - -
7bd7e1f1 by Mattia Rizzolo at 2018-07-08T11:01:33+02:00
Merge branch 'lz4-comparator' of salsa.debian.org:xavierbriand-guest/diffoscope

Build-Depend on lz4 instead of python3-lz4, as we calling directly the
binary provided by the formere, not through the bindings of the latter.

MR: https://salsa.debian.org/reproducible-builds/diffoscope/merge_requests/4
Signed-off-by: Mattia Rizzolo <mattia at debian.org>

- - - - -


7 changed files:

- debian/control
- diffoscope/comparators/__init__.py
- + diffoscope/comparators/lz4.py
- diffoscope/external_tools.py
- + tests/comparators/test_lz4.py
- + tests/data/test1.lz4
- + tests/data/test2.lz4


Changes:

=====================================
debian/control
=====================================
--- a/debian/control
+++ b/debian/control
@@ -41,6 +41,7 @@ Build-Depends:
  libjs-jquery-tablesorter <!nocheck>,
  libjs-jquery-throttle-debounce <!nocheck>,
  llvm <!nocheck>,
+ lz4 <!nocheck>,
  mono-utils <!nocheck>,
  odt2txt <!nocheck>,
  oggvideotools <!nocheck>,


=====================================
diffoscope/comparators/__init__.py
=====================================
--- a/diffoscope/comparators/__init__.py
+++ b/diffoscope/comparators/__init__.py
@@ -64,6 +64,7 @@ class ComparatorManager(object):
         ('icc.IccFile',),
         ('iso9660.Iso9660File',),
         ('java.ClassFile',),
+        ('lz4.Lz4File',),
         ('mono.MonoExeFile',),
         ('pdf.PdfFile',),
         ('png.PngFile',),


=====================================
diffoscope/comparators/lz4.py
=====================================
--- /dev/null
+++ b/diffoscope/comparators/lz4.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+#
+# diffoscope: in-depth comparison of files, archives, and directories
+#
+# Copyright © 2018 Xavier Briand <xavierbriand at gmail.com>
+#
+# 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
+import os.path
+import logging
+import subprocess
+
+from diffoscope.tools import tool_required
+
+from .utils.file import File
+from .utils.archive import Archive
+
+logger = logging.getLogger(__name__)
+
+
+class Lz4Container(Archive):
+    def open_archive(self):
+        return self
+
+    def close_archive(self):
+        pass
+
+    def get_member_names(self):
+        return [self.get_compressed_content_name('.lz4')]
+
+    @tool_required('lz4')
+    def extract(self, member_name, dest_dir):
+        dest_path = os.path.join(dest_dir, member_name)
+        logger.debug('lz4 extracting to %s', dest_path)
+        with open(dest_path, 'wb') as fp:
+            subprocess.check_call(
+                ["lz4", "-d", "-c", self.source.path],
+                shell=False, stdout=fp, stderr=None)
+        return dest_path
+
+
+class Lz4File(File):
+    DESCRIPTION = "LZ4 compressed files"
+    CONTAINER_CLASS = Lz4Container
+    FILE_TYPE_RE = re.compile(r'^LZ4 compressed data \([^\)]+\)$')
+
+    # Work around file(1) Debian bug #876316
+    FALLBACK_FILE_EXTENSION_SUFFIX = ".lz4"
+    FALLBACK_FILE_TYPE_HEADER_PREFIX = b"\x04\x22M\x18"


=====================================
diffoscope/external_tools.py
=====================================
--- a/diffoscope/external_tools.py
+++ b/diffoscope/external_tools.py
@@ -145,6 +145,10 @@ EXTERNAL_TOOLS = {
         'arch': 'e2fsprogs',
         'FreeBSD': 'e2fsprogs',
     },
+    'lz4': {
+        'debian': 'lz4',
+        'FreeBSD': 'lz4',
+    },
     'msgunfmt': {
         'debian': 'gettext',
         'arch': 'gettext',


=====================================
tests/comparators/test_lz4.py
=====================================
--- /dev/null
+++ b/tests/comparators/test_lz4.py
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+#
+# diffoscope: in-depth comparison of files, archives, and directories
+#
+# Copyright © 2018 Xavier Briand <xavierbriand at gmail.com>
+#
+# 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 shutil
+import pytest
+
+from diffoscope.comparators.lz4 import Lz4File
+from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.utils.specialize import specialize
+
+from ..utils.data import load_fixture, get_data
+from ..utils.tools import skip_unless_tools_exist
+from ..utils.nonexisting import assert_non_existing
+
+lz41 = load_fixture('test1.lz4')
+lz42 = load_fixture('test2.lz4')
+
+
+def test_identification(lz41):
+    assert isinstance(lz41, Lz4File)
+
+
+def test_no_differences(lz41):
+    difference = lz41.compare(lz41)
+    assert difference is None
+
+
+ at pytest.fixture
+def differences(lz41, lz42):
+    return lz41.compare(lz42).details
+
+
+ at skip_unless_tools_exist('lz4')
+def test_content_source(differences):
+    assert differences[0].source1 == 'test1'
+    assert differences[0].source2 == 'test2'
+
+
+ at skip_unless_tools_exist('lz4')
+def test_content_source_without_extension(tmpdir, lz41, lz42):
+    path1 = str(tmpdir.join('test1'))
+    path2 = str(tmpdir.join('test2'))
+    shutil.copy(lz41.path, path1)
+    shutil.copy(lz42.path, path2)
+    lz41 = specialize(FilesystemFile(path1))
+    lz42 = specialize(FilesystemFile(path2))
+    difference = lz41.compare(lz42).details
+    assert difference[0].source1 == 'test1-content'
+    assert difference[0].source2 == 'test2-content'
+
+
+ at skip_unless_tools_exist('lz4')
+def test_content_diff(differences):
+    expected_diff = get_data('text_ascii_expected_diff')
+    assert differences[0].unified_diff == expected_diff
+
+
+ at skip_unless_tools_exist('lz4')
+def test_compare_non_existing(monkeypatch, lz41):
+    assert_non_existing(monkeypatch, lz41)


=====================================
tests/data/test1.lz4
=====================================
Binary files /dev/null and b/tests/data/test1.lz4 differ


=====================================
tests/data/test2.lz4
=====================================
Binary files /dev/null and b/tests/data/test2.lz4 differ



View it on GitLab: https://salsa.debian.org/reproducible-builds/diffoscope/compare/a7d86bb5b511b8ed0d63d0c7621c4acecc4774d6...7bd7e1f1c37a4e111c0c81dee9c7f8795c6cb5a6

-- 
View it on GitLab: https://salsa.debian.org/reproducible-builds/diffoscope/compare/a7d86bb5b511b8ed0d63d0c7621c4acecc4774d6...7bd7e1f1c37a4e111c0c81dee9c7f8795c6cb5a6
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.reproducible-builds.org/pipermail/rb-commits/attachments/20180708/782d62b5/attachment.html>


More information about the rb-commits mailing list