sbin/create_python_env.py
changeset 31 a727d83c8f88
child 32 e28089cee66c
--- /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()
+