diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 05793e04..452ddf67 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -657,11 +657,17 @@ def main(): build_succeeded = [] for app in apps: - build_dir = 'build/' + app['id'] + if app['Repo Type'] == 'srclib': + build_dir = os.path.join('build', 'srclib') + else: + build_dir = os.path.join('build', app['id']) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir, sdk_path) + if app['Repo Type'] == 'srclib': + build_dir = os.path.join(build_dir, app['Repo']) + if options.wiki: import mwclient site = mwclient.Site(wiki_server, path=wiki_path) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 3c157635..713ad6bd 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -19,7 +19,6 @@ import sys import os -import shutil import re import urllib2 import time @@ -43,24 +42,29 @@ def check_tags(app, sdk_path): try: - build_dir = 'build/' + app['id'] + if app['Repo Type'] == 'srclib': + build_dir = os.path.join('build', 'srclib') + repotype = common.getsrclibvcs(app['Repo']) + else: + build_dir = os.path.join('build/', app['id']) + repotype = app['Repo Type'] - if app['Repo Type'] not in ('git', 'git-svn'): + if repotype not in ('git', 'git-svn'): return (None, 'Tags update mode only works for git and git-svn repositories currently') # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir, sdk_path) - if app['Repo Type'] == 'git': - vcs.gotorevision(None) - elif app['Repo Type'] == 'git-svn': - vcs.gotorevision(None) + + if app['Repo Type'] == 'srclib': + build_dir = os.path.join(build_dir, app['Repo']) + + vcs.gotorevision(None) if len(app['builds']) == 0: return (None, "Can't use Tags with no builds defined") - app_dir = build_dir if 'subdir' in app['builds'][-1]: - app_dir = os.path.join(app_dir, app['builds'][-1]['subdir']) + build_dir = os.path.join(build_dir, app['builds'][-1]['subdir']) hver = None hcode = "0" @@ -69,8 +73,8 @@ def check_tags(app, sdk_path): vcs.gotorevision(tag) # Only process tags where the manifest exists... - if os.path.exists(app_dir + '/AndroidManifest.xml'): - version, vercode, package = common.parse_androidmanifest(app_dir) + if os.path.exists(os.path.join(build_dir, 'AndroidManifest.xml')): + version, vercode, package = common.parse_androidmanifest(build_dir) if package and package == app['id'] and version and vercode: if int(vercode) > int(hcode): hcode = str(int(vercode)) @@ -100,24 +104,32 @@ def check_repomanifest(app, sdk_path, branch=None): try: - build_dir = 'build/' + app['id'] + if app['Repo Type'] == 'srclib': + build_dir = os.path.join('build', 'srclib') + repotype = common.getsrclibvcs(app['Repo']) + else: + build_dir = os.path.join('build/', app['id']) + repotype = app['Repo Type'] - if app['Repo Type'] == 'bzr': + if repotype == 'bzr': return (None, 'RepoManifest update mode has not been ported to bzr repositories yet') # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir, sdk_path) - if app['Repo Type'] == 'git': + if app['Repo Type'] == 'srclib': + build_dir = os.path.join(build_dir, app['Repo']) + + if vcs.repotype() == 'git': if branch: vcs.gotorevision('origin/'+branch) else: vcs.gotorevision('origin/master') pass - elif app['Repo Type'] == 'git-svn': - vcs.gotorevision('trunk') - elif app['Repo Type'] == 'svn': + elif vcs.repotype() == 'git-svn': vcs.gotorevision(None) - elif app['Repo Type'] == 'hg': + elif vcs.repotype() == 'svn': + vcs.gotorevision(None) + elif vcs.repotype() == 'hg': if branch: vcs.gotorevision(branch) else: @@ -126,11 +138,10 @@ def check_repomanifest(app, sdk_path, branch=None): if len(app['builds']) == 0: return (None, "Can't use RepoManifest with no builds defined") - app_dir = build_dir if 'subdir' in app['builds'][-1]: - app_dir = os.path.join(app_dir, app['builds'][-1]['subdir']) + build_dir = os.path.join(build_dir, app['builds'][-1]['subdir']) - version, vercode, package = common.parse_androidmanifest(app_dir) + version, vercode, package = common.parse_androidmanifest(build_dir) if not package: return (None, "Couldn't find package ID") if package != app['id']: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1239767f..ec9d7a98 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -35,9 +35,13 @@ def getvcs(vcstype, remote, local, sdk_path): if vcstype == 'bzr': return vcs_bzr(remote, local, sdk_path) if vcstype == 'srclib': - return vcs_srclib(remote, local, sdk_path) + return getsrclib(remote, local, sdk_path, raw=True) raise VCSException("Invalid vcs type " + vcstype) +def getsrclibvcs(name): + srclib_path = os.path.join('srclibs', name + ".txt") + return parse_srclib(srclib_path)['Repo Type'] + class vcs: def __init__(self, remote, local, sdk_path): @@ -253,7 +257,7 @@ class vcs_gitsvn(vcs): def gettags(self): self.checkrepo() - return os.listdir(self.local+'/.git/svn/refs/remotes/tags') + return os.listdir(os.path.join(self.local, '/.git/svn/refs/remotes/tags')) class vcs_svn(vcs): @@ -340,29 +344,26 @@ class vcs_bzr(vcs): cwd=self.local) != 0: raise VCSException("Bzr revert failed") -class vcs_srclib(vcs): + def __init__(self, remote, local, sdk_path): - def repotype(self): - return 'srclib' + self.sdk_path = sdk_path - def gotorevisionx(self, rev): - - srclib_dir = 'build/srclib' - - if os.path.exists(self.local): - shutil.rmtree(self.local) - - if self.remote.find(':') != -1: - srclib, path = self.remote.split(':') + index = remote.find('@') + if index != -1: + self.username = remote[:index] + remote = remote[index+1:] + index = self.username.find(':') + if index == -1: + raise VCSException("Password required with username") + self.password = self.username[index+1:] + self.username = self.username[:index] else: - srclib = self.remote - path = None - libdir = getsrclib(srclib + '@' + rev, srclib_dir, self.sdk_path) - self.srclib = (srclib, libdir) - if path: - libdir = os.path.join(libdir, path) - shutil.copytree(libdir, self.local) - return self.local + self.username = None + + self.remote = remote + self.local = local + self.refreshed = False + self.srclib = None # Get the type expected for a given metadata field. @@ -849,7 +850,7 @@ def parse_androidmanifest(app_dir): version = None vercode = None package = None - for line in file(app_dir + '/AndroidManifest.xml'): + for line in file(os.path.join(app_dir, 'AndroidManifest.xml')): if not package: matches = psearch(line) if matches: @@ -864,14 +865,15 @@ def parse_androidmanifest(app_dir): vercode = matches.group(1) if version: return (version, vercode, package) - for xmlfile in glob.glob(app_dir + '/res/values/strings*transl*.xml'): + for xmlfile in glob.glob(os.path.join( + app_dir, 'res', 'values', 'strings*transl*.xml')): for line in file(xmlfile): if not version: matches = vnsearch_xml(line) if matches: version = matches.group(2) if not version: - for line in file(app_dir + '/res/values/strings.xml'): + for line in file(os.path.join(app_dir, 'res/values/strings.xml')): if not version: matches = vnsearch_xml(line) if matches: @@ -964,9 +966,13 @@ def parse_srclib(metafile, **kw): # Returns the path to it. Normally this is the path to be used when referencing # it, which may be a subdirectory of the actual project. If you want the base # directory of the project, pass 'basepath=True'. -def getsrclib(spec, srclib_dir, sdk_path, basepath=False): +def getsrclib(spec, srclib_dir, sdk_path, basepath=False, raw=False): - name, ref = spec.split('@') + if raw: + name = spec + ref = None + else: + name, ref = spec.split('@') srclib_path = os.path.join('srclibs', name + ".txt") @@ -979,6 +985,9 @@ def getsrclib(spec, srclib_dir, sdk_path, basepath=False): vcs = getvcs(srclib["Repo Type"], srclib["Repo"], sdir, sdk_path) vcs.gotorevision(ref) + if raw: + return vcs + libdir = None if srclib["Subdir"] is not None: @@ -1080,7 +1089,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, sdk_path, print 'Force-removing old build.xml' os.remove(buildxml) for d in update_dirs: - cwd = root_dir + '/' + d + cwd = os.path.join(root_dir, d) if verbose: print "Update of '%s': exec '%s' in '%s'"%\ (d," ".join(parms),cwd) diff --git a/fdroidserver/stats.py b/fdroidserver/stats.py index 73bf4631..50c82055 100644 --- a/fdroidserver/stats.py +++ b/fdroidserver/stats.py @@ -161,7 +161,10 @@ def main(): if len(app['Repo Type']) == 0: rtype = 'none' else: - rtype = app['Repo Type'] + if app['Repo Type'] == 'srclib': + rtype = common.getsrclibvcs(app['Repo']) + else: + rtype = app['Repo Type'] if rtype in repotypes: repotypes[rtype] += 1; else: @@ -174,7 +177,7 @@ def main(): # Calculate and write stats for update check modes... ucms = {} for app in metaapps: - checkmode = app['Update Check Mode'] + checkmode = app['Update Check Mode'].split('/')[0] if checkmode in ucms: ucms[checkmode] += 1; else: @@ -197,8 +200,6 @@ def main(): f.write(license + ' ' + str(count) + '\n') f.close() - - # Write list of latest apps added to the repo... latest = knownapks.getlatest(10) f = open('stats/latestapps.txt', 'w')