chiark / gitweb /
Better parsing of args, install now works as it should
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 19 Dec 2013 16:51:16 +0000 (17:51 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Thu, 19 Dec 2013 16:51:16 +0000 (17:51 +0100)
completion/bash-completion
fdroidserver/common.py
fdroidserver/import.py
fdroidserver/install.py

index 7c72e69f14945a567a3e91f3c8339f2179ea1238..f5d914c229416a256a0dd45b206938ab85ef7648 100644 (file)
@@ -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 ) )
index b627e745059b29457c4216531a944f69e2ed6c54..9325c987ae5931bc6651f56c03c1490626110381 100644 (file)
@@ -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'])
index 997610f6fad7106fed73beb59a5652f8982191e0..0703eb857fc20f3f9dc255acb91def8c4d9ecc60 100644 (file)
@@ -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í <mvdan@mvdan.cc>
 #
 # 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
index 65f6c0464b478a5c723c369efb56a1284b968711..79ee30c7a6855de068a44b3d9e21afe2d0a59420 100644 (file)
@@ -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í <mvdan@mvdan.cc>
 #
 # 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()
-
-    apps = common.read_app_args(args, options, allapps, True)
-
-    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'])
-
-    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
+    if args:
+
+        vercodes = common.read_pkg_args(args, options, True)
+        apks = { appid : None for appid in vercodes }
+
+        # Get the signed apk with the highest vercode
+        for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))):
+
+            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: