[Reproducible-commits] [diffoscope] 01/01: Add --new-file to treat absent files as empty
Jérémy Bobbio
lunar at moszumanska.debian.org
Wed Sep 2 21:04:00 UTC 2015
This is an automated email from the git hooks/post-receive script.
lunar pushed a commit to branch pu/new_file
in repository diffoscope.
commit 1d4af059cfb35f99bf326da307ae04ee85b761c7
Author: Jérémy Bobbio <lunar at debian.org>
Date: Wed Sep 2 20:52:56 2015 +0000
Add --new-file to treat absent files as empty
When specifying --new-file, diffoscope will treat files missing
from a container as empty.
One can also compare against an empty file by specifying /dev/null
on the command line.
XXX: Actually, we need to make this work when specifying an arbitrary
XXX: non-existant file on the command line.
XXX: To make this work, we lose proper file name for gz, bzip2,
XXX: and xz.
Thanks Jakub Wilk for the suggestion.
Closes: #797560
---
diffoscope/__main__.py | 3 ++
diffoscope/changes.py | 3 ++
diffoscope/comparators/__init__.py | 26 ++++++++++--
diffoscope/comparators/binary.py | 51 +++++++++++++++++++++++
diffoscope/comparators/bzip2.py | 12 ++----
diffoscope/comparators/deb.py | 9 +++--
diffoscope/comparators/debian.py | 23 +++++++++--
diffoscope/comparators/gzip.py | 12 ++----
diffoscope/comparators/utils.py | 57 ++++++++++++++++++++++++--
diffoscope/comparators/xz.py | 12 ++----
diffoscope/config.py | 9 +++++
diffoscope/difference.py | 81 ++++++++++++++++++++++++++++++-------
tests/comparators/test_binary.py | 6 ++-
tests/comparators/test_bzip2.py | 8 +++-
tests/comparators/test_cpio.py | 8 +++-
tests/comparators/test_deb.py | 8 +++-
tests/comparators/test_debian.py | 9 ++++-
tests/comparators/test_elf.py | 10 ++++-
tests/comparators/test_fonts.py | 6 ++-
tests/comparators/test_gettext.py | 6 ++-
tests/comparators/test_gzip.py | 10 ++++-
tests/comparators/test_ipk.py | 8 +++-
tests/comparators/test_iso9660.py | 8 +++-
tests/comparators/test_java.py | 6 ++-
tests/comparators/test_mono.py | 6 ++-
tests/comparators/test_pdf.py | 6 ++-
tests/comparators/test_png.py | 6 ++-
tests/comparators/test_rpm.py | 8 +++-
tests/comparators/test_sqlite.py | 6 ++-
tests/comparators/test_squashfs.py | 8 +++-
tests/comparators/test_tar.py | 8 +++-
tests/comparators/test_text.py | 6 ++-
tests/comparators/test_utils.py | 23 +++++++++++
tests/comparators/test_xz.py | 10 ++++-
tests/comparators/test_zip.py | 8 +++-
tests/data/fuzzy-tar-in-tar1.tar | Bin 0 -> 20480 bytes
tests/data/fuzzy-tar-in-tar2.tar | Bin 0 -> 20480 bytes
37 files changed, 408 insertions(+), 78 deletions(-)
diff --git a/diffoscope/__main__.py b/diffoscope/__main__.py
index 927e9ad..1835eea 100644
--- a/diffoscope/__main__.py
+++ b/diffoscope/__main__.py
@@ -68,6 +68,8 @@ def create_parser():
'(0 to disable, %d is default, 400 is high fuzziness)' %
(Config.general.fuzzy_threshold),
default=Config.general.fuzzy_threshold)
+ parser.add_argument('--new-file', dest='new_file', action='store_true',
+ help='treat absent files as empty')
parser.add_argument('--css', metavar='url', dest='css_url',
help='link to an extra CSS for the HTML report')
parser.add_argument('file1', help='first file to compare')
@@ -107,6 +109,7 @@ def run_diffoscope(parsed_args):
Config.general.max_diff_input_lines = parsed_args.max_diff_input_lines
Config.general.max_report_size = parsed_args.max_report_size
Config.general.fuzzy_threshold = parsed_args.fuzzy_threshold
+ Config.general.new_file = parsed_args.new_file
if parsed_args.debug:
logger.setLevel(logging.DEBUG)
set_locale()
diff --git a/diffoscope/changes.py b/diffoscope/changes.py
index 0189dc4..e9afa7d 100644
--- a/diffoscope/changes.py
+++ b/diffoscope/changes.py
@@ -127,6 +127,9 @@ class Changes(object):
return [os.path.join(self._directory, z['name'])
for z in self._data['Files']]
+ def keys(self):
+ return self._data.keys()
+
def __getitem__(self, key):
"""
Returns the value of the rfc822 key specified.
diff --git a/diffoscope/comparators/__init__.py b/diffoscope/comparators/__init__.py
index 3181985..5fb7a90 100644
--- a/diffoscope/comparators/__init__.py
+++ b/diffoscope/comparators/__init__.py
@@ -28,7 +28,7 @@ from diffoscope import logger, tool_required
from diffoscope.config import Config
from diffoscope.difference import Difference
from diffoscope.comparators.binary import \
- File, FilesystemFile, compare_binary_files
+ File, FilesystemFile, NonExistingFile, compare_binary_files
from diffoscope.comparators.bzip2 import Bzip2File
from diffoscope.comparators.java import ClassFile
from diffoscope.comparators.cpio import CpioFile
@@ -64,7 +64,16 @@ from diffoscope.comparators.zip import ZipFile
def compare_root_paths(path1, path2):
if os.path.isdir(path1) and os.path.isdir(path2):
return compare_directories(path1, path2)
- return compare_files(specialize(FilesystemFile(path1)), specialize(FilesystemFile(path2)))
+ if path1 == '/dev/null':
+ file2 = specialize(FilesystemFile(path2))
+ file1 = NonExistingFile(file2)
+ elif path2 == '/dev/null':
+ file1 = specialize(FilesystemFile(path1))
+ file2 = NonExistingFile(file1)
+ else:
+ file1 = specialize(FilesystemFile(path1))
+ file2 = specialize(FilesystemFile(path2))
+ return compare_files(file1, file2)
def compare_files(file1, file2, source=None):
@@ -75,7 +84,17 @@ def compare_files(file1, file2, source=None):
return None
specialize(file1)
specialize(file2)
- if file1.__class__.__name__ != file2.__class__.__name__:
+ if isinstance(file1, NonExistingFile):
+ logger.debug('Performing backward comparison')
+ # So now that comparators are all object-oriented, calling NonExistingFile.compare
+ # is going to give us quite dumb results. So we are good do the comparison backward
+ # and then reverse it.
+ backward_diff = file2.compare(file1, source=[source or file2.name, '/dev/null'])
+ if backward_diff:
+ return backward_diff.get_reverse()
+ elif isinstance(file2, NonExistingFile):
+ return file1.compare(file2, source=[source or file1.name, '/dev/null'])
+ elif file1.__class__.__name__ != file2.__class__.__name__:
return file1.compare_bytes(file2, source)
return file1.compare(file2, source)
@@ -83,6 +102,7 @@ def compare_files(file1, file2, source=None):
# The order matters! They will be tried in turns.
FILE_CLASSES = (
Directory,
+ NonExistingFile,
Symlink,
Device,
DotChangesFile,
diff --git a/diffoscope/comparators/binary.py b/diffoscope/comparators/binary.py
index 8060a17..50fbfc9 100644
--- a/diffoscope/comparators/binary.py
+++ b/diffoscope/comparators/binary.py
@@ -26,6 +26,7 @@ import os.path
import re
from stat import S_ISCHR, S_ISBLK
import subprocess
+import tempfile
import tlsh
import magic
from diffoscope.difference import Difference
@@ -197,6 +198,7 @@ class File(object):
return difference
return self.compare_bytes(other, source)
+
class FilesystemFile(File):
def __init__(self, path):
self._path = None
@@ -220,3 +222,52 @@ class FilesystemFile(File):
def is_device(self):
mode = os.lstat(self._name).st_mode
return S_ISCHR(mode) or S_ISBLK(mode)
+
+
+class NonExistingFile(File):
+ """Represents a missing file when comparing containers"""
+
+ @staticmethod
+ def recognizes(file):
+ return False
+
+ def __init__(self, other_file):
+ self._path = None
+ self._name = '/dev/null'
+ self._other_file = other_file
+
+ @contextmanager
+ def get_content(self):
+ self._path = '/dev/null'
+ yield
+ self._path = None
+
+ def is_directory(self):
+ return False
+
+ def is_symlink(self):
+ return False
+
+ def is_device(self):
+ return False
+
+ # Be nice to text comparisons
+ @property
+ def encoding(self):
+ return self._other_file.encoding
+
+ # Be nice to device comparisons
+ def get_device(self):
+ return ''
+
+ # Be nice to metadata comparisons
+ @property
+ def magic_file_type(self):
+ return self._other_file.magic_file_type
+
+ # Be nice to .changes comparisons
+ @property
+ def changes(self):
+ class DummyChanges(dict):
+ get_as_string = lambda self, _: ''
+ return DummyChanges(Files=[], Version='')
diff --git a/diffoscope/comparators/bzip2.py b/diffoscope/comparators/bzip2.py
index 9b6f383..7d70048 100644
--- a/diffoscope/comparators/bzip2.py
+++ b/diffoscope/comparators/bzip2.py
@@ -39,7 +39,9 @@ class Bzip2Container(Archive):
self._path = None
def get_member_names(self):
- return [get_compressed_content_name(self.path, '.bz2')]
+ # XXX: require fuzzy matching accross containers
+ #return [get_compressed_content_name(self.path, '.bz2')]
+ return 'bzip2-content'
@tool_required('bzip2')
def extract(self, member_name, dest_dir):
@@ -51,14 +53,6 @@ class Bzip2Container(Archive):
shell=False, stdout=fp, stderr=None)
return dest_path
- def compare(self, other, source=None):
- my_file = self.get_member(self.get_member_names()[0])
- other_file = other.get_member(other.get_member_names()[0])
- source = None
- if my_file.name == other_file.name:
- source = my_file.name
- return [diffoscope.comparators.compare_files(my_file, other_file, source)]
-
class Bzip2File(File):
RE_FILE_TYPE = re.compile(r'^bzip2 compressed data\b')
diff --git a/diffoscope/comparators/deb.py b/diffoscope/comparators/deb.py
index 3283ad3..dce9e52 100644
--- a/diffoscope/comparators/deb.py
+++ b/diffoscope/comparators/deb.py
@@ -100,10 +100,11 @@ class Md5sumsFile(File):
@staticmethod
def parse_md5sums(path):
d = {}
- with open(path) as f:
- for line in f.readlines():
- md5sum, path = re.split(r'\s+', line.strip(), maxsplit=1)
- d[path] = md5sum
+ if path:
+ with open(path) as f:
+ for line in f.readlines():
+ md5sum, path = re.split(r'\s+', line.strip(), maxsplit=1)
+ d[path] = md5sum
return d
@needs_content
diff --git a/diffoscope/comparators/debian.py b/diffoscope/comparators/debian.py
index 4d5282f..43cb517 100644
--- a/diffoscope/comparators/debian.py
+++ b/diffoscope/comparators/debian.py
@@ -22,8 +22,9 @@ import os.path
import re
from diffoscope.changes import Changes
import diffoscope.comparators
-from diffoscope.comparators.binary import File, needs_content
+from diffoscope.comparators.binary import File, NonExistingFile, needs_content
from diffoscope.comparators.utils import Container
+from diffoscope.config import Config
from diffoscope.difference import Difference
@@ -110,6 +111,13 @@ class DotChangesContainer(Container):
source = my_canonical_names[canonical_name]
differences.append(
diffoscope.comparators.compare_files(my_file, other_file, source=source))
+ if Config.general.new_file:
+ for canonical_name in set(my_canonical_names.keys()) - set(other_canonical_names.keys()):
+ my_file = self.get_member(my_canonical_names[canonical_name])
+ differences.append(diffoscope.comparators.compare_files(my_file, NonExistingFile(my_file), source=[my_canonical_names[canonical_name], '/dev/null']))
+ for canonical_name in set(other_canonical_names.keys()) - set(my_canonical_names.keys()):
+ other_file = self.get_member(other_canonical_names[canonical_name])
+ differences.append(diffoscope.comparators.compare_files(NonExistingFile(other_file), other_file, source=['/dev/null', my_canonical_names[canonical_name]]))
return differences
@@ -134,10 +142,17 @@ class DotChangesFile(File):
def compare_details(self, other, source=None):
differences = []
- for field in DOT_CHANGES_FIELDS:
+ for field in sorted(set(self.changes.keys()).union(set(other.changes.keys()))):
+ if field.startswith('Checksums-') or field == 'Files':
+ continue
+ my_value = ''
+ if field in self.changes:
+ my_value = self.changes.get_as_string(field).lstrip()
+ other_value = ''
+ if field in other.changes:
+ other_value = other.changes.get_as_string(field).lstrip()
differences.append(Difference.from_unicode(
- self.changes[field].lstrip(),
- other.changes[field].lstrip(),
+ my_value, other_value,
self.path, other.path, source=field))
# compare Files as string
differences.append(Difference.from_unicode(self.changes.get_as_string('Files'),
diff --git a/diffoscope/comparators/gzip.py b/diffoscope/comparators/gzip.py
index fb99c84..446a2f5 100644
--- a/diffoscope/comparators/gzip.py
+++ b/diffoscope/comparators/gzip.py
@@ -40,7 +40,9 @@ class GzipContainer(Archive):
self._path = None
def get_member_names(self):
- return [get_compressed_content_name(self.path, '.gz')]
+ # XXX: need fuzzy matching across containers
+ #return [get_compressed_content_name(self.path, '.gz')]
+ return ['gzip-content']
@tool_required('gzip')
def extract(self, member_name, dest_dir):
@@ -52,14 +54,6 @@ class GzipContainer(Archive):
shell=False, stdout=fp, stderr=None)
return dest_path
- def compare(self, other, source=None):
- my_file = self.get_member(self.get_member_names()[0])
- other_file = other.get_member(other.get_member_names()[0])
- source = None
- if my_file.name == other_file.name:
- source = my_file.name
- return [diffoscope.comparators.compare_files(my_file, other_file, source)]
-
class GzipFile(object):
RE_FILE_TYPE = re.compile(r'^gzip compressed data\b')
diff --git a/diffoscope/comparators/utils.py b/diffoscope/comparators/utils.py
index 6edb0cd..1bd4cf6 100644
--- a/diffoscope/comparators/utils.py
+++ b/diffoscope/comparators/utils.py
@@ -28,7 +28,8 @@ import subprocess
import tempfile
from threading import Thread
import diffoscope.comparators
-from diffoscope.comparators.binary import File
+from diffoscope.comparators.binary import File, NonExistingFile
+from diffoscope.config import Config
from diffoscope.difference import Difference
from diffoscope import logger, tool_required
@@ -44,6 +45,8 @@ def make_temp_directory():
@tool_required('ar')
def get_ar_content(path):
+ if path == '/dev/null':
+ return ''
return subprocess.check_output(
['ar', 'tv', path], stderr=subprocess.STDOUT, shell=False).decode('utf-8')
@@ -176,15 +179,24 @@ class Container(object):
differences.append(
diffoscope.comparators.compare_files(
my_file, other_file, source=name))
- my_extra_files = map(self.get_member, my_names.difference(other_names))
- other_extra_files = map(other.get_member, other_names.difference(my_names))
+ my_extra_files = set(map(self.get_member, my_names.difference(other_names)))
+ other_extra_files = set(map(other.get_member, other_names.difference(my_names)))
+ my_fuzzy_files = set()
+ other_fuzzy_files = set()
for my_file, other_file, score in diffoscope.comparators.perform_fuzzy_matching(my_extra_files, other_extra_files):
+ my_fuzzy_files.add(my_file)
+ other_fuzzy_files.add(other_file)
difference = diffoscope.comparators.compare_files(my_file, other_file)
if difference is None:
difference = Difference(None, my_file.name, other_file.name)
difference.add_comment(
'Files similar despite different names (difference score: %d)' % score)
differences.append(difference)
+ if Config.general.new_file:
+ for my_file in my_extra_files - my_fuzzy_files:
+ differences.append(diffoscope.comparators.compare_files(my_file, NonExistingFile(my_file), source=my_file.name))
+ for other_file in other_extra_files - other_fuzzy_files:
+ differences.append(diffoscope.comparators.compare_files(NonExistingFile(other_file), other_file, source=other_file.name))
return differences
@@ -233,7 +245,9 @@ class Archive(Container):
@contextmanager
def open(self):
- if self._archive is not None:
+ if isinstance(self.source, NonExistingFile):
+ yield NonExistingArchive(self.source)
+ elif self._archive is not None:
yield self
else:
with self.source.get_content():
@@ -266,3 +280,38 @@ class Archive(Container):
def get_member(self, member_name):
return ArchiveMember(self, member_name)
+
+
+class NonExistingArchiveLikeObject(object):
+ def getnames(self):
+ return []
+
+ def list(self, *args, **kwargs):
+ return ''
+
+ def close(self):
+ pass
+
+class NonExistingArchive(Archive):
+ @property
+ def archive(self):
+ return NonExistingArchiveLikeObject()
+
+ def open_archive(self):
+ # should never be called
+ raise NotImplemented
+
+ def close_archive(self):
+ # should never be called
+ raise NotImplemented
+
+ def get_member_names(self):
+ return []
+
+ def extract(self, member_name, dest_dir):
+ # should never be called
+ raise NotImplemented
+
+ def get_member(self, member_name):
+ # should never be called
+ raise NotImplemented
diff --git a/diffoscope/comparators/xz.py b/diffoscope/comparators/xz.py
index f14a2f7..7059afe 100644
--- a/diffoscope/comparators/xz.py
+++ b/diffoscope/comparators/xz.py
@@ -39,7 +39,9 @@ class XzContainer(Archive):
self._path = None
def get_member_names(self):
- return [get_compressed_content_name(self.path, '.xz')]
+ # XXX: need fuzzy matching across containers
+ #return [get_compressed_content_name(self.path, '.xz')]
+ return ['xz-content']
@tool_required('xz')
def extract(self, member_name, dest_dir):
@@ -51,14 +53,6 @@ class XzContainer(Archive):
shell=False, stdout=fp, stderr=None)
return dest_path
- def compare(self, other, source=None):
- my_file = self.get_member(self.get_member_names()[0])
- other_file = other.get_member(other.get_member_names()[0])
- source = None
- if my_file.name == other_file.name:
- source = my_file.name
- return [diffoscope.comparators.compare_files(my_file, other_file, source)]
-
class XzFile(File):
RE_FILE_TYPE = re.compile(r'^XZ compressed data$')
diff --git a/diffoscope/config.py b/diffoscope/config.py
index 4468fc8..5087306 100644
--- a/diffoscope/config.py
+++ b/diffoscope/config.py
@@ -31,6 +31,7 @@ class Config(object):
self._max_diff_input_lines = 100000 # GNU diff cannot process arbitrary large files :(
self._max_report_size = 2000 * 2 ** 10 # 2000 kB
self._fuzzy_threshold = 60
+ self._new_file = False
@classproperty
def general(cls):
@@ -69,3 +70,11 @@ class Config(object):
@fuzzy_threshold.setter
def fuzzy_threshold(self, value):
self._fuzzy_threshold = value
+
+ @property
+ def new_file(self):
+ return self._new_file
+
+ @new_file.setter
+ def new_file(self, value):
+ self._new_file = value
diff --git a/diffoscope/difference.py b/diffoscope/difference.py
index 26996ce..c2f7014 100644
--- a/diffoscope/difference.py
+++ b/diffoscope/difference.py
@@ -220,6 +220,12 @@ def make_feeder_from_unicode(content):
return feeder
+def empty_file_feeder():
+ def feeder(f):
+ return False
+ return feeder
+
+
def make_feeder_from_file(in_file, filter=lambda buf: buf.encode('utf-8')):
def feeder(out_file):
line_count = 0
@@ -236,6 +242,7 @@ def make_feeder_from_file(in_file, filter=lambda buf: buf.encode('utf-8')):
return end_nl
return feeder
+
def make_feeder_from_command(command):
def feeder(out_file):
end_nl = make_feeder_from_file(command.stdout, command.filter)(out_file)
@@ -264,7 +271,10 @@ class Difference(object):
def __init__(self, unified_diff, path1, path2, source=None, comment=None):
self._comments = []
if comment:
- self._comments.append(comment)
+ if type(comment) is list:
+ self._comments.extend(comment)
+ else:
+ self._comments.append(comment)
self._unified_diff = unified_diff
# allow to override declared file paths, useful when comparing
# tempfiles
@@ -314,22 +324,32 @@ class Difference(object):
if 'command_args' in kwargs:
command_args = kwargs['command_args']
del kwargs['command_args']
- command1 = cls(path1, *command_args)
- command2 = cls(path2, *command_args)
+ command1 = None
+ if path1 and path1 != '/dev/null':
+ command1 = cls(path1, *command_args)
+ feeder1 = make_feeder_from_command(command1)
+ else:
+ path1 = '/dev/null'
+ feeder1 = empty_file_feeder()
+ command2 = None
+ if path2 and path2 != '/dev/null':
+ command2 = cls(path2, *command_args)
+ feeder2 = make_feeder_from_command(command2)
+ else:
+ path2 = '/dev/null'
+ feeder2 = empty_file_feeder()
if 'source' not in kwargs:
- kwargs['source'] = ' '.join(map(lambda x: '{}' if x == command1.path else x, command1.cmdline()))
- difference = Difference.from_feeder(make_feeder_from_command(command1),
- make_feeder_from_command(command2),
- path1, path2, *args, **kwargs)
+ source_cmd = command1 or command2
+ kwargs['source'] = ' '.join(map(lambda x: '{}' if x == source_cmd.path else x, source_cmd.cmdline()))
+ difference = Difference.from_feeder(feeder1, feeder2, path1, path2, *args, **kwargs)
if not difference:
return None
- if command1.stderr_content or command2.stderr_content:
- if command1.stderr_content:
- difference.add_comment('stderr from `%s`:' % ' '.join(command1.cmdline()))
- difference.add_comment(command1.stderr_content)
- if command2.stderr_content:
- difference.add_comment('stderr from `%s`:' % ' '.join(command2.cmdline()))
- difference.add_comment(command2.stderr_content)
+ if command1 and command1.stderr_content:
+ difference.add_comment('stderr from `%s`:' % ' '.join(command1.cmdline()))
+ difference.add_comment(command1.stderr_content)
+ if command2 and command2.stderr_content:
+ difference.add_comment('stderr from `%s`:' % ' '.join(command2.cmdline()))
+ difference.add_comment(command2.stderr_content)
return difference
@property
@@ -364,8 +384,41 @@ class Difference(object):
raise TypeError("'differences' must contains Difference objects'")
self._details.extend(differences)
+ def get_reverse(self):
+ if self._unified_diff is None:
+ unified_diff = None
+ else:
+ unified_diff = reverse_unified_diff(self._unified_diff)
+ logger.debug('reverse orig %s %s', self._source1, self._source2)
+ difference = Difference(unified_diff, None, None, source=[self._source2, self._source1], comment=self._comments)
+ difference.add_details([d.get_reverse() for d in self._details])
+ return difference
+
def get_source(path1, path2):
if os.path.basename(path1) == os.path.basename(path2):
return os.path.basename(path1)
return None
+
+
+def reverse_unified_diff(diff):
+ res = []
+ for line in diff.splitlines(True): # keepends=True
+ found = DiffParser.RANGE_RE.match(line)
+ if found:
+ before = found.group('start2')
+ if found.group('len2') is not None:
+ before += ',' + found.group('len2')
+ after = found.group('start1')
+ if found.group('len1') is not None:
+ after += ',' + found.group('len1')
+ res.append('@@ -%s +%s @@\n' % (before, after))
+ elif line.startswith('-'):
+ res.append('+')
+ res.append(line[1:])
+ elif line.startswith('+'):
+ res.append('-')
+ res.append(line[1:])
+ else:
+ res.append(line)
+ return ''.join(res)
diff --git a/tests/comparators/test_binary.py b/tests/comparators/test_binary.py
index 7ff1754..e8ef045 100644
--- a/tests/comparators/test_binary.py
+++ b/tests/comparators/test_binary.py
@@ -23,7 +23,7 @@ import subprocess
import pytest
from diffoscope.comparators import specialize
import diffoscope.comparators.binary
-from diffoscope.comparators.binary import File, FilesystemFile
+from diffoscope.comparators.binary import File, FilesystemFile, NonExistingFile
from diffoscope.difference import Difference
from diffoscope import RequiredToolNotFound, tool_required
@@ -71,6 +71,10 @@ def test_compare_with_xxd(binary1, binary2):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/binary_expected_diff')).read()
assert difference.unified_diff == expected_diff
+def test_compare_non_existing_with_xxd(binary1):
+ difference = binary1.compare_bytes(NonExistingFile(binary1))
+ assert difference.source2 == '/dev/null'
+
@pytest.fixture
def xxd_not_found(monkeypatch):
def mock_xxd(path):
diff --git a/tests/comparators/test_bzip2.py b/tests/comparators/test_bzip2.py
index fe38502..2e9d2fc 100644
--- a/tests/comparators/test_bzip2.py
+++ b/tests/comparators/test_bzip2.py
@@ -22,7 +22,7 @@ import os.path
import shutil
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.bzip2 import Bzip2File
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.bz2')
@@ -49,10 +49,12 @@ def test_no_differences(bzip1):
def differences(bzip1, bzip2):
return bzip1.compare(bzip2).details
+ at pytest.mark.xfail # need fuzzy matching
def test_content_source(differences):
assert differences[0].source1 == 'test1'
assert differences[0].source2 == 'test2'
+ at pytest.mark.xfail # need fuzzy matching
def test_content_source_without_extension(tmpdir):
path1 = str(tmpdir.join('test1'))
path2 = str(tmpdir.join('test2'))
@@ -67,3 +69,7 @@ def test_content_source_without_extension(tmpdir):
def test_content_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(bzip1):
+ difference = bzip1.compare(NonExistingFile(bzip1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_cpio.py b/tests/comparators/test_cpio.py
index 12682e9..6f75382 100644
--- a/tests/comparators/test_cpio.py
+++ b/tests/comparators/test_cpio.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.cpio import CpioFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.cpio')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/test2.cpio')
@@ -61,3 +62,8 @@ def test_compressed_files(differences):
assert differences[2].source2 == 'dir/text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[2].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, cpio1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = cpio1.compare(NonExistingFile(cpio1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_deb.py b/tests/comparators/test_deb.py
index 7000521..60b70da 100644
--- a/tests/comparators/test_deb.py
+++ b/tests/comparators/test_deb.py
@@ -22,8 +22,9 @@ import os.path
import pytest
import diffoscope.comparators
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.deb import DebFile, Md5sumsFile, DebDataTarFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.deb')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/test2.deb')
@@ -104,3 +105,8 @@ def test_skip_comparison_of_known_identical_files(deb1, deb2, monkeypatch):
monkeypatch.setattr(diffoscope.comparators, 'compare_files', probe)
deb1.compare(deb2)
assert './usr/share/doc/test/README.Debian' not in compared
+
+def test_compare_non_existing(monkeypatch, deb1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = deb1.compare(NonExistingFile(deb1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_debian.py b/tests/comparators/test_debian.py
index 215f7ed..bcd6de0 100644
--- a/tests/comparators/test_debian.py
+++ b/tests/comparators/test_debian.py
@@ -24,8 +24,9 @@ import os.path
import shutil
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.debian import DotChangesFile
+from diffoscope.config import Config
from diffoscope.presenters.text import output_text
TEST_DOT_CHANGES_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.changes')
@@ -71,3 +72,9 @@ def test_description(differences):
def test_internal_diff(differences):
assert differences[2].source1 == 'test_1_all.deb'
+
+def test_compare_non_existing(monkeypatch, dot_changes1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = dot_changes1.compare(NonExistingFile(dot_changes1))
+ output_text(difference, print_func=print)
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_elf.py b/tests/comparators/test_elf.py
index fd38289..6bfc022 100644
--- a/tests/comparators/test_elf.py
+++ b/tests/comparators/test_elf.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.elf import ElfFile, StaticLibFile
TEST_OBJ1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.o')
@@ -46,6 +46,10 @@ def test_obj_no_differences(obj1):
def obj_differences(obj1, obj2):
return obj1.compare(obj2).details
+def test_obj_compare_non_existing(obj1):
+ difference = obj1.compare(NonExistingFile(obj1))
+ assert difference.source2 == '/dev/null'
+
def test_diff(obj_differences):
assert len(obj_differences) == 1
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/elf_obj_expected_diff')).read()
@@ -81,3 +85,7 @@ def test_lib_differences(lib_differences):
assert 'objdump' in lib_differences[1].source1
expected_objdump_diff = open(os.path.join(os.path.dirname(__file__), '../data/elf_lib_objdump_expected_diff')).read()
assert lib_differences[1].unified_diff == expected_objdump_diff
+
+def test_lib_compare_non_existing(lib1):
+ difference = lib1.compare(NonExistingFile(lib1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_fonts.py b/tests/comparators/test_fonts.py
index 763670b..2bcd5fb 100644
--- a/tests/comparators/test_fonts.py
+++ b/tests/comparators/test_fonts.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.fonts import TtfFile
from conftest import tool_missing
@@ -51,3 +51,7 @@ def differences(ttf1, ttf2):
def test_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/ttf_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(ttf1):
+ difference = ttf1.compare(NonExistingFile(ttf1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_gettext.py b/tests/comparators/test_gettext.py
index f7e9f20..7e0f9b3 100644
--- a/tests/comparators/test_gettext.py
+++ b/tests/comparators/test_gettext.py
@@ -22,7 +22,7 @@ import codecs
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.gettext import MoFile
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.mo')
@@ -63,3 +63,7 @@ def test_charsets(mo_no_charset, mo_iso8859_1):
difference = mo_no_charset.compare(mo_iso8859_1)
expected_diff = codecs.open(os.path.join(os.path.dirname(__file__), '../data/mo_charsets_expected_diff'), encoding='utf-8').read()
assert difference.details[0].unified_diff == expected_diff
+
+def test_compare_non_existing(mo1):
+ difference = mo1.compare(NonExistingFile(mo1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_gzip.py b/tests/comparators/test_gzip.py
index fdde2ca..2078268 100644
--- a/tests/comparators/test_gzip.py
+++ b/tests/comparators/test_gzip.py
@@ -22,8 +22,9 @@ import os.path
import shutil
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.gzip import GzipFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.gz')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/test2.gz')
@@ -53,10 +54,12 @@ def test_metadata(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/gzip_metadata_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+ at pytest.mark.xfail # need fuzzy matching
def test_content_source(differences):
assert differences[1].source1 == 'test1'
assert differences[1].source2 == 'test2'
+ at pytest.mark.xfail # need fuzzy matching
def test_content_source_without_extension(tmpdir):
path1 = str(tmpdir.join('test1'))
path2 = str(tmpdir.join('test2'))
@@ -71,3 +74,8 @@ def test_content_source_without_extension(tmpdir):
def test_content_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[1].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, gzip1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = gzip1.compare(NonExistingFile(gzip1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_ipk.py b/tests/comparators/test_ipk.py
index ac14747..cf8fc95 100644
--- a/tests/comparators/test_ipk.py
+++ b/tests/comparators/test_ipk.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.ipk import IpkFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/base-files_157-r45695_ar71xx.ipk')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/base-files_157-r45918_ar71xx.ipk')
@@ -54,3 +55,8 @@ def test_metadata(differences):
def test_compressed_files(differences):
assert differences[1].details[1].source1 == './control.tar.gz'
assert differences[1].details[2].source1 == './data.tar.gz'
+
+def test_compare_non_existing(monkeypatch, ipk1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = ipk1.compare(NonExistingFile(ipk1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_iso9660.py b/tests/comparators/test_iso9660.py
index b0ed74a..5a8f586 100644
--- a/tests/comparators/test_iso9660.py
+++ b/tests/comparators/test_iso9660.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.iso9660 import Iso9660File
+from diffoscope.config import Config
from conftest import tool_missing
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.iso')
@@ -69,3 +70,8 @@ def test_compressed_files(differences):
assert differences[3].source2 == 'text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[3].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, iso1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = iso1.compare(NonExistingFile(iso1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_java.py b/tests/comparators/test_java.py
index 967a6ea..fcfb4bd 100644
--- a/tests/comparators/test_java.py
+++ b/tests/comparators/test_java.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.java import ClassFile
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/Test1.class')
@@ -49,3 +49,7 @@ def differences(class1, class2):
def test_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/class_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(class1):
+ difference = class1.compare(NonExistingFile(class1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_mono.py b/tests/comparators/test_mono.py
index da87f3d..b536805 100644
--- a/tests/comparators/test_mono.py
+++ b/tests/comparators/test_mono.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.mono import MonoExeFile
from conftest import tool_missing
@@ -56,3 +56,7 @@ def differences(exe1, exe2):
def test_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/pe_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(exe1):
+ difference = exe1.compare(NonExistingFile(exe1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_pdf.py b/tests/comparators/test_pdf.py
index 734201d..fe897de 100644
--- a/tests/comparators/test_pdf.py
+++ b/tests/comparators/test_pdf.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.pdf import PdfFile
from conftest import tool_missing
@@ -58,3 +58,7 @@ def test_text_diff(differences):
def test_internal_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/pdf_internal_expected_diff')).read()
assert differences[1].unified_diff == expected_diff
+
+def test_compare_non_existing(pdf1):
+ difference = pdf1.compare(NonExistingFile(pdf1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_png.py b/tests/comparators/test_png.py
index fcdb7f1..699d160 100644
--- a/tests/comparators/test_png.py
+++ b/tests/comparators/test_png.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.png import PngFile
from conftest import tool_missing
@@ -51,3 +51,7 @@ def differences(png1, png2):
def test_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/png_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(png1):
+ difference = png1.compare(NonExistingFile(png1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_rpm.py b/tests/comparators/test_rpm.py
index 80b8b26..332c8d3 100644
--- a/tests/comparators/test_rpm.py
+++ b/tests/comparators/test_rpm.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.rpm import RpmFile
+from diffoscope.config import Config
from conftest import tool_missing
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.rpm')
@@ -66,3 +67,8 @@ def test_content(differences):
assert differences[1].details[1].source1 == './dir/text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[1].details[1].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, rpm1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = rpm1.compare(NonExistingFile(rpm1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_sqlite.py b/tests/comparators/test_sqlite.py
index 6083fac..94f415e 100644
--- a/tests/comparators/test_sqlite.py
+++ b/tests/comparators/test_sqlite.py
@@ -21,7 +21,7 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.sqlite import Sqlite3Database
from conftest import tool_missing
@@ -51,3 +51,7 @@ def differences(sqlite3db1, sqlite3db2):
def test_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/sqlite3_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(sqlite3db1):
+ difference = sqlite3db1.compare(NonExistingFile(sqlite3db1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_squashfs.py b/tests/comparators/test_squashfs.py
index d5f43e9..2ba864c 100644
--- a/tests/comparators/test_squashfs.py
+++ b/tests/comparators/test_squashfs.py
@@ -22,8 +22,9 @@ import os.path
import pwd
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.squashfs import SquashfsFile
+from diffoscope.config import Config
from conftest import tool_missing, try_except
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.squashfs')
@@ -77,3 +78,8 @@ def test_compressed_files(differences):
assert differences[3].source2 == '/text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[3].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, squashfs1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = squashfs1.compare(NonExistingFile(squashfs1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_tar.py b/tests/comparators/test_tar.py
index ea765a7..9500f5d 100644
--- a/tests/comparators/test_tar.py
+++ b/tests/comparators/test_tar.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.tar import TarFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.tar')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/test2.tar')
@@ -62,3 +63,8 @@ def test_text_file(differences):
assert differences[2].source2 == 'dir/text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[2].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, tar1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = tar1.compare(NonExistingFile(tar1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_text.py b/tests/comparators/test_text.py
index 98a7528..b494ae6 100644
--- a/tests/comparators/test_text.py
+++ b/tests/comparators/test_text.py
@@ -22,7 +22,7 @@ import codecs
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
@pytest.fixture
def ascii1():
@@ -74,3 +74,7 @@ def test_difference_between_iso88591_and_unicode_only(iso8859, tmpdir):
difference = iso8859.compare(utf8)
assert difference.unified_diff is None
assert difference.details[0].source1 == 'encoding'
+
+def test_compare_non_existing(ascii1):
+ difference = ascii1.compare(NonExistingFile(ascii1))
+ assert difference.source2 == '/dev/null'
diff --git a/tests/comparators/test_utils.py b/tests/comparators/test_utils.py
index 68b51f0..da70510 100644
--- a/tests/comparators/test_utils.py
+++ b/tests/comparators/test_utils.py
@@ -23,6 +23,7 @@ import os.path
import pytest
from diffoscope.comparators import specialize
from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.config import Config
@pytest.fixture
def fuzzy_tar1():
@@ -48,3 +49,25 @@ def test_fuzzy_matching_only_once(fuzzy_tar1, fuzzy_tar3):
differences = fuzzy_tar1.compare(fuzzy_tar3).details
assert len(differences) == 2
expected_diff = codecs.open(os.path.join(os.path.dirname(__file__), '../data/text_iso8859_expected_diff'), encoding='utf-8').read()
+
+ at pytest.fixture
+def fuzzy_tar_in_tar1():
+ return specialize(FilesystemFile(os.path.join(os.path.dirname(__file__), '../data/fuzzy-tar-in-tar1.tar')))
+
+ at pytest.fixture
+def fuzzy_tar_in_tar2():
+ return specialize(FilesystemFile(os.path.join(os.path.dirname(__file__), '../data/fuzzy-tar-in-tar2.tar')))
+
+def test_no_fuzzy_matching(monkeypatch, fuzzy_tar_in_tar1, fuzzy_tar_in_tar2):
+ monkeypatch.setattr(Config, 'fuzzy_threshold', 0)
+ difference = fuzzy_tar_in_tar1.compare(fuzzy_tar_in_tar2)
+ assert len(difference.details) == 1
+ assert difference.details[0].source1 == 'metadata'
+
+def test_no_fuzzy_matching_new_file(monkeypatch, fuzzy_tar_in_tar1, fuzzy_tar_in_tar2):
+ monkeypatch.setattr(Config, 'fuzzy_threshold', 0)
+ monkeypatch.setattr(Config, 'new_file', True)
+ difference = fuzzy_tar_in_tar1.compare(fuzzy_tar_in_tar2)
+ assert len(difference.details) == 3
+ assert difference.details[1].source2 == '/dev/null'
+ assert difference.details[2].source1 == '/dev/null'
diff --git a/tests/comparators/test_xz.py b/tests/comparators/test_xz.py
index fde39f6..3519e73 100644
--- a/tests/comparators/test_xz.py
+++ b/tests/comparators/test_xz.py
@@ -22,8 +22,9 @@ import os.path
import shutil
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.xz import XzFile
+from diffoscope.config import Config
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.xz')
TEST_FILE2_PATH = os.path.join(os.path.dirname(__file__), '../data/test2.xz')
@@ -47,10 +48,12 @@ def test_no_differences(xz1):
def differences(xz1, xz2):
return xz1.compare(xz2).details
+ at pytest.mark.xfail # require fuzzy matching across containers
def test_content_source(differences):
assert differences[0].source1 == 'test1'
assert differences[0].source2 == 'test2'
+ at pytest.mark.xfail # require fuzzy matching across containers
def test_content_source_without_extension(tmpdir):
path1 = str(tmpdir.join('test1'))
path2 = str(tmpdir.join('test2'))
@@ -65,3 +68,8 @@ def test_content_source_without_extension(tmpdir):
def test_content_diff(differences):
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[0].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, xz1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = xz1.compare(NonExistingFile(xz1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/comparators/test_zip.py b/tests/comparators/test_zip.py
index 356e6bd..eff5925 100644
--- a/tests/comparators/test_zip.py
+++ b/tests/comparators/test_zip.py
@@ -21,8 +21,9 @@
import os.path
import pytest
from diffoscope.comparators import specialize
-from diffoscope.comparators.binary import FilesystemFile
+from diffoscope.comparators.binary import FilesystemFile, NonExistingFile
from diffoscope.comparators.zip import ZipFile
+from diffoscope.config import Config
from conftest import tool_missing
TEST_FILE1_PATH = os.path.join(os.path.dirname(__file__), '../data/test1.zip')
@@ -58,3 +59,8 @@ def test_compressed_files(differences):
assert differences[1].source2 == 'dir/text'
expected_diff = open(os.path.join(os.path.dirname(__file__), '../data/text_ascii_expected_diff')).read()
assert differences[1].unified_diff == expected_diff
+
+def test_compare_non_existing(monkeypatch, zip1):
+ monkeypatch.setattr(Config.general, 'new_file', True)
+ difference = zip1.compare(NonExistingFile(zip1))
+ assert difference.details[-1].source2 == '/dev/null'
diff --git a/tests/data/fuzzy-tar-in-tar1.tar b/tests/data/fuzzy-tar-in-tar1.tar
new file mode 100644
index 0000000..ca9fc33
Binary files /dev/null and b/tests/data/fuzzy-tar-in-tar1.tar differ
diff --git a/tests/data/fuzzy-tar-in-tar2.tar b/tests/data/fuzzy-tar-in-tar2.tar
new file mode 100644
index 0000000..f243632
Binary files /dev/null and b/tests/data/fuzzy-tar-in-tar2.tar differ
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/diffoscope.git
More information about the Reproducible-commits
mailing list