chiark / gitweb /
Some more build capabilities, and an optimisation for SVN when doing tag checkouts
authorCiaran Gultnieks <ciaran@ciarang.com>
Sat, 8 Jan 2011 22:31:55 +0000 (22:31 +0000)
committerCiaran Gultnieks <ciaran@ciarang.com>
Sat, 8 Jan 2011 22:31:55 +0000 (22:31 +0000)
README
build.py

diff --git a/README b/README
index ef6fb9b13a9375726dbf9eb9289cf5a9937879e7..b3b997221fb3995a5691cd6138454f6b24d4fd83 100644 (file)
--- a/README
+++ b/README
@@ -118,6 +118,10 @@ configuration to the build. These are:
                   AndroidManifest.xml.
  antcommand=xxx  - Specify an alternate ant command (target) instead of the
                   default 'release'.
+ insertversion=x - If specified, the pattern 'x' in the AndroidManifest.xml is
+                   replaced with the version number for the build.
+ insertvercode=x - If specified, the pattern 'x' in the AndroidManifest.xml is
+                   replaced with the version code for the build.
 
 Another example, using extra parameters:
 
index 2acbf48eff7e6c1a75abd73377f92abbe42c13ea..9ae276babe3effbdfdfd33fd18c529f7ca09a6c9 100644 (file)
--- a/build.py
+++ b/build.py
@@ -25,6 +25,7 @@ import re
 import zipfile
 import tarfile
 import md5
+import shlex
 from xml.dom.minidom import Document
 from optparse import OptionParser
 
@@ -125,38 +126,45 @@ for app in apps:
 
 
                     # Optionally, the actual app source can be in a subdirectory...
+                    doupdate = True
                     if thisbuild.has_key('subdir'):
                         if app['repotype'] == 'svn' and repo.endswith("*"):
                             root_dir = build_dir
                             if subprocess.call(['svn', 'checkout',
                                     repo[:-1] + thisbuild['subdir'],
+                                    '-r', thisbuild['commit'],
                                     build_dir] + repouserargs) != 0:
                                 print "Svn checkout failed"
                                 sys.exit(1)
+                            # Because we're checking out for every version we build,
+                            # we've already checked out the repo at the correct revision
+                            # and don't need to update to it...
+                            doupdate = False
                         else:
                             root_dir = os.path.join(build_dir, thisbuild['subdir'])
                     else:
                         root_dir = build_dir
 
-                    if app['repotype'] == 'git':
-                        if subprocess.call(['git', 'checkout', thisbuild['commit']],
-                                cwd=build_dir) != 0:
-                            print "Git checkout failed"
-                            sys.exit(1)
-                    elif app['repotype'] == 'svn':
-                        if subprocess.call(['svn', 'update', '-r', thisbuild['commit']],
-                                cwd=build_dir) != 0:
-                            print "Svn update failed"
-                            sys.exit(1)
-                    elif app['repotype'] == 'hg':
-                        if subprocess.call(['hg', 'checkout', thisbuild['commit']],
-                                cwd=build_dir) != 0:
-                            print "Hg checkout failed"
-                            sys.exit(1)
+                    if doupdate:
+                        if app['repotype'] == 'git':
+                            if subprocess.call(['git', 'checkout', thisbuild['commit']],
+                                    cwd=build_dir) != 0:
+                                print "Git checkout failed"
+                                sys.exit(1)
+                        elif app['repotype'] == 'svn':
+                            if subprocess.call(['svn', 'update', '-r', thisbuild['commit']],
+                                    cwd=build_dir) != 0:
+                                print "Svn update failed"
+                                sys.exit(1)
+                        elif app['repotype'] == 'hg':
+                            if subprocess.call(['hg', 'checkout', thisbuild['commit']],
+                                    cwd=build_dir) != 0:
+                                print "Hg checkout failed"
+                                sys.exit(1)
 
-                    else:
-                        print "Invalid repo type " + app['repotype']
-                        sys.exit(1)
+                        else:
+                            print "Invalid repo type " + app['repotype']
+                            sys.exit(1)
 
                     # Generate (or update) the ant build file, build.xml...
                     parms = ['android','update','project','-p','.']
@@ -176,7 +184,7 @@ for app in apps:
                             print "Failed to amend build.properties"
                             sys.exit(1)
 
-                    #Update the local.properties file...
+                    # Update the local.properties file...
                     locprops = os.path.join(root_dir, 'local.properties')
                     f = open(locprops, 'r')
                     props = f.read()
@@ -194,11 +202,32 @@ for app in apps:
                     f.write(props)
                     f.close()
 
-                    #Delete unwanted file...
+                    # Insert version code and number into the manifest if necessary...
+                    if thisbuild.has_key('insertversion'):
+                        if subprocess.call(['sed','-i','s/' + thisbuild['insertversion'] +
+                            '/' + thisbuild['version'] +'/g',
+                            'AndroidManifest.xml'], cwd=root_dir) !=0:
+                            print "Failed to amend manifest"
+                            sys.exit(1)
+                    if thisbuild.has_key('insertvercode'):
+                        if subprocess.call(['sed','-i','s/' + thisbuild['insertvercode'] +
+                            '/' + thisbuild['vercode'] +'/g',
+                            'AndroidManifest.xml'], cwd=root_dir) !=0:
+                            print "Failed to amend manifest"
+                            sys.exit(1)
+
+                    # Delete unwanted file...
                     if thisbuild.has_key('rm'):
                         os.remove(os.path.join(build_dir, thisbuild['rm']))
 
-                    #Build the source tarball right before we build the relase...
+                    # Run a pre-build command if one is required...
+                    if thisbuild.has_key('prebuild'):
+                        if subprocess.call(shlex.split(thisbuild['prebuild']),
+                                cwd=root_dir) != 0:
+                            print "Error running pre-build command"
+                            sys.exit(1)
+
+                    # Build the source tarball right before we build the release...
                     tarname = app['id'] + '_' + thisbuild['vercode'] + '_src'
                     tarball = tarfile.open(os.path.join(built_dir,
                         tarname + '.tar.gz'), "w:gz")