~bzr-pqm/bzr/bzr.dev

1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
1
#!/usr/bin/env python
2
"""\
3
This script runs after rsyncing bzr.
4
It checks the bzr version, and sees if there is a tarball and
5
zipfile that exist with that version.
6
If not, it creates them.
7
"""
8
9
import os, sys, tempfile
10
11
def sync(remote, local, verbose=False):
12
	"""Do the actual synchronization
13
	"""
14
	if verbose:
15
		status = os.system('rsync -av --delete "%s" "%s"' % (remote, local))
16
	else:
17
		status = os.system('rsync -a --delete "%s" "%s"' % (remote, local))
18
	return status==0
19
20
def create_tar_gz(local_dir, output_dir=None, verbose=False):
21
	import tarfile, bzrlib
22
	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
23
	final_path = os.path.join(output_dir, out_name + '.tar.gz')
24
	if os.path.exists(final_path):
25
		if verbose:
26
			print 'Output file already exists: %r' % final_path
27
		return
28
	fn, tmp_path=tempfile.mkstemp(suffix='.tar', prefix=out_name, dir=output_dir)
29
	os.close(fn)
30
	try:
31
		if verbose:
32
			print 'Creating %r (%r)' % (final_path, tmp_path)
33
		tar = tarfile.TarFile(name=tmp_path, mode='w')
34
		tar.add(local_dir, arcname=out_name, recursive=True)
35
		tar.close()
36
37
		if verbose:
38
			print 'Compressing...'
39
		if os.system('gzip "%s"' % tmp_path) != 0:
40
			raise ValueError('Failed to compress')
41
		tmp_path += '.gz'
42
                os.chmod(tmp_path, 0644)
43
		os.rename(tmp_path, final_path)
44
	except:
45
		os.remove(tmp_path)
46
		raise
47
48
def create_tar_bz2(local_dir, output_dir=None, verbose=False):
49
	import tarfile, bzrlib
50
	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
51
	final_path = os.path.join(output_dir, out_name + '.tar.bz2')
52
	if os.path.exists(final_path):
53
		if verbose:
54
			print 'Output file already exists: %r' % final_path
55
		return
56
	fn, tmp_path=tempfile.mkstemp(suffix='.tar', prefix=out_name, dir=output_dir)
57
	os.close(fn)
58
	try:
59
		if verbose:
60
			print 'Creating %r (%r)' % (final_path, tmp_path)
61
		tar = tarfile.TarFile(name=tmp_path, mode='w')
62
		tar.add(local_dir, arcname=out_name, recursive=True)
63
		tar.close()
64
65
		if verbose:
66
			print 'Compressing...'
67
		if os.system('bzip2 "%s"' % tmp_path) != 0:
68
			raise ValueError('Failed to compress')
69
		tmp_path += '.bz2'
70
                os.chmod(tmp_path, 0644)
71
		os.rename(tmp_path, final_path)
72
	except:
73
		os.remove(tmp_path)
74
		raise
75
76
def create_zip(local_dir, output_dir=None, verbose=False):
77
	import zipfile, bzrlib
78
	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
79
	final_path = os.path.join(output_dir, out_name + '.zip')
80
	if os.path.exists(final_path):
81
		if verbose:
82
			print 'Output file already exists: %r' % final_path
83
		return
84
	fn, tmp_path=tempfile.mkstemp(suffix='.zip', prefix=out_name, dir=output_dir)
85
	os.close(fn)
86
	try:
87
		if verbose:
88
			print 'Creating %r (%r)' % (final_path, tmp_path)
89
		zip = zipfile.ZipFile(file=tmp_path, mode='w')
90
		try:
91
			for root, dirs, files in os.walk(local_dir):
92
				for f in files:
93
					path = os.path.join(root, f)
94
					arcname = os.path.join(out_name, path[len(local_dir)+1:])
95
					zip.write(path, arcname=arcname)
96
		finally:
97
			zip.close()
98
99
                os.chmod(tmp_path, 0644)
100
		os.rename(tmp_path, final_path)
101
	except:
102
		os.remove(tmp_path)
103
		raise
104
105
def get_local_dir(remote, local):
106
	"""This returns the full path to the local directory where 
107
	the files are kept.
108
109
	rsync has the trick that if the source directory ends in a '/' then
110
	the file will be copied *into* the target. If it does not end in a slash,
111
	then the directory will be added into the target.
112
	"""
113
	if remote[-1:] == '/':
114
		return local
115
	# rsync paths are typically user@host:path/to/something
116
	# the reason for the split(':') is in case path doesn't contain a slash
117
	extra = remote.split(':')[-1].split('/')[-1]
118
	return os.path.join(local, extra)
119
120
def get_output_dir(output, local):
121
	if output:
122
		return output
123
	return os.path.dirname(os.path.realpath(local))
124
125
126
def main(args):
127
	import optparse
128
	p = optparse.OptionParser(usage='%prog [options] [remote] [local]'
129
		'\n  rsync the remote repository to the local directory'
130
		'\n  if remote is not given, it defaults to "bazaar-ng.org::bazaar-ng/bzr/bzr.dev"'
131
		'\n  if local is not given it defaults to "."')
132
133
        p.add_option('--verbose', action='store_true'
134
                , help="Describe the process")
135
	p.add_option('--no-tar-gz', action='store_false', dest='create_tar_gz', default=True
136
		, help="Don't create a gzip compressed tarfile.")
137
	p.add_option('--no-tar-bz2', action='store_false', dest='create_tar_bz2', default=True
138
		, help="Don't create a bzip2 compressed tarfile.")
139
	p.add_option('--no-zip', action='store_false', dest='create_zip', default=True
140
		, help="Don't create a zipfile.")
141
	p.add_option('--output-dir', default=None
142
		, help="Set the output location, default is just above the final local directory.")
143
144
145
	(opts, args) = p.parse_args(args)
146
147
	if len(args) < 1:
148
		remote = 'bazaar-ng.org::bazaar-ng/bzr/bzr.dev'
149
	else:
150
		remote = args[0]
151
	if len(args) < 2:
152
		local = '.'
153
	else:
154
		local = args[1]
155
	if len(args) > 2:
156
		print 'Invalid number of arguments, see --help for details.'
157
158
	if not sync(remote, local, verbose=opts.verbose):
159
		if opts.verbose:
160
			print '** rsync failed'
161
		return 1
162
	# Now we have the new update
163
	local_dir = get_local_dir(remote, local)
164
165
	output_dir = get_output_dir(opts.output_dir, local_dir)
166
	if opts.create_tar_gz:
167
		create_tar_gz(local_dir, output_dir=output_dir, verbose=opts.verbose)
168
	if opts.create_tar_bz2:
169
		create_tar_bz2(local_dir, output_dir=output_dir, verbose=opts.verbose)
170
	if opts.create_zip:
171
		create_zip(local_dir, output_dir=output_dir, verbose=opts.verbose)
172
173
	return 0
174
		
175
if __name__ == '__main__':
176
	sys.exit(main(sys.argv[1:]))
177