From 84bf3d758f9a920bb816aaca52510c26f44bdb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Thu, 19 Dec 2013 17:51:16 +0100 Subject: [PATCH] Better parsing of args, install now works as it should --- completion/bash-completion | 3 +++ fdroidserver/common.py | 31 ++++++++++++++++++----- fdroidserver/import.py | 1 + fdroidserver/install.py | 51 +++++++++++++++++++++++++------------- 4 files changed, 63 insertions(+), 23 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 7c72e69f..f5d914c2 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -40,6 +40,9 @@ __package() { __signed_package() { files=( repo/*.apk ) + if [ "${files[0]}" == "repo/*.apk" ]; then + return + fi files=( ${files[@]#repo/} ) files=${files[@]%_*} COMPREPLY=( $( compgen -W "$files" -- $cur ) ) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b627e745..9325c987 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -110,9 +110,9 @@ def read_config(opts, config_file='config.py'): return config -def read_app_args(args, options, allapps, allow_vercodes=False): +def read_pkg_args(args, options, allow_vercodes=False): if not args: - return [] + return {} vercodes = {} for p in args: @@ -125,11 +125,18 @@ def read_app_args(args, options, allapps, allow_vercodes=False): continue elif vercode and vercode not in vercodes[package]: vercodes[package] += [vercode] if vercode else [] - packages = vercodes.keys() - apps = [app for app in allapps if app['id'] in packages] - if len(apps) != len(packages): + + return vercodes + +def read_app_args(args, options, allapps, allow_vercodes=False): + vercodes = read_pkg_args(args, options, allow_vercodes) + + apps = [app for app in allapps if app['id'] in vercodes] + if not apps: + raise Exception("No packages specified") + if len(apps) != len(vercodes): allids = [app["id"] for app in allapps] - for p in packages: + for p in vercodes: if p not in allids: print "No such package: %s" % p raise Exception("Found invalid app ids in arguments") @@ -154,6 +161,18 @@ def read_app_args(args, options, allapps, allow_vercodes=False): return apps +apk_regex = None + +def apknameinfo(basename): + global apk_regex + if apk_regex is None: + apk_regex = re.compile(r"^([a-zA-Z\.]+)_([0-9]+)\.apk$") + m = apk_regex.match(basename) + try: + result = (m.group(1), m.group(2)) + except AttributeError: + raise Exception("Invalid apk name: %s" % basename) + return result def getapkname(app, build): return "%s_%s.apk" % (app['id'], build['vercode']) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index 997610f6..0703eb85 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -3,6 +3,7 @@ # # import.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com +# Copyright (C) 2013 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 65f6c046..79ee30c7 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -3,6 +3,7 @@ # # verify.py - part of the FDroid server tools # Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com +# Copyright (C) 2013 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -19,6 +20,7 @@ import sys import os +import glob from optparse import OptionParser import common @@ -44,6 +46,8 @@ def main(): parser = OptionParser() parser.add_option("-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal") + parser.add_option("-a", "--all", action="store_true", default=False, + help="Install all signed applications available") (options, args) = parser.parse_args() config = common.read_config(options) @@ -53,26 +57,39 @@ def main(): print "No signed output directory - nothing to do" sys.exit(1) - # Get all apps... - allapps = metadata.read_metadata() + if args: - apps = common.read_app_args(args, options, allapps, True) + vercodes = common.read_pkg_args(args, options, True) + apks = { appid : None for appid in vercodes } - for app in apps: - last = None - for build in app['builds']: - apk = os.path.join(output_dir, common.getapkname(app, build)) - if os.path.exists(apk): - last = build - if last is None: - raise Exception("No available signed apks for %s" % app['id']) + # Get the signed apk with the highest vercode + for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))): - for app in apps: - build = app['builds'][0] - apk = os.path.join(output_dir, common.getapkname(app, build)) - if not os.path.exists(apk): - raise Exception("No such signed apk: %s" % apk) - continue + apkfilename = os.path.basename(apkfile) + appid, vercode = common.apknameinfo(apkfilename) + if appid not in apks: + continue + if vercodes[appid] and vc not in vercodes[appid]: + continue + apks[appid] = apkfile + + for appid, apk in apks.iteritems(): + if not apk: + raise Exception("No signed apk available for %s" % appid) + + elif options.all: + + for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))): + + apkfilename = os.path.basename(apkfile) + appid, vercode = common.apknameinfo(apkfilename) + apks[appid] = apkfile + + else: + print "If you really want to install all the signed apps, use --all" + sys.exit(0) + + for appid, apk in apks.iteritems(): # Get device list each time to avoid device not found errors devs = devices() if not devs: