missing_file.py 3.11 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2016 Chris Lamb <lamby@debian.org>
#
# 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 os
21
import logging
22 23 24 25 26

from diffoscope.config import Config
from diffoscope.difference import Difference

from .binary import FilesystemFile
27
from .utils.file import File
28

29 30
logger = logging.getLogger(__name__)

31 32

class MissingFile(File):
33 34 35
    """
    Represents a missing file when comparing containers.
    """
36

37 38
    @classmethod
    def recognizes(cls, file):
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
        if isinstance(file, FilesystemFile) and not os.path.lexists(file.name):
            assert Config().new_file, '%s does not exist' % file.name
            return True
        return False

    def __init__(self, path, other_file=None):
        self._name = path
        self._other_file = other_file

    @property
    def path(self):
        return '/dev/null'

    @property
    def other_file(self):
        return self._other_file

    @other_file.setter
    def other_file(self, value):
        self._other_file = value

    def has_same_content_as(self, other):
        return False

    def is_directory(self):
        return False

    def is_symlink(self):
        return False

    def is_device(self):
        return False

    def compare(self, other, source=None):
73 74 75 76
        # So now that comparators are all object-oriented, we don't have any
        # clue on how to perform a meaningful comparison right here. So we are
        # good do the comparison backward (where knowledge of the file format
        # lies) and and then reverse it.
77
        if isinstance(other, MissingFile):
78 79 80 81 82 83 84 85
            return Difference(
                None,
                self.name,
                other.name,
                comment="Trying to compare two non-existing files."
            )

        logger.debug("Performing backward comparison")
86
        backward_diff = other.compare(self, source)
87

88 89
        if not backward_diff:
            return None
90

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
        return backward_diff.get_reverse()

    # 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 and .dsc comparisons
    @property
    def deb822(self):
        class DummyChanges(dict):
Mattia Rizzolo's avatar
Mattia Rizzolo committed
111
            def get_as_string(self, _): return ''
112
        return DummyChanges(Files=[], Version='')