diff --git a/checkupdates.py b/checkupdates.py index bd0fffbf..96ad5a18 100755 --- a/checkupdates.py +++ b/checkupdates.py @@ -28,6 +28,56 @@ import HTMLParser import common +# Check for a new version by looking at the AndroidManifest.xml at the HEAD +# of the source repo. Whether this can be used reliably or not depends on +# the development procedures used by the project's developers. Use it with +# caution, because it's inappropriate for many projects. +# Returns (None, "a message") if this didn't work, or (version, vercode) for +# the details of the current version. +def check_repomanifest(app): + + try: + + build_dir = 'build/' + app['id'] + + if app['Repo Type'] != 'git': + return (None, 'RepoManifest update mode only works for git repositories currently') + + # Set up vcs interface and make sure we have the latest code... + vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir) + vcs.gotorevision('origin/master') + + if len(app['builds']) == 0: + return (None, "Can't use RepoManifest with no builds defined") + + manifest = build_dir + if app['builds'][-1].has_key('subdir'): + manifest = os.path.join(manifest, app['builds'][-1]['subdir']) + manifest = os.path.join(manifest, 'AndroidManifest.xml') + + version, vercode, package = common.parse_androidmanifest(manifest) + if not package: + return (None, "Couldn't find ipackage ID") + if package != app['id']: + return (None, "Package ID mismatch") + if not version: + return (None,"Couldn't find latest version name") + if not vercode: + return (None,"Couldn't find latest version code") + + return (version, vercode) + + except BuildException as be: + msg = "Could not scan app %s due to BuildException: %s" % (app['id'], be) + return (None, msg) + except VCSException as vcse: + msg = "VCS error while scanning app %s: %s" % (app['id'], vcse) + return (None, msg) + except Exception: + msg = "Could not scan app %s due to unknown error: %s" % (app['id'], traceback.format_exc()) + return (None, msg) + + # Check for a new version by looking at the Google market. # Returns (None, "a message") if this didn't work, or (version, vercode) for # the details of the current version. @@ -91,6 +141,8 @@ def main(): mode = app['Update Check Mode'] if mode == 'Market': (version, vercode) = check_market(app) + elif mode == 'RepoManifest': + (version, vercode) = check_repomanifest(app) elif mode == 'None': version = None vercode = 'Checking disabled' diff --git a/common.py b/common.py index 1916c9cc..978ecf98 100644 --- a/common.py +++ b/common.py @@ -563,6 +563,32 @@ def parse_description(lines): return text +# Extract some information from the AndroidManifest.xml at the given path. +# Returns (version, vercode, package), any or all of which might be None. +def parse_androidmanifest(manifest): + + vcsearch = re.compile(r'.*android:versionCode="([^"]+)".*').search + vnsearch = re.compile(r'.*android:versionName="([^"]+)".*').search + psearch = re.compile(r'.*package="([^"]+)".*').search + version = None + vercode = None + package = None + for line in file(manifest): + if not package: + matches = psearch(line) + if matches: + package = matches.group(1) + if not version: + matches = vnsearch(line) + if matches: + version = matches.group(1) + if not vercode: + matches = vcsearch(line) + if matches: + vercode = matches.group(1) + return (version, vercode, package) + + class BuildException(Exception): def __init__(self, value, stdout = None, stderr = None): self.value = value @@ -967,9 +993,9 @@ def scan_source(build_dir, root_dir, thisbuild): msg = 'Found DexClassLoader in ' + fp problems.append(msg) - if line.lower().find('all rights reserved') != -1: - msg = 'All rights reserved in ' + fp - problems.append(msg) +# if line.lower().find('all rights reserved') != -1: +# msg = 'All rights reserved in ' + fp +# problems.append(msg) # Presence of a jni directory without buildjni=yes might # indicate a problem... diff --git a/import.py b/import.py index c8910f59..485301ff 100755 --- a/import.py +++ b/import.py @@ -189,25 +189,7 @@ def main(): sys.exit(1) # Extract some information... - vcsearch = re.compile(r'.*android:versionCode="([^"]+)".*').search - vnsearch = re.compile(r'.*android:versionName="([^"]+)".*').search - psearch = re.compile(r'.*package="([^"]+)".*').search - version = None - vercode = None - package = None - for line in file(manifest): - if not package: - matches = psearch(line) - if matches: - package = matches.group(1) - if not version: - matches = vnsearch(line) - if matches: - version = matches.group(1) - if not vercode: - matches = vcsearch(line) - if matches: - vercode = matches.group(1) + version, vercode, package = common.parse_androidmanifest(manifest) if not package: print "Couldn't find package ID" sys.exit(1)