mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-12 18:20:11 +01:00
6c2cf2ccdd
This syncs up the field names between the fdroiddata .yml files, the keys used in the implementation in fdroidserver, the index data format, and the final data structures in fdroidclient. This makes it easier for devs to follow, and makes the Jackson parsing library automatically handle converting the data from the index file to Java instances. This bumps the metadata version since the apkcache will have to be discarded. Here are the name changes: * apkname --> apkName * id --> packageName * sha256 --> hash * version --> versionName * versioncode --> versionCode tests/repo/index.xml was changed only to bump the metadata version from 17 to 18.
120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# install.py - part of the FDroid server tools
|
|
# Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com
|
|
# Copyright (C) 2013-2014 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
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import sys
|
|
import os
|
|
import glob
|
|
from argparse import ArgumentParser
|
|
import logging
|
|
|
|
from . import common
|
|
from .common import SdkToolsPopen, FDroidException
|
|
|
|
options = None
|
|
config = None
|
|
|
|
|
|
def devices():
|
|
p = SdkToolsPopen(['adb', "devices"])
|
|
if p.returncode != 0:
|
|
raise FDroidException("An error occured when finding devices: %s" % p.output)
|
|
lines = [l for l in p.output.splitlines() if not l.startswith('* ')]
|
|
if len(lines) < 3:
|
|
return []
|
|
lines = lines[1:-1]
|
|
return [l.split()[0] for l in lines]
|
|
|
|
|
|
def main():
|
|
|
|
global options, config
|
|
|
|
# Parse command line...
|
|
parser = ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]")
|
|
common.setup_global_opts(parser)
|
|
parser.add_argument("appid", nargs='*', help="app-id with optional versionCode in the form APPID[:VERCODE]")
|
|
parser.add_argument("-a", "--all", action="store_true", default=False,
|
|
help="Install all signed applications available")
|
|
options = parser.parse_args()
|
|
|
|
if not options.appid and not options.all:
|
|
parser.error("option %s: If you really want to install all the signed apps, use --all" % "all")
|
|
|
|
config = common.read_config(options)
|
|
|
|
output_dir = 'repo'
|
|
if not os.path.isdir(output_dir):
|
|
logging.info("No signed output directory - nothing to do")
|
|
sys.exit(0)
|
|
|
|
if options.appid:
|
|
|
|
vercodes = common.read_pkg_args(options.appid, 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'))):
|
|
|
|
try:
|
|
appid, vercode = common.publishednameinfo(apkfile)
|
|
except FDroidException:
|
|
continue
|
|
if appid not in apks:
|
|
continue
|
|
if vercodes[appid] and vercode not in vercodes[appid]:
|
|
continue
|
|
apks[appid] = apkfile
|
|
|
|
for appid, apk in apks.items():
|
|
if not apk:
|
|
raise FDroidException("No signed apk available for %s" % appid)
|
|
|
|
else:
|
|
|
|
apks = {common.publishednameinfo(apkfile)[0]: apkfile for apkfile in
|
|
sorted(glob.glob(os.path.join(output_dir, '*.apk')))}
|
|
|
|
for appid, apk in apks.items():
|
|
# Get device list each time to avoid device not found errors
|
|
devs = devices()
|
|
if not devs:
|
|
raise FDroidException("No attached devices found")
|
|
logging.info("Installing %s..." % apk)
|
|
for dev in devs:
|
|
logging.info("Installing %s on %s..." % (apk, dev))
|
|
p = SdkToolsPopen(['adb', "-s", dev, "install", apk])
|
|
fail = ""
|
|
for line in p.output.splitlines():
|
|
if line.startswith("Failure"):
|
|
fail = line[9:-1]
|
|
if not fail:
|
|
continue
|
|
|
|
if fail == "INSTALL_FAILED_ALREADY_EXISTS":
|
|
logging.warn("%s is already installed on %s." % (apk, dev))
|
|
else:
|
|
raise FDroidException("Failed to install %s on %s: %s" % (
|
|
apk, dev, fail))
|
|
|
|
logging.info("\nFinished")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|