This file is indexed.

/usr/lib/python3/dist-packages/diffoscope/comparators/iso9660.py is in diffoscope 93ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 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
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2015 Jérémy Bobbio <lunar@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 re
import subprocess

from diffoscope.tools import tool_required
from diffoscope.difference import Difference

from .utils.file import File
from .utils.command import Command
from .utils.libarchive import LibarchiveContainer


@tool_required('isoinfo')
def get_iso9660_names(path):
    return subprocess.check_output((
        'isoinfo',
        '-R',  # Always use RockRidge for names
        '-f',
        '-i',
        path,
    ), shell=False).strip().split('\n')


class ISO9660PVD(Command):
    @tool_required('isoinfo')
    def cmdline(self):
        return ['isoinfo', '-d', '-i', self.path]


class ISO9660Listing(Command):
    def __init__(self, path, extension=None, *args, **kwargs):
        self._extension = extension
        super().__init__(path, *args, **kwargs)

    @tool_required('isoinfo')
    def cmdline(self):
        cmd = ['isoinfo', '-l', '-i', self.path]

        if self._extension == 'joliet':
            cmd.extend(['-J', '-j', 'iso8859-15'])
        elif self._extension == 'rockridge':
            cmd.extend(['-R'])

        return cmd

    def filter(self, line):
        if self._extension == 'joliet':
            return line.decode('iso-8859-15').encode('utf-8')
        return line


class Iso9660File(File):
    DESCRIPTION = "ISO 9660 CD images"
    CONTAINER_CLASS = LibarchiveContainer
    FILE_TYPE_RE = re.compile(r'\bISO 9660\b')

    @classmethod
    def recognizes(cls, file):
        if file.magic_file_type and \
                cls.FILE_TYPE_RE.search(file.magic_file_type):
            return True

        # Sometimes CDs put things like MBRs at the front which is an expected
        # part of the ISO9660 standard, but file(1)/libmagic doesn't detect
        # this. <https://en.wikipedia.org/wiki/ISO_9660#Specifications>.
        with open(file.path, 'rb') as f:
            f.seek(32769)
            return f.read(5) == b'CD001'

        return False

    def compare_details(self, other, source=None):
        differences = []

        for klass in (ISO9660PVD, ISO9660Listing):
            differences.append(Difference.from_command(
                klass, self.path, other.path,
            ))

        for x in ('joliet', 'rockridge'):
            try:
                differences.append(Difference.from_command(
                    ISO9660Listing, self.path, other.path, command_args=(x,),
                ))
            except subprocess.CalledProcessError:
                # Probably no joliet or rockridge data
                pass

        return differences