From b79ba3c6300400dfc1fcde649510ede2d8737cd8 Mon Sep 17 00:00:00 2001 From: Ciaran Gultnieks Date: Thu, 23 Aug 2012 14:25:39 +0100 Subject: [PATCH] Added Tags update check method --- buildserver/Vagrantfile | 2 +- docs/fdroid.texi | 6 ++++ fdroidserver/checkupdates.py | 58 +++++++++++++++++++++++++++++++++++- fdroidserver/common.py | 11 +++++++ makebuildserver.sh | 1 + wp-fdroid/wp-fdroid.php | 14 +++++++-- 6 files changed, 88 insertions(+), 4 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index d4f8d533..4d323809 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -7,7 +7,7 @@ Vagrant::Config.run do |config| config.vm.provision :shell, :path => "fixpaths.sh" # Set apt proxy - remove, or adjust this, accordingly! - config.vm.provision :shell, :inline => 'sudo echo "Acquire::http { Proxy \"http://thurlow:3142\"; };" > /etc/apt/apt.conf.d/02proxy && sudo apt-get update' + config.vm.provision :shell, :inline => 'sudo echo "Acquire::http { Proxy \"http://glencoe:3142\"; };" > /etc/apt/apt.conf.d/02proxy && sudo apt-get update' config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "cookbooks" diff --git a/docs/fdroid.texi b/docs/fdroid.texi index ac1a97d0..c7c91cb0 100644 --- a/docs/fdroid.texi +++ b/docs/fdroid.texi @@ -879,6 +879,12 @@ on the development process used by the application's developers. You should not specify this method unless you're sure it's appropriate. (Also, it currently only works for git repositories). @item +@code{Tags} - The AndroidManifest.xml file in all tagged revisions in the +source repository is checked, looking for the highest version code. The +appropriateness of this method depends on the development process used by the +application's developers. You should not specify this method unless you're sure +it's appropriate. (Also, it currently only works for git repositories). +@item @code{Market} - This is being phased out and should not be used! @end itemize diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 752047cb..c73d8a69 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -31,6 +31,60 @@ from common import BuildException from common import VCSException + +# Check for a new version by looking at the tags in 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_tags(app): + + try: + + build_dir = 'build/' + app['id'] + + if app['Repo Type'] != 'git': + return (None, 'Tags 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 Tags 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') + + hver = None + hcode = "0" + + for tag in vcs.gettags(): + vcs.gotorevision(tag) + + version, vercode, package = common.parse_androidmanifest(manifest) + if package and package == app['id'] and version and vercode: + if int(vercode) > int(hcode): + hcode = vercode + hver = version + + if hver: + return (hver, hcode) + return (None, "Couldn't find any version information") + + 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 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 @@ -60,7 +114,7 @@ def check_repomanifest(app): version, vercode, package = common.parse_androidmanifest(manifest) if not package: - return (None, "Couldn't find ipackage ID") + return (None, "Couldn't find package ID") if package != app['id']: return (None, "Package ID mismatch") if not version: @@ -146,6 +200,8 @@ def main(): mode = app['Update Check Mode'] if mode == 'Market': (version, vercode) = check_market(app) + elif mode == 'Tags': + (version, vercode) = check_tags(app) elif mode == 'RepoManifest': (version, vercode) = check_repomanifest(app) elif mode == 'None': diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 061d9ed0..01e444b4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -102,6 +102,10 @@ class vcs: def initsubmodules(self): raise VCSException('Submodules not supported for this vcs type') + # Get a list of all known tags + def gettags(self): + raise VCSException('gettags not supported for this vcs type') + # Returns the srclib (name, path) used in setting up the current # revision, or None. def getsrclib(self): @@ -164,6 +168,12 @@ class vcs_git(vcs): cwd=self.local) != 0: raise VCSException("Git submodule update failed") + def gettags(self): + self.checkrepo() + p = subprocess.Popen(['git', 'tag'], + stdout=subprocess.PIPE, cwd=self.local) + return p.communicate()[0].splitlines() + class vcs_gitsvn(vcs): @@ -617,6 +627,7 @@ def parse_description(lines): # Extract some information from the AndroidManifest.xml at the given path. # Returns (version, vercode, package), any or all of which might be None. +# All values returned are strings. def parse_androidmanifest(manifest): vcsearch = re.compile(r'.*android:versionCode="([^"]+)".*').search diff --git a/makebuildserver.sh b/makebuildserver.sh index 7c982655..31594172 100755 --- a/makebuildserver.sh +++ b/makebuildserver.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -e rm -f buildserver.box cd buildserver vagrant up diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 0ef5df59..455c49ce 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -296,7 +296,17 @@ class FDroid $i=0; foreach($apks as $apk) { $first = $i+1==count($apks); - $out.="

Version ".$apk['version']."
"; + $out.="

Version ".$apk['version']."
"; + + // Is this source or binary? + $srcbuild = isset($apk['srcname']) && file_exists($this->site_path.'/repo/'.$apk['srcname']); + + $out.="

This version is build and signed by "; + if($srcbuild) { + $out.="F-Droid, and guaranteed to correspond to the source tarball below.

"; + } else { + $out.="the original developer.

"; + } $out.='download apk '; $out.=$this->human_readable_size($apk['size']); $diffSize = $apk['diff']['size']; @@ -305,7 +315,7 @@ class FDroid $out.=$diffSize>0?'+':''; $out.=$this->human_readable_size($diffSize, 1).')'; } - if(isset($apk['srcname']) && file_exists($this->site_path.'/repo/'.$apk['srcname'])) { + if($srcbuild) { $out.='
source tarball '; $out.=$this->human_readable_size(filesize($this->site_path.'/repo/'.$apk['srcname'])); } -- 2.30.2