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