mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-05 06:50:29 +03:00
Recognise changes in subdirs in Tags and RepoManifest
This commit is contained in:
parent
00066a9b45
commit
eaf3216e40
2 changed files with 233 additions and 165 deletions
|
|
@ -299,69 +299,46 @@ def check_gplay(app):
|
|||
return (version.strip(), None)
|
||||
|
||||
|
||||
config = None
|
||||
options = None
|
||||
# Return all directories under startdir that contain any of the manifest
|
||||
# files, and thus are probably an Android project.
|
||||
def dirs_with_manifest(startdir):
|
||||
for r, d, f in os.walk(startdir):
|
||||
if any(m in f for m in [
|
||||
'AndroidManifest.xml', 'pom.xml', 'build.gradle']):
|
||||
yield r
|
||||
|
||||
|
||||
def main():
|
||||
# Tries to find a new subdir starting from the root build_dir. Returns said
|
||||
# subdir relative to the build dir if found, None otherwise.
|
||||
def check_changed_subdir(app):
|
||||
|
||||
global config, options
|
||||
|
||||
# Parse command line...
|
||||
parser = OptionParser(usage="Usage: %prog [options] [APPID [APPID ...]]")
|
||||
parser.add_option("-v", "--verbose", action="store_true", default=False,
|
||||
help="Spew out even more information than normal")
|
||||
parser.add_option("-q", "--quiet", action="store_true", default=False,
|
||||
help="Restrict output to warnings and errors")
|
||||
parser.add_option("--auto", action="store_true", default=False,
|
||||
help="Process auto-updates")
|
||||
parser.add_option("--autoonly", action="store_true", default=False,
|
||||
help="Only process apps with auto-updates")
|
||||
parser.add_option("--commit", action="store_true", default=False,
|
||||
help="Commit changes")
|
||||
parser.add_option("--gplay", action="store_true", default=False,
|
||||
help="Only print differences with the Play Store")
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
config = common.read_config(options)
|
||||
|
||||
# Get all apps...
|
||||
allapps = metadata.read_metadata()
|
||||
|
||||
apps = common.read_app_args(args, allapps, False)
|
||||
|
||||
if options.gplay:
|
||||
for app in apps:
|
||||
version, reason = check_gplay(app)
|
||||
if version is None:
|
||||
if reason == '404':
|
||||
logging.info("{0} is not in the Play Store".format(common.getappname(app)))
|
||||
appid = app['Update Check Name'] if app['Update Check Name'] else app['id']
|
||||
if app['Repo Type'] == 'srclib':
|
||||
build_dir = os.path.join('build', 'srclib', app['Repo'])
|
||||
else:
|
||||
logging.info("{0} encountered a problem: {1}".format(common.getappname(app), reason))
|
||||
if version is not None:
|
||||
stored = app['Current Version']
|
||||
if not stored:
|
||||
logging.info("{0} has no Current Version but has version {1} on the Play Store"
|
||||
.format(common.getappname(app), version))
|
||||
elif LooseVersion(stored) < LooseVersion(version):
|
||||
logging.info("{0} has version {1} on the Play Store, which is bigger than {2}"
|
||||
.format(common.getappname(app), version, stored))
|
||||
else:
|
||||
if stored != version:
|
||||
logging.info("{0} has version {1} on the Play Store, which differs from {2}"
|
||||
.format(common.getappname(app), version, stored))
|
||||
else:
|
||||
logging.info("{0} has the same version {1} on the Play Store"
|
||||
.format(common.getappname(app), version))
|
||||
return
|
||||
build_dir = os.path.join('build/', app['id'])
|
||||
|
||||
for app in apps:
|
||||
if not os.path.isdir(build_dir):
|
||||
return None
|
||||
|
||||
if options.autoonly and app['Auto Update Mode'] in ('None', 'Static'):
|
||||
logging.debug("Nothing to do for {0}...".format(app['id']))
|
||||
continue
|
||||
flavour = None
|
||||
if len(app['builds']) > 0 and app['builds'][-1]['gradle']:
|
||||
flavour = app['builds'][-1]['gradle']
|
||||
if flavour == 'yes':
|
||||
flavour = None
|
||||
|
||||
logging.info("Processing " + app['id'] + '...')
|
||||
for d in dirs_with_manifest(build_dir):
|
||||
logging.debug("Trying possible dir %s." % d)
|
||||
m_paths = common.manifest_paths(d, flavour)
|
||||
package = common.parse_androidmanifests(m_paths, app['Update Check Ignore'])[2]
|
||||
if package and package == appid:
|
||||
logging.debug("Manifest exists in possible dir %s." % d)
|
||||
return os.path.relpath(d, build_dir)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def checkupdates_app(app, first=True):
|
||||
|
||||
# If a change is made, commitmsg should be set to a description of it.
|
||||
# Only if this is set will changes be written back to the metadata.
|
||||
|
|
@ -397,7 +374,22 @@ def main():
|
|||
version = None
|
||||
msg = 'Invalid update check method'
|
||||
|
||||
if vercode and app['Vercode Operation']:
|
||||
if first and version is None and vercode == "Couldn't find package ID":
|
||||
logging.warn("Couldn't find any version information. Looking for a subdir change...")
|
||||
new_subdir = check_changed_subdir(app)
|
||||
if new_subdir is None:
|
||||
logging.warn("Couldn't find any new subdir.")
|
||||
else:
|
||||
logging.warn("Trying a new subdir: %s" % new_subdir)
|
||||
new_build = {}
|
||||
metadata.fill_build_defaults(new_build)
|
||||
new_build['version'] = "Ignore"
|
||||
new_build['vercode'] = "-1"
|
||||
new_build['subdir'] = new_subdir
|
||||
app['builds'].append(new_build)
|
||||
return checkupdates_app(app, first=False)
|
||||
|
||||
if version and vercode and app['Vercode Operation']:
|
||||
op = app['Vercode Operation'].replace("%c", str(int(vercode)))
|
||||
vercode = str(eval(op))
|
||||
|
||||
|
|
@ -516,6 +508,73 @@ def main():
|
|||
logging.error("Git commit failed")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
|
||||
# Parse command line...
|
||||
parser = OptionParser(usage="Usage: %prog [options] [APPID [APPID ...]]")
|
||||
parser.add_option("-v", "--verbose", action="store_true", default=False,
|
||||
help="Spew out even more information than normal")
|
||||
parser.add_option("-q", "--quiet", action="store_true", default=False,
|
||||
help="Restrict output to warnings and errors")
|
||||
parser.add_option("--auto", action="store_true", default=False,
|
||||
help="Process auto-updates")
|
||||
parser.add_option("--autoonly", action="store_true", default=False,
|
||||
help="Only process apps with auto-updates")
|
||||
parser.add_option("--commit", action="store_true", default=False,
|
||||
help="Commit changes")
|
||||
parser.add_option("--gplay", action="store_true", default=False,
|
||||
help="Only print differences with the Play Store")
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
config = common.read_config(options)
|
||||
|
||||
# Get all apps...
|
||||
allapps = metadata.read_metadata()
|
||||
|
||||
apps = common.read_app_args(args, allapps, False)
|
||||
|
||||
if options.gplay:
|
||||
for app in apps:
|
||||
version, reason = check_gplay(app)
|
||||
if version is None:
|
||||
if reason == '404':
|
||||
logging.info("{0} is not in the Play Store".format(common.getappname(app)))
|
||||
else:
|
||||
logging.info("{0} encountered a problem: {1}".format(common.getappname(app), reason))
|
||||
if version is not None:
|
||||
stored = app['Current Version']
|
||||
if not stored:
|
||||
logging.info("{0} has no Current Version but has version {1} on the Play Store"
|
||||
.format(common.getappname(app), version))
|
||||
elif LooseVersion(stored) < LooseVersion(version):
|
||||
logging.info("{0} has version {1} on the Play Store, which is bigger than {2}"
|
||||
.format(common.getappname(app), version, stored))
|
||||
else:
|
||||
if stored != version:
|
||||
logging.info("{0} has version {1} on the Play Store, which differs from {2}"
|
||||
.format(common.getappname(app), version, stored))
|
||||
else:
|
||||
logging.info("{0} has the same version {1} on the Play Store"
|
||||
.format(common.getappname(app), version))
|
||||
return
|
||||
|
||||
for app in apps:
|
||||
|
||||
if options.autoonly and app['Auto Update Mode'] in ('None', 'Static'):
|
||||
logging.debug("Nothing to do for {0}...".format(app['id']))
|
||||
continue
|
||||
|
||||
logging.info("Processing " + app['id'] + '...')
|
||||
|
||||
checkupdates_app(app)
|
||||
|
||||
logging.info("Finished.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
|
|
@ -533,6 +533,23 @@ def flagtype(name):
|
|||
return 'string'
|
||||
|
||||
|
||||
def fill_build_defaults(build):
|
||||
|
||||
def get_build_type():
|
||||
for t in ['maven', 'gradle', 'kivy']:
|
||||
if build[t]:
|
||||
return t
|
||||
if build['output']:
|
||||
return 'raw'
|
||||
return 'ant'
|
||||
|
||||
for flag, value in flag_defaults.iteritems():
|
||||
if flag in build:
|
||||
continue
|
||||
build[flag] = value
|
||||
build['type'] = get_build_type()
|
||||
|
||||
|
||||
# Parse metadata for a single application.
|
||||
#
|
||||
# 'metafile' - the filename to read. The package id for the application comes
|
||||
|
|
@ -628,14 +645,6 @@ def parse_metadata(metafile):
|
|||
thisinfo['comments'].append((key, comment))
|
||||
del curcomments[:]
|
||||
|
||||
def get_build_type(build):
|
||||
for t in ['maven', 'gradle', 'kivy']:
|
||||
if build[t]:
|
||||
return t
|
||||
if build['output']:
|
||||
return 'raw'
|
||||
return 'ant'
|
||||
|
||||
thisinfo = {}
|
||||
if metafile:
|
||||
if not isinstance(metafile, file):
|
||||
|
|
@ -767,11 +776,7 @@ def parse_metadata(metafile):
|
|||
thisinfo['Description'].append('No description available')
|
||||
|
||||
for build in thisinfo['builds']:
|
||||
for flag, value in flag_defaults.iteritems():
|
||||
if flag in build:
|
||||
continue
|
||||
build[flag] = value
|
||||
build['type'] = get_build_type(build)
|
||||
fill_build_defaults(build)
|
||||
|
||||
return thisinfo
|
||||
|
||||
|
|
@ -841,6 +846,10 @@ def write_metadata(dest, app):
|
|||
writefield('Repo')
|
||||
mf.write('\n')
|
||||
for build in app['builds']:
|
||||
|
||||
if build['version'] == "Ignore":
|
||||
continue
|
||||
|
||||
writecomments('build:' + build['vercode'])
|
||||
mf.write("Build:%s,%s\n" % (build['version'], build['vercode']))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue