[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