From 099c98bc6019c6a4f42a6db37a7c278def993a21 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Jan 2018 10:02:13 +0100 Subject: [PATCH 1/3] metadata: fix crash when there are duplicate metadata files The string had the variable 'appid' while the format() call had only the variable 'path'. This also standardizes on 'appid' like the rest of the code. --- fdroidserver/metadata.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b014c0dc..41319a88 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -721,7 +721,7 @@ def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False): exception. So the original .txt format is parsed first, at least until newer formats stabilize. - check_vcs is the list of packageNames to check for .fdroid.yml in source + check_vcs is the list of appids to check for .fdroid.yml in source """ @@ -754,11 +754,11 @@ def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False): for metadatapath in metadatafiles: if metadatapath == '.fdroid.txt': warn_or_exception(_('.fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json.')) - packageName, _ignored = fdroidserver.common.get_extension(os.path.basename(metadatapath)) - if packageName in apps: + appid, _ignored = fdroidserver.common.get_extension(os.path.basename(metadatapath)) + if appid in apps: warn_or_exception(_("Found multiple metadata files for {appid}") - .format(path=packageName)) - app = parse_metadata(metadatapath, packageName in check_vcs, refresh) + .format(appid=appid)) + app = parse_metadata(metadatapath, appid in check_vcs, refresh) check_metadata(app) apps[app.id] = app @@ -818,7 +818,7 @@ def get_default_app_info(metadatapath=None): manifestroot = fdroidserver.common.parse_xml(os.path.join(root, 'AndroidManifest.xml')) break if manifestroot is None: - warn_or_exception(_("Cannot find a packageName for {path}!") + warn_or_exception(_("Cannot find an appid for {path}!") .format(path=metadatapath)) appid = manifestroot.attrib['package'] @@ -906,8 +906,9 @@ def post_metadata_parse(app): # Parse metadata for a single application. # -# 'metadatapath' - the filename to read. The package id for the application comes -# from this filename. Pass None to get a blank entry. +# 'metadatapath' - the filename to read. The "Application ID" aka +# "Package Name" for the application comes from this +# filename. Pass None to get a blank entry. # # Returns a dictionary containing all the details of the application. There are # two major kinds of information in the dictionary. Keys beginning with capital From 4463bf238d343d019389bad6791539267f433eec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Jan 2018 10:17:19 +0100 Subject: [PATCH 2/3] vmtools: use standard imports: os.path.join() The rest of the code uses os.path.join() --- fdroidserver/vmtools.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index e8281192..f6aa0a8b 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -17,7 +17,7 @@ # along with this program. If not, see . from os import remove as rmfile -from os.path import isdir, isfile, join as joinpath, basename, abspath, expanduser +from os.path import isdir, isfile, basename, abspath, expanduser import os import math import json @@ -147,10 +147,10 @@ def get_build_vm(srvdir, provider=None): logger.debug('could not confirm that either virtualbox or kvm/libvirt are installed') # try guessing provider from .../srvdir/.vagrant internals - has_libvirt_machine = isdir(joinpath(abssrvdir, '.vagrant', - 'machines', 'default', 'libvirt')) - has_vbox_machine = isdir(joinpath(abssrvdir, '.vagrant', - 'machines', 'default', 'virtualbox')) + has_libvirt_machine = isdir(os.path.join(abssrvdir, '.vagrant', + 'machines', 'default', 'libvirt')) + has_vbox_machine = isdir(os.path.join(abssrvdir, '.vagrant', + 'machines', 'default', 'virtualbox')) if has_libvirt_machine and has_vbox_machine: logger.info('build vm provider lookup found virtualbox and libvirt, defaulting to \'virtualbox\'') return VirtualboxBuildVm(abssrvdir) @@ -183,7 +183,7 @@ class FDroidBuildVm(): """ self.srvdir = srvdir self.srvname = basename(srvdir) + '_default' - self.vgrntfile = joinpath(srvdir, 'Vagrantfile') + self.vgrntfile = os.path.join(srvdir, 'Vagrantfile') self.srvuuid = self._vagrant_fetch_uuid() if not isdir(srvdir): raise FDroidBuildVmException("Can not init vagrant, directory %s not present" % (srvdir)) @@ -229,7 +229,7 @@ class FDroidBuildVm(): logger.debug('vagrant destroy completed') except subprocess.CalledProcessError as e: logger.exception('vagrant destroy failed: %s', e) - vgrntdir = joinpath(self.srvdir, '.vagrant') + vgrntdir = os.path.join(self.srvdir, '.vagrant') try: shutil.rmtree(vgrntdir) logger.debug('deleted vagrant dir: %s', vgrntdir) @@ -253,17 +253,17 @@ class FDroidBuildVm(): return name.replace('/', '-VAGRANTSLASH-') def _vagrant_fetch_uuid(self): - if isfile(joinpath(self.srvdir, '.vagrant')): + if isfile(os.path.join(self.srvdir, '.vagrant')): # Vagrant 1.0 - it's a json file... - with open(joinpath(self.srvdir, '.vagrant')) as f: + with open(os.path.join(self.srvdir, '.vagrant')) as f: id = json.load(f)['active']['default'] logger.debug('vm uuid: %s', id) return id - elif isfile(joinpath(self.srvdir, '.vagrant', 'machines', - 'default', self.provider, 'id')): + elif isfile(os.path.join(self.srvdir, '.vagrant', 'machines', + 'default', self.provider, 'id')): # Vagrant 1.2 (and maybe 1.1?) it's a directory tree... - with open(joinpath(self.srvdir, '.vagrant', 'machines', - 'default', self.provider, 'id')) as f: + with open(os.path.join(self.srvdir, '.vagrant', 'machines', + 'default', self.provider, 'id')) as f: id = f.read() logger.debug('vm uuid: %s', id) return id @@ -288,8 +288,8 @@ class FDroidBuildVm(): _check_call(['vagrant', 'box', 'remove', '--all', '--force', boxname]) except subprocess.CalledProcessError as e: logger.debug('tried removing box %s, but is did not exist: %s', boxname, e) - boxpath = joinpath(expanduser('~'), '.vagrant', - self._vagrant_file_name(boxname)) + boxpath = os.path.join(expanduser('~'), '.vagrant', + self._vagrant_file_name(boxname)) if isdir(boxpath): logger.info("attempting to remove box '%s' by deleting: %s", boxname, boxpath) From f24cf7f71b1bd5d2a904c2ba39315db3549f9ee3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Jan 2018 10:18:07 +0100 Subject: [PATCH 3/3] vmtools: use standard imports: os.remove() The rest of the code uses os.remove() --- fdroidserver/vmtools.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index f6aa0a8b..568da58a 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from os import remove as rmfile from os.path import isdir, isfile, basename, abspath, expanduser import os import math @@ -376,11 +375,11 @@ class LibvirtBuildVm(FDroidBuildVm): if storagePool: if isfile('metadata.json'): - rmfile('metadata.json') + os.remove('metadata.json') if isfile('Vagrantfile'): - rmfile('Vagrantfile') + os.remove('Vagrantfile') if isfile('box.img'): - rmfile('box.img') + os.remove('box.img') logger.debug('preparing box.img for box %s', output) vol = storagePool.storageVolLookupByName(self.srvname + '.img') @@ -430,9 +429,9 @@ class LibvirtBuildVm(FDroidBuildVm): if not keep_box_file: logger.debug('box packaging complete, removing temporary files.') - rmfile('metadata.json') - rmfile('Vagrantfile') - rmfile('box.img') + os.remove('metadata.json') + os.remove('Vagrantfile') + os.remove('box.img') else: logger.warn('could not connect to storage-pool \'default\',' +