[diffoscope] 01/02: comparators/apk: less kludgy way of detecting APKs

Ximin Luo infinity0 at debian.org
Tue Jul 25 15:03:56 UTC 2017


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository diffoscope.

commit 00a4c141fc94d9886d6aaca54c5f01394895627c
Author: Ximin Luo <infinity0 at debian.org>
Date:   Tue Jul 25 16:41:42 2017 +0200

    comparators/apk: less kludgy way of detecting APKs
---
 diffoscope/comparators/apk.py        | 10 +++++++++-
 diffoscope/comparators/utils/file.py |  7 +++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/diffoscope/comparators/apk.py b/diffoscope/comparators/apk.py
index dc8a136..9ac2887 100644
--- a/diffoscope/comparators/apk.py
+++ b/diffoscope/comparators/apk.py
@@ -146,10 +146,18 @@ class ApkContainer(Archive):
         return differences
 
 class ApkFile(File):
-    RE_FILE_TYPE = re.compile(r'^((Java|Zip) archive data|DOS/MBR boot sector).*\b')
+    RE_FILE_TYPE_FALLBACK_HEADER = b"PK\x03\x04"
+    RE_FILE_TYPE = re.compile(r'^(Java|Zip) archive data.*\b')
     RE_FILE_EXTENSION = re.compile(r'\.apk$')
     CONTAINER_CLASS = ApkContainer
 
+    @staticmethod
+    def recognizes(file):
+        if not ApkFile.RE_FILE_EXTENSION.search(file.name):
+            return False
+        return (ApkFile.RE_FILE_TYPE.search(file.magic_file_type) or
+                file.file_header[:4] == ApkFile.RE_FILE_TYPE_FALLBACK_HEADER)
+
     def compare_details(self, other, source=None):
         zipinfo_difference = Difference.from_command(Zipinfo, self.path, other.path) or \
                              Difference.from_command(ZipinfoVerbose, self.path, other.path)
diff --git a/diffoscope/comparators/utils/file.py b/diffoscope/comparators/utils/file.py
index f38cead..4fa996c 100644
--- a/diffoscope/comparators/utils/file.py
+++ b/diffoscope/comparators/utils/file.py
@@ -150,6 +150,13 @@ class File(object, metaclass=abc.ABCMeta):
         return self._magic_file_type
 
     @property
+    def file_header(self):
+        if not hasattr(self, '_file_header'):
+            with open(self.path, 'rb') as f:
+                self._file_header = f.read(16)
+        return self._file_header
+
+    @property
     def file_type(self):
         for x, y in (
             (self.is_device, "device"),

-- 
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