3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
1 |
#!/cygdrive/C/Python25/python
|
2 |
"""A script to help automate the build process."""
|
|
3 |
||
4 |
# When preparing a new release, make sure to set all of these to the latest
|
|
5 |
# values.
|
|
6 |
VERSIONS = { |
|
4454.1.1
by John Arbash Meinel
Update to new versions of all packaging |
7 |
'bzr': '1.16', |
8 |
'qbzr': '0.11.0', |
|
9 |
'bzrtools': '1.16.0', |
|
10 |
'bzr-svn': '0.6.1', |
|
11 |
'bzr-rebase': '0.5.0', |
|
12 |
'subvertpy': '0.6.7', |
|
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
13 |
}
|
14 |
||
15 |
# This will be passed to 'make' to ensure we build with the right python
|
|
16 |
PYTHON='/cygdrive/c/Python25/python' |
|
17 |
||
18 |
# Create the final build in this directory
|
|
19 |
TARGET_ROOT='release' |
|
20 |
||
21 |
DEBUG_SUBPROCESS = True |
|
22 |
||
23 |
||
24 |
import os |
|
25 |
import shutil |
|
26 |
import subprocess |
|
27 |
import sys |
|
28 |
||
29 |
||
30 |
BZR_EXE = None |
|
31 |
def bzr(): |
|
32 |
global BZR_EXE |
|
33 |
if BZR_EXE is not None: |
|
34 |
return BZR_EXE |
|
35 |
try: |
|
36 |
subprocess.call(['bzr', '--version'], stdout=subprocess.PIPE, |
|
37 |
stderr=subprocess.PIPE) |
|
38 |
BZR_EXE = 'bzr' |
|
39 |
except OSError: |
|
40 |
try: |
|
41 |
subprocess.call(['bzr.bat', '--version'], stdout=subprocess.PIPE, |
|
42 |
stderr=subprocess.PIPE) |
|
43 |
BZR_EXE = 'bzr.bat' |
|
44 |
except OSError: |
|
45 |
raise RuntimeError('Could not find bzr or bzr.bat on your path.') |
|
46 |
return BZR_EXE |
|
47 |
||
48 |
||
49 |
def call_or_fail(*args, **kwargs): |
|
50 |
"""Call a subprocess, and fail if the return code is not 0."""
|
|
51 |
if DEBUG_SUBPROCESS: |
|
52 |
print ' calling: "%s"' % (' '.join(args[0]),) |
|
53 |
p = subprocess.Popen(*args, **kwargs) |
|
54 |
(out, err) = p.communicate() |
|
55 |
if p.returncode != 0: |
|
56 |
raise RuntimeError('Failed to run: %s, %s' % (args, kwargs)) |
|
57 |
return out |
|
58 |
||
59 |
||
60 |
TARGET = None |
|
61 |
def get_target(): |
|
62 |
global TARGET |
|
63 |
if TARGET is not None: |
|
64 |
return TARGET |
|
65 |
out = call_or_fail([sys.executable, get_bzr_dir() + '/bzr', |
|
66 |
'version', '--short'], stdout=subprocess.PIPE) |
|
67 |
version = out.strip() |
|
68 |
TARGET = os.path.abspath(TARGET_ROOT + '-' + version) |
|
69 |
return TARGET |
|
70 |
||
71 |
||
72 |
def clean_target(): |
|
73 |
"""Nuke the target directory so we know we are starting from scratch."""
|
|
74 |
target = get_target() |
|
75 |
if os.path.isdir(target): |
|
76 |
print "Deleting: %s" % (target,) |
|
77 |
shutil.rmtree(target) |
|
78 |
||
79 |
def get_bzr_dir(): |
|
80 |
return 'bzr.' + VERSIONS['bzr'] |
|
81 |
||
82 |
||
83 |
def update_bzr(): |
|
84 |
"""Make sure we have the latest bzr in play."""
|
|
85 |
bzr_dir = get_bzr_dir() |
|
86 |
if not os.path.isdir(bzr_dir): |
|
87 |
bzr_version = VERSIONS['bzr'] |
|
3923.2.3
by John Arbash Meinel
VERSIONS for the 1.11rc1 win32 installer. |
88 |
bzr_url = 'http://bazaar-vcs.org/bzr/bzr.' + bzr_version |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
89 |
print "Getting bzr release %s from %s" % (bzr_version, bzr_url) |
90 |
call_or_fail([bzr(), 'co', bzr_url]) |
|
91 |
else: |
|
92 |
print "Ensuring %s is up-to-date" % (bzr_dir,) |
|
93 |
call_or_fail([bzr(), 'update', bzr_dir]) |
|
94 |
||
95 |
||
96 |
def create_target(): |
|
97 |
target = get_target() |
|
98 |
print "Creating target dir: %s" % (target,) |
|
99 |
call_or_fail([bzr(), 'co', get_bzr_dir(), target]) |
|
100 |
||
101 |
||
102 |
def get_plugin_trunk_dir(plugin_name): |
|
103 |
return '%s/trunk' % (plugin_name,) |
|
104 |
||
105 |
||
106 |
def get_plugin_release_dir(plugin_name): |
|
107 |
return '%s/%s' % (plugin_name, VERSIONS[plugin_name]) |
|
108 |
||
109 |
||
110 |
def get_plugin_trunk_branch(plugin_name): |
|
111 |
return 'lp:%s' % (plugin_name,) |
|
112 |
||
113 |
||
114 |
def update_plugin_trunk(plugin_name): |
|
115 |
trunk_dir = get_plugin_trunk_dir(plugin_name) |
|
116 |
if not os.path.isdir(trunk_dir): |
|
3915.2.1
by John Arbash Meinel
Fix up bits of the build_release script. |
117 |
plugin_trunk = get_plugin_trunk_branch(plugin_name) |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
118 |
print "Getting latest %s trunk" % (plugin_name,) |
119 |
call_or_fail([bzr(), 'co', plugin_trunk, |
|
120 |
trunk_dir]) |
|
121 |
else: |
|
122 |
print "Ensuring %s is up-to-date" % (trunk_dir,) |
|
123 |
call_or_fail([bzr(), 'update', trunk_dir]) |
|
124 |
return trunk_dir |
|
125 |
||
126 |
||
127 |
def _plugin_tag_name(plugin_name): |
|
4062.3.1
by Jelmer Vernooij
Provide bzr-rebase in the windows installer. |
128 |
if plugin_name in ('bzr-svn', 'bzr-rebase', 'subvertpy'): |
3995.6.2
by John Arbash Meinel
Update build_release for bzr-svn 0.5.0 which now requires subvertpy |
129 |
return '%s-%s' % (plugin_name, VERSIONS[plugin_name]) |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
130 |
# bzrtools and qbzr use 'release-X.Y.Z'
|
131 |
return 'release-' + VERSIONS[plugin_name] |
|
132 |
||
133 |
||
134 |
def update_plugin(plugin_name): |
|
135 |
release_dir = get_plugin_release_dir(plugin_name) |
|
136 |
if not os.path.isdir(plugin_name): |
|
4062.3.1
by Jelmer Vernooij
Provide bzr-rebase in the windows installer. |
137 |
if plugin_name in ('bzr-svn', 'bzr-rebase'): |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
138 |
# bzr-svn uses a different repo format
|
139 |
call_or_fail([bzr(), 'init-repo', '--rich-root-pack', plugin_name]) |
|
140 |
else: |
|
141 |
os.mkdir(plugin_name) |
|
142 |
if os.path.isdir(release_dir): |
|
143 |
print "Removing existing dir: %s" % (release_dir,) |
|
144 |
shutil.rmtree(release_dir) |
|
145 |
# First update trunk
|
|
146 |
trunk_dir = update_plugin_trunk(plugin_name) |
|
147 |
# Now create the tagged directory
|
|
148 |
tag_name = _plugin_tag_name(plugin_name) |
|
149 |
print "Creating the branch %s" % (release_dir,) |
|
150 |
call_or_fail([bzr(), 'co', '-rtag:%s' % (tag_name,), |
|
151 |
trunk_dir, release_dir]) |
|
152 |
return release_dir |
|
153 |
||
154 |
||
155 |
def install_plugin(plugin_name): |
|
156 |
release_dir = update_plugin(plugin_name) |
|
157 |
# at least bzrtools doesn't like you to call 'setup.py' unless you are in
|
|
158 |
# that directory specifically, so we cd, rather than calling it from
|
|
159 |
# outside
|
|
160 |
print "Installing %s" % (release_dir,) |
|
161 |
call_or_fail([sys.executable, 'setup.py', 'install', '-O1', |
|
162 |
'--install-lib=%s' % (get_target(),)], |
|
163 |
cwd=release_dir) |
|
164 |
||
165 |
||
166 |
def update_tbzr(): |
|
167 |
tbzr_loc = os.environ.get('TBZR', None) |
|
168 |
if tbzr_loc is None: |
|
169 |
raise ValueError('You must set TBZR to the location of tortoisebzr.') |
|
170 |
print 'Updating %s' % (tbzr_loc,) |
|
171 |
call_or_fail([bzr(), 'update', tbzr_loc]) |
|
172 |
||
173 |
||
174 |
def build_installer(): |
|
175 |
target = get_target() |
|
176 |
print
|
|
177 |
print
|
|
178 |
print '*' * 60 |
|
179 |
print 'Building standalone installer' |
|
180 |
call_or_fail(['make', 'PYTHON=%s' % (PYTHON,), 'installer'], |
|
181 |
cwd=target) |
|
182 |
||
183 |
||
184 |
def main(args): |
|
185 |
import optparse |
|
186 |
||
187 |
p = optparse.OptionParser(usage='%prog [OPTIONS]') |
|
188 |
opts, args = p.parse_args(args) |
|
189 |
||
190 |
update_bzr() |
|
191 |
update_tbzr() |
|
192 |
clean_target() |
|
193 |
create_target() |
|
3995.6.2
by John Arbash Meinel
Update build_release for bzr-svn 0.5.0 which now requires subvertpy |
194 |
install_plugin('subvertpy') |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
195 |
install_plugin('bzrtools') |
196 |
install_plugin('qbzr') |
|
197 |
install_plugin('bzr-svn') |
|
4062.3.1
by Jelmer Vernooij
Provide bzr-rebase in the windows installer. |
198 |
install_plugin('bzr-rebase') |
3823.4.1
by John Arbash Meinel
Add the win32 build_release script into tools. |
199 |
|
200 |
build_installer() |
|
201 |
||
202 |
||
203 |
if __name__ == '__main__': |
|
204 |
main(sys.argv[1:]) |
|
205 |
||
206 |
# vim: ts=4 sw=4 sts=4 et ai
|