chiark / gitweb /
Added Tags update check method
authorCiaran Gultnieks <ciaran@ciarang.com>
Thu, 23 Aug 2012 13:25:39 +0000 (14:25 +0100)
committerCiaran Gultnieks <ciaran@ciarang.com>
Thu, 23 Aug 2012 13:25:39 +0000 (14:25 +0100)
buildserver/Vagrantfile
docs/fdroid.texi
fdroidserver/checkupdates.py
fdroidserver/common.py
makebuildserver.sh
wp-fdroid/wp-fdroid.php

index d4f8d5337e21f127d0e6729a1a49807a45521cae..4d32380979f4ad2600083e46333d702f1b1a2161 100644 (file)
@@ -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"
index ac1a97d0d5ea14eb58fea321850d1558414a17c9..c7c91cb0ea5d6134dc28aa6aa8f6c64d3822dbcc 100644 (file)
@@ -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
 
index 752047cb6ef4c4bfab3feb30e5124d7f37a6840e..c73d8a6972a2dde833e302ddf2277de2c05f9788 100644 (file)
@@ -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':
index 061d9ed087ec38fe63e6d9de84f1f420428af328..01e444b49471aed8b11ac19c9a4ad9f5ff50b5b6 100644 (file)
@@ -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
index 7c9826552d39e966dcf2dac4b3d6e9ae06109258..31594172063d6e7013bd1e717cdcbe0c99806ecf 100755 (executable)
@@ -1,4 +1,5 @@
 #!/bin/bash
+set -e
 rm -f buildserver.box
 cd buildserver
 vagrant up
index 0ef5df59ab46f6535660c7f36c439d9a1b00bd61..455c49ceaf36215fefcf05007efd8e3df083ccc0 100644 (file)
@@ -296,7 +296,17 @@ class FDroid
                                $i=0;
                                foreach($apks as $apk) {
                                        $first = $i+1==count($apks);
-                                       $out.="<p><b>Version ".$apk['version']."</b><br />";
+                                        $out.="<p><b>Version ".$apk['version']."</b><br />";
+
+                                        // Is this source or binary?
+                                        $srcbuild = isset($apk['srcname']) && file_exists($this->site_path.'/repo/'.$apk['srcname']);
+
+                                        $out.="<p>This version is build and signed by ";
+                                        if($srcbuild) {
+                                            $out.="F-Droid, and guaranteed to correspond to the source tarball below.</p>";
+                                        } else {
+                                            $out.="the original developer.</p>";
+                                        }
                                        $out.='<a href="https://f-droid.org/repo/'.$apk['apkname'].'">download apk</a> ';
                                        $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).')</span>';
                                        }
-                                       if(isset($apk['srcname']) && file_exists($this->site_path.'/repo/'.$apk['srcname'])) {
+                                       if($srcbuild) {
                                                $out.='<br /><a href="https://f-droid.org/repo/'.$apk['srcname'].'">source tarball</a> ';
                                                $out.=$this->human_readable_size(filesize($this->site_path.'/repo/'.$apk['srcname']));
                                        }