[Pkg-bazaar-commits] ./bzr/unstable r621: - script to create rollups, from John

Martin Pool mbp at sourcefrog.net
Fri Apr 10 08:20:27 UTC 2009


------------------------------------------------------------
revno: 621
committer: Martin Pool <mbp at sourcefrog.net>
timestamp: Mon 2005-06-06 14:15:44 +1000
message:
  - script to create rollups, from John
added:
  contrib/create_bzr_rollup.py
-------------- next part --------------
=== added file 'contrib/create_bzr_rollup.py'
--- a/contrib/create_bzr_rollup.py	1970-01-01 00:00:00 +0000
+++ b/contrib/create_bzr_rollup.py	2005-06-06 04:15:44 +0000
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+"""\
+This script runs after rsyncing bzr.
+It checks the bzr version, and sees if there is a tarball and
+zipfile that exist with that version.
+If not, it creates them.
+"""
+
+import os, sys, tempfile
+
+def sync(remote, local, verbose=False):
+	"""Do the actual synchronization
+	"""
+	if verbose:
+		status = os.system('rsync -av --delete "%s" "%s"' % (remote, local))
+	else:
+		status = os.system('rsync -a --delete "%s" "%s"' % (remote, local))
+	return status==0
+
+def create_tar_gz(local_dir, output_dir=None, verbose=False):
+	import tarfile, bzrlib
+	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
+	final_path = os.path.join(output_dir, out_name + '.tar.gz')
+	if os.path.exists(final_path):
+		if verbose:
+			print 'Output file already exists: %r' % final_path
+		return
+	fn, tmp_path=tempfile.mkstemp(suffix='.tar', prefix=out_name, dir=output_dir)
+	os.close(fn)
+	try:
+		if verbose:
+			print 'Creating %r (%r)' % (final_path, tmp_path)
+		tar = tarfile.TarFile(name=tmp_path, mode='w')
+		tar.add(local_dir, arcname=out_name, recursive=True)
+		tar.close()
+
+		if verbose:
+			print 'Compressing...'
+		if os.system('gzip "%s"' % tmp_path) != 0:
+			raise ValueError('Failed to compress')
+		tmp_path += '.gz'
+		os.rename(tmp_path, final_path)
+	except:
+		os.remove(tmp_path)
+		raise
+
+def create_tar_bz2(local_dir, output_dir=None, verbose=False):
+	import tarfile, bzrlib
+	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
+	final_path = os.path.join(output_dir, out_name + '.tar.bz2')
+	if os.path.exists(final_path):
+		if verbose:
+			print 'Output file already exists: %r' % final_path
+		return
+	fn, tmp_path=tempfile.mkstemp(suffix='.tar', prefix=out_name, dir=output_dir)
+	os.close(fn)
+	try:
+		if verbose:
+			print 'Creating %r (%r)' % (final_path, tmp_path)
+		tar = tarfile.TarFile(name=tmp_path, mode='w')
+		tar.add(local_dir, arcname=out_name, recursive=True)
+		tar.close()
+
+		if verbose:
+			print 'Compressing...'
+		if os.system('bzip2 "%s"' % tmp_path) != 0:
+			raise ValueError('Failed to compress')
+		tmp_path += '.bz2'
+		os.rename(tmp_path, final_path)
+	except:
+		os.remove(tmp_path)
+		raise
+
+def create_zip(local_dir, output_dir=None, verbose=False):
+	import zipfile, bzrlib
+	out_name = os.path.basename(local_dir) + '-' + str(bzrlib.Branch(local_dir).revno())
+	final_path = os.path.join(output_dir, out_name + '.zip')
+	if os.path.exists(final_path):
+		if verbose:
+			print 'Output file already exists: %r' % final_path
+		return
+	fn, tmp_path=tempfile.mkstemp(suffix='.zip', prefix=out_name, dir=output_dir)
+	os.close(fn)
+	try:
+		if verbose:
+			print 'Creating %r (%r)' % (final_path, tmp_path)
+		zip = zipfile.ZipFile(file=tmp_path, mode='w')
+		try:
+			for root, dirs, files in os.walk(local_dir):
+				for f in files:
+					path = os.path.join(root, f)
+					arcname = os.path.join(out_name, path[len(local_dir)+1:])
+					zip.write(path, arcname=arcname)
+		finally:
+			zip.close()
+
+		os.rename(tmp_path, final_path)
+	except:
+		os.remove(tmp_path)
+		raise
+
+def get_local_dir(remote, local):
+	"""This returns the full path to the local directory where 
+	the files are kept.
+
+	rsync has the trick that if the source directory ends in a '/' then
+	the file will be copied *into* the target. If it does not end in a slash,
+	then the directory will be added into the target.
+	"""
+	if remote[-1:] == '/':
+		return local
+	# rsync paths are typically user at host:path/to/something
+	# the reason for the split(':') is in case path doesn't contain a slash
+	extra = remote.split(':')[-1].split('/')[-1]
+	return os.path.join(local, extra)
+
+def get_output_dir(output, local):
+	if output:
+		return output
+	return os.path.dirname(os.path.realpath(local))
+
+
+def main(args):
+	import optparse
+	p = optparse.OptionParser(usage='%prog [options] [remote] [local]'
+		'\n  rsync the remote repository to the local directory'
+		'\n  if remote is not given, it defaults to "bazaar-ng.org::bazaar-ng/bzr/bzr.dev"'
+		'\n  if local is not given it defaults to "."')
+
+        p.add_option('--verbose', action='store_true'
+                , help="Describe the process")
+	p.add_option('--no-tar-gz', action='store_false', dest='create_tar_gz', default=True
+		, help="Don't create a gzip compressed tarfile.")
+	p.add_option('--no-tar-bz2', action='store_false', dest='create_tar_bz2', default=True
+		, help="Don't create a bzip2 compressed tarfile.")
+	p.add_option('--no-zip', action='store_false', dest='create_zip', default=True
+		, help="Don't create a zipfile.")
+	p.add_option('--output-dir', default=None
+		, help="Set the output location, default is just above the final local directory.")
+
+
+	(opts, args) = p.parse_args(args)
+
+	if len(args) < 1:
+		remote = 'bazaar-ng.org::bazaar-ng/bzr/bzr.dev'
+	else:
+		remote = args[0]
+	if len(args) < 2:
+		local = '.'
+	else:
+		local = args[1]
+	if len(args) > 2:
+		print 'Invalid number of arguments, see --help for details.'
+
+	if not sync(remote, local, verbose=opts.verbose):
+		if opts.verbose:
+			print '** rsync failed'
+		return 1
+	# Now we have the new update
+	local_dir = get_local_dir(remote, local)
+
+	output_dir = get_output_dir(opts.output_dir, local_dir)
+	if opts.create_tar_gz:
+		create_tar_gz(local_dir, output_dir=output_dir, verbose=opts.verbose)
+	if opts.create_tar_bz2:
+		create_tar_bz2(local_dir, output_dir=output_dir, verbose=opts.verbose)
+	if opts.create_zip:
+		create_zip(local_dir, output_dir=output_dir, verbose=opts.verbose)
+
+	return 0
+		
+if __name__ == '__main__':
+	sys.exit(main(sys.argv[1:]))
+



More information about the Pkg-bazaar-commits mailing list