1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-10-03 17:50:11 +02:00

Added Tags update check method

This commit is contained in:
Ciaran Gultnieks 2012-08-23 14:25:39 +01:00
parent 5cb5b5b9cd
commit b79ba3c630
6 changed files with 88 additions and 4 deletions

View 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"

View 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

View 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':

View 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

View File

@ -1,4 +1,5 @@
#!/bin/bash
set -e
rm -f buildserver.box
cd buildserver
vagrant up

View 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']));
}