# HG changeset patch # User ymh # Date 1274807171 -7200 # Node ID a727d83c8f8805cb4092513cef69618b5142c584 # Parent 239f9bcae806640dbe2c729012c723e5d1a9d062 add create_python_env file diff -r 239f9bcae806 -r a727d83c8f88 sbin/create_python_env.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/create_python_env.py Tue May 25 19:06:11 2010 +0200 @@ -0,0 +1,126 @@ +""" +Call this like ``python fassembler/create-venv-script.py``; it will +refresh the fassembler-boot.py script +""" +import os +import subprocess +import re + +here = os.path.dirname(os.path.abspath(__file__)) +base_dir = os.path.dirname(here) +script_name = os.path.join(base_dir, 'blinkster-boot.py') + +import virtualenv + +# things to install +# - psycopg2 +# - PIL +# - pylucene +# - pyxml +# - 4Suite-xml + + +EXTRA_TEXT = """ +FASS_SVN_LOCATION = '/'.join('$HeadURL: $'[len('HeadURL')+2:-1].strip().split('/')[:-1]) +if not FASS_SVN_LOCATION: + # Happens when this is trunk + FASS_SVN_LOCATION = 'https://svn.openplans.org/svn/fassembler/trunk' + +import shutil + +def extend_parser(parser): + parser.add_option( + '--svn', + metavar='DIR_OR_URL', + dest='fassembler_svn', + default=FASS_SVN_LOCATION, + help='Location of a svn directory or URL to use for the installation of fassembler') + +def adjust_options(options, args): + if not args: + return # caller will raise error + + # We're actually going to build the venv in a subdirectory + base_dir = args[0] + args[0] = join(base_dir, 'fassembler') + +def after_install(options, home_dir): + base_dir = os.path.dirname(home_dir) + src_dir = join(home_dir, 'src') + fassembler_svn = options.fassembler_svn + if os.path.exists(fassembler_svn): + # A directory + logger.debug('Using svn checkout in directory %s' % fassembler_svn) + fassembler_dir = os.path.abspath(fassembler_svn) + logger.info('Using existing svn checkout at %s' % fassembler_dir) + else: + fassembler_dir = join(src_dir, 'fassembler') + logger.notify('Installing fassembler from %s to %s' % (fassembler_svn, fassembler_dir)) + fs_ensure_dir(src_dir) + call_subprocess(['svn', 'checkout', '--quiet', fassembler_svn, fassembler_dir], + show_stdout=True) + logger.indent += 2 + try: + call_subprocess([os.path.abspath(join(home_dir, 'bin', 'easy_install')), '-f', 'https://svn.openplans.org/eggs', 'mysql-python'], + cwd=os.path.abspath(fassembler_dir), + filter_stdout=filter_python_develop, + show_stdout=False) + call_subprocess([os.path.abspath(join(home_dir, 'bin', 'python')), 'setup.py', 'develop'], + cwd=os.path.abspath(fassembler_dir), + filter_stdout=filter_python_develop, + show_stdout=False) + finally: + logger.indent -= 2 + script_dir = join(base_dir, 'bin') + script_dest = join(script_dir, 'fassembler') + logger.notify('Copying fassembler to %s' % script_dest) + fs_ensure_dir(script_dir) + os.symlink('../fassembler/bin/fassembler', script_dest) + etc_dir = join(base_dir, 'etc') + build_ini = join(etc_dir, 'build.ini') + if not os.path.exists(build_ini): + fs_ensure_dir(etc_dir) + logger.notify('Touching %s' % build_ini) + f = open(build_ini, 'w') + f.close() + logger.notify('Run "%s fassembler:topp" (etc) to build out the environment' + % script_dest) + logger.notify('Run "%s Package" to install new packages that provide builds' + % join(home_dir, 'bin', 'easy_install')) + +def fs_ensure_dir(dir): + if not os.path.exists(dir): + logger.info('Creating directory %s' % dir) + os.makedirs(dir) + +def filter_python_develop(line): + if not line.strip(): + return Logger.DEBUG + for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ', + 'Moving ', 'Adding ', 'running ', 'writing ', 'Creating ', + 'creating ', 'Copying ']: + if line.startswith(prefix): + return Logger.DEBUG + return Logger.NOTIFY +""" + +def main(): + text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version='2.4') + if os.path.exists(script_name): + f = open(script_name) + cur_text = f.read() + f.close() + else: + cur_text = '' + print 'Updating %s' % script_name + if cur_text == 'text': + print 'No update' + else: + print 'Script changed; updating...' + f = open(script_name, 'w') + f.write(text) + f.close() + +if __name__ == '__main__': + main() +