Commit f6f2f29f authored by Chris Lamb's avatar Chris Lamb 💬

Compare GIF images using gifbuild. (Closes: #857610)

Signed-off-by: Chris Lamb's avatarChris Lamb <lamby@debian.org>
parent c1bf3cc7
......@@ -23,6 +23,7 @@ Build-Depends:
fp-utils <!nocheck>,
ghc <!nocheck>,
ghostscript <!nocheck>,
giflib-tools <!nocheck>,
imagemagick <!nocheck>,
libjs-jquery <!nocheck>,
libjs-jquery-hotkeys <!nocheck>,
......
......@@ -77,6 +77,7 @@ class ComparatorManager(object):
('cbfs.CbfsFile',),
('git.GitIndexFile',),
('openssh.PublicKeyFile',),
('gif.GifFile',),
)
_singleton = {}
......
# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2017 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 re
from diffoscope.tools import tool_required
from diffoscope.difference import Difference
from .utils.file import File
from .utils.command import Command
class Gifbuild(Command):
RE_FILTERS = (
re.compile(r'^# GIF information from'),
re.compile(r'^# End of .* dump'),
)
@tool_required('gifbuild')
def cmdline(self):
return ['gifbuild', '-d', self.path]
def filter(self, line):
if any(x.match(line.decode('utf-8')) for x in self.RE_FILTERS):
return b""
return line
class GifFile(File):
RE_FILE_TYPE = re.compile(r'^GIF image data\b')
def compare_details(self, other, source=None):
return [Difference.from_command(
Gifbuild,
self.path,
other.path,
source='gifbuild')m
]
......@@ -60,6 +60,9 @@ EXTERNAL_TOOLS = {
'debian': 'acl',
'arch': 'acl',
},
'gifbuild': {
'debian': 'giflib-tools',
},
'ghc': {
'debian': 'ghc',
'arch': 'ghc',
......
# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2017 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 pytest
from diffoscope.comparators.gif import GifFile
from utils.data import load_fixture, get_data
from utils.tools import skip_unless_tools_exist
from utils.nonexisting import assert_non_existing
gif1 = load_fixture('test1.gif')
gif2 = load_fixture('test2.gif')
def test_identification(gif1):
assert isinstance(gif1, GifFile)
def test_no_differences(gif1):
difference = gif1.compare(gif1)
assert difference is None
@pytest.fixture
def differences(gif1, gif2):
return gif1.compare(gif2).details
@skip_unless_tools_exist('gifbuild')
def test_diff(differences):
expected_diff = get_data('gif_expected_diff')
assert differences[0].unified_diff == expected_diff
@skip_unless_tools_exist('gifbuild')
def test_compare_non_existing(monkeypatch, gif1):
assert_non_existing(monkeypatch, gif1, has_null_source=False)
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment