Rev 3859: (mbp, for jam) add w32 build_release script in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Thu Nov 27 02:38:44 GMT 2008


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3859
revision-id: pqm at pqm.ubuntu.com-20081127023840-5jizeni4af1cyu8g
parent: pqm at pqm.ubuntu.com-20081127020228-ijs40lbdj3q2rmff
parent: john at arbash-meinel.com-20081106181745-nwo2xfv9ohsfpkma
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2008-11-27 02:38:40 +0000
message:
  (mbp, for jam) add w32 build_release script
added:
  tools/win32/build_release.py   build_release.py-20081105204355-2ghh5cv01v1x4rzz-1
    ------------------------------------------------------------
    revno: 3823.4.1
    revision-id: john at arbash-meinel.com-20081106181745-nwo2xfv9ohsfpkma
    parent: pqm at pqm.ubuntu.com-20081104203753-tr3wp885v5p7ccpc
    committer: John Arbash Meinel <john at arbash-meinel.com>
    branch nick: add_build_release
    timestamp: Thu 2008-11-06 12:17:45 -0600
    message:
      Add the win32 build_release script into tools.
    added:
      tools/win32/build_release.py   build_release.py-20081105204355-2ghh5cv01v1x4rzz-1
=== added file 'tools/win32/build_release.py'
--- a/tools/win32/build_release.py	1970-01-01 00:00:00 +0000
+++ b/tools/win32/build_release.py	2008-11-06 18:17:45 +0000
@@ -0,0 +1,206 @@
+#!/cygdrive/C/Python25/python
+"""A script to help automate the build process."""
+
+# When preparing a new release, make sure to set all of these to the latest
+# values.
+VERSIONS = {
+    'bzr': '1.9',
+    'qbzr': '0.9.5',
+    'bzrtools': '1.9.1',
+    'bzr-svn': '0.4.14',
+}
+
+# This will be passed to 'make' to ensure we build with the right python
+PYTHON='/cygdrive/c/Python25/python'
+
+# Create the final build in this directory
+TARGET_ROOT='release'
+
+DEBUG_SUBPROCESS = True
+
+
+import os
+import shutil
+import subprocess
+import sys
+
+
+BZR_EXE = None
+def bzr():
+    global BZR_EXE
+    if BZR_EXE is not None:
+        return BZR_EXE
+    try:
+        subprocess.call(['bzr', '--version'], stdout=subprocess.PIPE,
+                        stderr=subprocess.PIPE)
+        BZR_EXE = 'bzr'
+    except OSError:
+        try:
+            subprocess.call(['bzr.bat', '--version'], stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE)
+            BZR_EXE = 'bzr.bat'
+        except OSError:
+            raise RuntimeError('Could not find bzr or bzr.bat on your path.')
+    return BZR_EXE
+
+
+def call_or_fail(*args, **kwargs):
+    """Call a subprocess, and fail if the return code is not 0."""
+    if DEBUG_SUBPROCESS:
+        print '  calling: "%s"' % (' '.join(args[0]),)
+    p = subprocess.Popen(*args, **kwargs)
+    (out, err) = p.communicate()
+    if p.returncode != 0:
+        raise RuntimeError('Failed to run: %s, %s' % (args, kwargs))
+    return out
+
+
+TARGET = None
+def get_target():
+    global TARGET
+    if TARGET is not None:
+        return TARGET
+    out = call_or_fail([sys.executable, get_bzr_dir() + '/bzr',
+                        'version', '--short'], stdout=subprocess.PIPE)
+    version = out.strip()
+    TARGET = os.path.abspath(TARGET_ROOT + '-' + version)
+    return TARGET
+
+
+def clean_target():
+    """Nuke the target directory so we know we are starting from scratch."""
+    target = get_target()
+    if os.path.isdir(target):
+        print "Deleting: %s" % (target,)
+        shutil.rmtree(target)
+
+def get_bzr_dir():
+    return 'bzr.' + VERSIONS['bzr']
+
+
+def update_bzr():
+    """Make sure we have the latest bzr in play."""
+    bzr_dir = get_bzr_dir()
+    if not os.path.isdir(bzr_dir):
+        bzr_version = VERSIONS['bzr']
+        bzr_url = 'http://bazaar-vcs.org/bzr/bzr' + bzr_version
+        print "Getting bzr release %s from %s" % (bzr_version, bzr_url)
+        call_or_fail([bzr(), 'co', bzr_url])
+    else:
+        print "Ensuring %s is up-to-date" % (bzr_dir,)
+        call_or_fail([bzr(), 'update', bzr_dir])
+
+
+def create_target():
+    target = get_target()
+    print "Creating target dir: %s" % (target,)
+    call_or_fail([bzr(), 'co', get_bzr_dir(), target])
+
+
+def get_plugin_trunk_dir(plugin_name):
+    return '%s/trunk' % (plugin_name,)
+
+
+def get_plugin_release_dir(plugin_name):
+    return '%s/%s' % (plugin_name, VERSIONS[plugin_name])
+
+
+def get_plugin_trunk_branch(plugin_name):
+    if plugin_name == 'bzr-svn':
+        # For some reason bzr-svn doesn't have the latest tags on its 'trunk'
+        # branch, but only exist in the 0.4 releases.
+        return 'lp:bzr-svn/0.4'
+    return 'lp:%s' % (plugin_name,)
+
+
+def update_plugin_trunk(plugin_name):
+    trunk_dir = get_plugin_trunk_dir(plugin_name)
+    if not os.path.isdir(trunk_dir):
+        plugin_trunk = get_plugin_trunk_branch()
+        print "Getting latest %s trunk" % (plugin_name,)
+        call_or_fail([bzr(), 'co', plugin_trunk,
+                      trunk_dir])
+    else:
+        print "Ensuring %s is up-to-date" % (trunk_dir,)
+        call_or_fail([bzr(), 'update', trunk_dir])
+    return trunk_dir
+
+
+def _plugin_tag_name(plugin_name):
+    if plugin_name == 'bzr-svn':
+        return 'bzr-svn-' + VERSIONS['bzr-svn']
+    # bzrtools and qbzr use 'release-X.Y.Z'
+    return 'release-' + VERSIONS[plugin_name]
+
+
+def update_plugin(plugin_name):
+    release_dir = get_plugin_release_dir(plugin_name)
+    if not os.path.isdir(plugin_name):
+        if plugin_name == 'bzr-svn':
+            # bzr-svn uses a different repo format
+            call_or_fail([bzr(), 'init-repo', '--rich-root-pack', plugin_name])
+        else:
+            os.mkdir(plugin_name)
+    if os.path.isdir(release_dir):
+        print "Removing existing dir: %s" % (release_dir,)
+        shutil.rmtree(release_dir)
+    # First update trunk
+    trunk_dir = update_plugin_trunk(plugin_name)
+    # Now create the tagged directory
+    tag_name = _plugin_tag_name(plugin_name)
+    print "Creating the branch %s" % (release_dir,)
+    call_or_fail([bzr(), 'co', '-rtag:%s' % (tag_name,),
+                  trunk_dir, release_dir])
+    return release_dir
+
+
+def install_plugin(plugin_name):
+    release_dir = update_plugin(plugin_name)
+    # at least bzrtools doesn't like you to call 'setup.py' unless you are in
+    # that directory specifically, so we cd, rather than calling it from
+    # outside
+    print "Installing %s" % (release_dir,)
+    call_or_fail([sys.executable, 'setup.py', 'install', '-O1',
+                  '--install-lib=%s' % (get_target(),)],
+                 cwd=release_dir)
+
+
+def update_tbzr():
+    tbzr_loc = os.environ.get('TBZR', None)
+    if tbzr_loc is None:
+        raise ValueError('You must set TBZR to the location of tortoisebzr.')
+    print 'Updating %s' % (tbzr_loc,)
+    call_or_fail([bzr(), 'update', tbzr_loc])
+
+
+def build_installer():
+    target = get_target()
+    print
+    print
+    print '*' * 60
+    print 'Building standalone installer'
+    call_or_fail(['make', 'PYTHON=%s' % (PYTHON,), 'installer'],
+                 cwd=target)
+
+
+def main(args):
+    import optparse
+
+    p = optparse.OptionParser(usage='%prog [OPTIONS]')
+    opts, args = p.parse_args(args)
+
+    update_bzr()
+    update_tbzr()
+    clean_target()
+    create_target()
+    install_plugin('bzrtools')
+    install_plugin('qbzr')
+    install_plugin('bzr-svn')
+
+    build_installer()
+
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
+
+# vim: ts=4 sw=4 sts=4 et ai




More information about the bazaar-commits mailing list