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"
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
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
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:
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':
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):
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):
# 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
#!/bin/bash
+set -e
rm -f buildserver.box
cd buildserver
vagrant up
$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'];
$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']));
}