chiark / gitweb /
Add Tags and RM support for srclib, don't copy dir
authorDaniel Martí <mvdan@mvdan.cc>
Fri, 24 May 2013 21:35:56 +0000 (23:35 +0200)
committerDaniel Martí <mvdan@mvdan.cc>
Fri, 24 May 2013 21:35:56 +0000 (23:35 +0200)
fdroidserver/build.py
fdroidserver/checkupdates.py
fdroidserver/common.py

index 05793e04bde222eda20c0565559d47082a28d111..452ddf677ff67520443208ce099fa7913ae860c3 100644 (file)
@@ -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)
index 9ea6421b1c88e6f2116bca2ff63c87278b77e5f8..0a8553274c877a2bb54cab94cbabf72b3bff83a8 100644 (file)
@@ -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(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,13 +104,21 @@ 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'] == 'srclib':
+            build_dir = os.path.join(build_dir, app['Repo'])
+
         if vcs.repotype() == 'git':
             if branch:
                 vcs.gotorevision('origin/'+branch)
@@ -114,7 +126,7 @@ def check_repomanifest(app, sdk_path, branch=None):
                 vcs.gotorevision('origin/master')
                 pass
         elif vcs.repotype() == 'git-svn':
-            vcs.gotorevision('trunk')
+            vcs.gotorevision(None)
         elif vcs.repotype() == 'svn':
             vcs.gotorevision(None)
         elif vcs.repotype() == 'hg':
@@ -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']:
index 1239767fdda0c8192aff44a9154fe18ce5878370..afa74220b2a11113bcb850ab298d5e47a7393180 100644 (file)
@@ -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):
 
@@ -340,29 +344,26 @@ class vcs_bzr(vcs):
                     cwd=self.local) != 0:
                 raise VCSException("Bzr revert failed")
 
-class vcs_srclib(vcs):
-
-    def repotype(self):
-        return 'srclib'
-
-    def gotorevisionx(self, rev):
-
-        srclib_dir = 'build/srclib'
+    def __init__(self, remote, local, sdk_path):
 
-        if os.path.exists(self.local):
-            shutil.rmtree(self.local)
+        self.sdk_path = sdk_path
 
-        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.
@@ -964,9 +965,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 +984,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: