#!/usr/bin/env python2.4
""" 
Automatically create CTL4j releases and upload them. 

Copyright 2006 Boris Buegling
"""

# Configuration #
deps = 'junit.jar jsch-20050301.jar dns_sd.jar bcel-5.1.jar chiffre-classes.jar classes.jar java-getopt-1.0.12.jar'
#################

import ncos, os, pprint, sys
from shutil import copy, copytree, rmtree
from tempfile import mkdtemp
from zipfile import ZipFile

def add2zip (zf, dir, files):
	for fname in files:
		fname = os.path.join(dir, fname)
		fname2 = '/'.join(fname.split('/')[3:])
		if not os.path.isdir(fname):
			zf.write(fname, fname2)

def create_bigass_jar ():
	jars = [find_jar(dep) for dep in deps.split(' ')]
	#pprint.pprint(jars)
	tmp = mkdtemp()
	try:
		# Unpack dependency jars and copy CTL4j
		for jar in jars:
			if jar:
				unjar(jar, basedir=tmp)
		for dir in os.listdir('build'):
			fname = os.path.join('build', dir)
			if os.path.isdir(fname):
				copytree(fname, os.path.join(tmp, dir), True)
		# Remove some crap
		for path in ['stylesheet.css']:
			os.unlink(os.path.join(tmp, path))
		for path in ['tabellen', 'META-INF', 'javadoc']:
			rmtree(os.path.join(tmp, path))
		# Zip the new jar
		zf = ZipFile('build/CTL4j.jar', 'w')
		os.path.walk(tmp, add2zip, zf)
		zf.close()
	except Exception, e:
		print >>sys.stderr, 'JAR creation failed: %s' % e
	#print '\n'.join(os.listdir(tmp))
	#print ncos.cmd(['du', '-sh', tmp])
	rmtree(tmp)

def create_dirs (name, basedir='/tmp/'):
	if not name:
		return
	name = os.path.join(basedir, name)
	if not os.path.exists(name):
		create_dirs(os.path.dirname(name))
		os.mkdir(name)

def create_quickstart (name='CTL4j-quickstart.bin'):
	tmp = mkdtemp()
	try:
		for fname in ['build/CTL4j.jar', 'src/Example.Server', 'data/run.sh']:
			copy(fname, tmp)
		cmd = ['tar', 'cfz', 'foobar.tgz'] + os.listdir(tmp)
		ncos.cmd(cmd, workdir=tmp)
		out = file('build/%s' % name, 'w')
		out.write("""# CTL4j quickstart, type 'sh %s' to run it.
#!/bin/sh

start=`grep --binary-files=text -n '^__LET_THERE_BE_DRAGONS__$' $0|cut -d: -f-1`
sed -n "`expr $start + 1`,`cat $0|wc -l` p" $0|tar xvfz - #>/dev/null 2>&1

if [ -z "$1" ]
then
	echo "Welcome to the CTL4j..."
	./run.sh
	echo -e "\\nIf any errors occurred, refer to the CTL4j documentation."
fi

exit 0
__LET_THERE_BE_DRAGONS__\n""" % name)
		inp = file(os.path.join(tmp, 'foobar.tgz'))
		out.write(inp.read())
		inp.close()
		out.close()
		os.chmod('build/%s' % name, 0755)
	except Exception, e:
		print >>sys.stderr, 'BIN creation failed: %s' % e
	#print '\n'.join(os.listdir(tmp))
	#print ncos.cmd(['du', '-sh', tmp])
	rmtree(tmp)

def find_jar (name):
	for path in os.listdir('lib'):
		if os.path.basename(path) == name:
			return '%s/lib/%s' % (os.getenv('PWD'), path)
	classpath = os.getenv('CLASSPATH')
	if classpath:
	    for path in classpath.split(':'):
			if os.path.basename(path) == name:
				return path
	path = os.path.join('/System/Library/Java/Extensions/', name)
	if os.path.exists(path):
		return path

def unjar (jar, basedir='/tmp/'):
	zf = ZipFile(jar)
	dirs = [name for name in zf.namelist() if name.endswith('/')]
	dirs.sort()
	for dir in dirs:
		curdir = os.path.join(basedir, dir)
		if not os.path.exists(curdir):
			os.mkdir(curdir)
	for name in [name for name in zf.namelist() if not name.endswith('/')]:
		#print 'Extracting %s...' % name
		create_dirs(os.path.dirname(name), basedir=basedir)
		outfile = open(os.path.join(basedir, name), 'wb')
		outfile.write(zf.read(name))
		outfile.flush()
		outfile.close()

if __name__ == '__main__':
	create_bigass_jar()
	create_quickstart()
