1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-04 14:30:11 +01:00

Merge branch 'master' into 'master'

streamline verify process in `fdroid publish`

This is a collection of small fixes to streamline the process of verifying a build against a provided APK as set in the `Binaries:` metadata.

See merge request !35
This commit is contained in:
Ciaran Gultnieks 2015-01-12 10:06:26 +00:00
commit dffaaccbc4
2 changed files with 50 additions and 9 deletions

View File

@ -1879,27 +1879,68 @@ def compare_apks(apk1, apk2, tmp_dir):
trying to do the comparison. trying to do the comparison.
""" """
thisdir = os.path.join(tmp_dir, 'this_apk') badchars = re.compile('''[/ :;'"]''')
thatdir = os.path.join(tmp_dir, 'that_apk') apk1dir = os.path.join(tmp_dir, badchars.sub('_', apk1[0:-4])) # trim .apk
for d in [thisdir, thatdir]: apk2dir = os.path.join(tmp_dir, badchars.sub('_', apk2[0:-4])) # trim .apk
for d in [apk1dir, apk2dir]:
if os.path.exists(d): if os.path.exists(d):
shutil.rmtree(d) shutil.rmtree(d)
os.mkdir(d) os.mkdir(d)
os.mkdir(os.path.join(d, 'jar-xf'))
if subprocess.call(['jar', 'xf', if subprocess.call(['jar', 'xf',
os.path.abspath(apk1)], os.path.abspath(apk1)],
cwd=thisdir) != 0: cwd=os.path.join(apk1dir, 'jar-xf')) != 0:
return("Failed to unpack " + apk1) return("Failed to unpack " + apk1)
if subprocess.call(['jar', 'xf', if subprocess.call(['jar', 'xf',
os.path.abspath(apk2)], os.path.abspath(apk2)],
cwd=thatdir) != 0: cwd=os.path.join(apk2dir, 'jar-xf')) != 0:
return("Failed to unpack " + apk2) return("Failed to unpack " + apk2)
p = FDroidPopen(['diff', '-r', 'this_apk', 'that_apk'], cwd=tmp_dir, # try to find apktool in the path, if it hasn't been manually configed
output=False) if not 'apktool' in config:
tmp = find_command('apktool')
if not tmp is None:
config['apktool'] = tmp
if 'apktool' in config:
if subprocess.call([config['apktool'], 'd', os.path.abspath(apk1), '--output', 'apktool'],
cwd=apk1dir) != 0:
return("Failed to unpack " + apk1)
if subprocess.call([config['apktool'], 'd', os.path.abspath(apk2), '--output', 'apktool'],
cwd=apk2dir) != 0:
return("Failed to unpack " + apk2)
p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False)
lines = p.output.splitlines() lines = p.output.splitlines()
if len(lines) != 1 or 'META-INF' not in lines[0]: if len(lines) != 1 or 'META-INF' not in lines[0]:
meld = find_command('meld')
if not meld is None:
p = FDroidPopen(['meld', apk1dir, apk2dir], output=False)
return("Unexpected diff output - " + p.output) return("Unexpected diff output - " + p.output)
# since everything verifies, delete the comparison to keep cruft down
shutil.rmtree(apk1dir)
shutil.rmtree(apk2dir)
# If we get here, it seems like they're the same! # If we get here, it seems like they're the same!
return None return None
def find_command(command):
'''find the full path of a command, or None if it can't be found in the PATH'''
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(command)
if fpath:
if is_exe(command):
return command
else:
for path in os.environ["PATH"].split(os.pathsep):
path = path.strip('"')
exe_file = os.path.join(path, command)
if is_exe(exe_file):
return exe_file
return None

View File

@ -144,7 +144,7 @@ def main():
# Grab the binary from where the developer publishes it... # Grab the binary from where the developer publishes it...
logging.info("...retrieving " + url) logging.info("...retrieving " + url)
srcapk = os.path.join(tmp_dir, url.split('/')[-1]) srcapk = os.path.join(tmp_dir, url.split('/')[-1])
p = FDroidPopen(['wget', '-nv', url], cwd=tmp_dir) p = FDroidPopen(['wget', '-nv', '--continue', url], cwd=tmp_dir)
if p.returncode != 0 or not os.path.exists(srcapk): if p.returncode != 0 or not os.path.exists(srcapk):
logging.error("...failed to retrieve " + url + logging.error("...failed to retrieve " + url +
" - publish skipped") " - publish skipped")
@ -153,7 +153,7 @@ def main():
# Compare our unsigned one with the downloaded one... # Compare our unsigned one with the downloaded one...
compare_result = common.compare_apks(srcapk, apkfile, tmp_dir) compare_result = common.compare_apks(srcapk, apkfile, tmp_dir)
if compare_result: if compare_result:
logging.error("...verfication failed - publish skipped : " logging.error("...verification failed - publish skipped : "
+ compare_result) + compare_result)
continue continue