chiark / gitweb /
`fdroid publish` now includes OTA ZIPs and related source
authorHans-Christoph Steiner <hans@eds.org>
Wed, 7 Dec 2016 10:48:05 +0000 (11:48 +0100)
committerHans-Christoph Steiner <hans@eds.org>
Mon, 9 Jan 2017 10:32:52 +0000 (11:32 +0100)
This adds support for publishing ZIP files which were built with
`fdroid build`.  This is for "Over-The-Air" (OTA) update ZIP files for
flashing to ROMs.  The first example of this is the Privileged Extension,
which must be installed by flashing an OTA ZIP on Android > 5.0.

!181
https://gitlab.com/fdroid/privileged-extension/issues/9
https://gitlab.com/fdroid/privileged-extension/issues/10
https://gitlab.com/fdroid/fdroiddata/merge_requests/1804

Also, "if app.Binaries:" is the same as "if app.Binaries is not None:", but
is the standard Python style.

fdroidserver/common.py
fdroidserver/install.py
fdroidserver/publish.py
fdroidserver/verify.py

index b5e06280e27714eb79881d334058c6dc5d92607d..2c8e363003974fe832b03af10f8d9d1caf95694d 100644 (file)
@@ -460,7 +460,7 @@ def has_extension(filename, ext):
     return ext == f_ext
 
 
-apk_regex = re.compile(r"^(.+)_([0-9]+)\.apk$")
+publish_name_regex = re.compile(r"^(.+)_([0-9]+)\.(apk|zip)$")
 
 
 def clean_description(description):
@@ -476,13 +476,13 @@ def clean_description(description):
     return returnstring.rstrip('\n')
 
 
-def apknameinfo(filename):
+def publishednameinfo(filename):
     filename = os.path.basename(filename)
-    m = apk_regex.match(filename)
+    m = publish_name_regex.match(filename)
     try:
         result = (m.group(1), m.group(2))
     except AttributeError:
-        raise FDroidException("Invalid apk name: %s" % filename)
+        raise FDroidException("Invalid name for published file: %s" % filename)
     return result
 
 
index 022b6262eb691a69c471f463b4e26224efd4a85c..5849acadf21ff2856fdbc5ebb32065924ad8f34a 100644 (file)
@@ -72,7 +72,7 @@ def main():
         for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))):
 
             try:
-                appid, vercode = common.apknameinfo(apkfile)
+                appid, vercode = common.publishednameinfo(apkfile)
             except FDroidException:
                 continue
             if appid not in apks:
@@ -87,7 +87,7 @@ def main():
 
     else:
 
-        apks = {common.apknameinfo(apkfile)[0]: apkfile for apkfile in
+        apks = {common.publishednameinfo(apkfile)[0]: apkfile for apkfile in
                 sorted(glob.glob(os.path.join(output_dir, '*.apk')))}
 
     for appid, apk in apks.items():
index 62674480663203db7200213e7866efc4db3d67e6..14942c8aee7ac3375188e30b2a9af1857e14f325 100644 (file)
@@ -102,10 +102,11 @@ def main():
     logging.info("{0} apps, {0} key aliases".format(len(allapps),
                                                     len(allaliases)))
 
-    # Process any apks that are waiting to be signed...
-    for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk'))):
+    # Process any APKs or ZIPs that are waiting to be signed...
+    for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk'))
+                          + glob.glob(os.path.join(unsigned_dir, '*.zip'))):
 
-        appid, vercode = common.apknameinfo(apkfile)
+        appid, vercode = common.publishednameinfo(apkfile)
         apkfilename = os.path.basename(apkfile)
         if vercodes and appid not in vercodes:
             continue
@@ -122,7 +123,7 @@ def main():
             sys.exit(1)
         app = allapps[appid]
 
-        if app.Binaries is not None:
+        if app.Binaries:
 
             # It's an app where we build from source, and verify the apk
             # contents against a developer's binary, and then publish their
@@ -143,6 +144,12 @@ def main():
             shutil.move(srcapk, os.path.join(output_dir, apkfilename))
             os.remove(apkfile)
 
+        elif apkfile.endswith('.zip'):
+
+            # OTA ZIPs built by fdroid do not need to be signed by jarsigner,
+            # just to be moved into place in the repo
+            shutil.move(apkfile, os.path.join(output_dir, apkfilename))
+
         else:
 
             # It's a 'normal' app, i.e. we sign and publish it...
index 4c3819847edfc8dcc8cda5bd0daf975777993a6a..c277cf71fa56239d546eedf7630861fa0d3400a2 100644 (file)
@@ -60,7 +60,7 @@ def main():
     for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk'))):
 
         apkfilename = os.path.basename(apkfile)
-        appid, vercode = common.apknameinfo(apkfile)
+        appid, vercode = common.publishednameinfo(apkfile)
 
         if vercodes and appid not in vercodes:
             continue