sbin/create_python_env.py
author ymh <ymh.work@gmail.com>
Tue, 25 May 2010 19:06:11 +0200
changeset 31 a727d83c8f88
child 32 e28089cee66c
permissions -rw-r--r--
add create_python_env file
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
"""
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
Call this like ``python fassembler/create-venv-script.py``; it will
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
refresh the fassembler-boot.py script
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
"""
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
import os
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
import subprocess
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
import re
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
here = os.path.dirname(os.path.abspath(__file__))
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
base_dir = os.path.dirname(here)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
script_name = os.path.join(base_dir, 'blinkster-boot.py')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
import virtualenv
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
# things to install
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
# - psycopg2
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
# - PIL
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
# - pylucene
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
# - pyxml
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
# - 4Suite-xml
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
EXTRA_TEXT = """
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
FASS_SVN_LOCATION = '/'.join('$HeadURL: $'[len('HeadURL')+2:-1].strip().split('/')[:-1])
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
if not FASS_SVN_LOCATION:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    # Happens when this is trunk
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    FASS_SVN_LOCATION = 'https://svn.openplans.org/svn/fassembler/trunk'
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
import shutil
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
def extend_parser(parser):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    parser.add_option(
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        '--svn',
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        metavar='DIR_OR_URL',
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        dest='fassembler_svn',
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        default=FASS_SVN_LOCATION,
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        help='Location of a svn directory or URL to use for the installation of fassembler')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
def adjust_options(options, args):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    if not args:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        return # caller will raise error
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    # We're actually going to build the venv in a subdirectory
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    base_dir = args[0]
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    args[0] = join(base_dir, 'fassembler')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
def after_install(options, home_dir):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    base_dir = os.path.dirname(home_dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    src_dir = join(home_dir, 'src')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    fassembler_svn = options.fassembler_svn
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    if os.path.exists(fassembler_svn):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        # A directory
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        logger.debug('Using svn checkout in directory %s' % fassembler_svn)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        fassembler_dir = os.path.abspath(fassembler_svn)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        logger.info('Using existing svn checkout at %s' % fassembler_dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    else:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        fassembler_dir = join(src_dir, 'fassembler')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        logger.notify('Installing fassembler from %s to %s' % (fassembler_svn, fassembler_dir))
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        fs_ensure_dir(src_dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        call_subprocess(['svn', 'checkout', '--quiet', fassembler_svn, fassembler_dir],
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
                        show_stdout=True)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    logger.indent += 2
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    try:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        call_subprocess([os.path.abspath(join(home_dir, 'bin', 'easy_install')), '-f', 'https://svn.openplans.org/eggs', 'mysql-python'],
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
                        cwd=os.path.abspath(fassembler_dir),
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
                        filter_stdout=filter_python_develop,
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
                        show_stdout=False)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        call_subprocess([os.path.abspath(join(home_dir, 'bin', 'python')), 'setup.py', 'develop'],
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
                        cwd=os.path.abspath(fassembler_dir),
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
                        filter_stdout=filter_python_develop,
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
                        show_stdout=False)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    finally:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        logger.indent -= 2
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    script_dir = join(base_dir, 'bin')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    script_dest = join(script_dir, 'fassembler')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    logger.notify('Copying fassembler to %s' % script_dest)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    fs_ensure_dir(script_dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    os.symlink('../fassembler/bin/fassembler', script_dest)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    etc_dir = join(base_dir, 'etc')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    build_ini = join(etc_dir, 'build.ini')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    if not os.path.exists(build_ini):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        fs_ensure_dir(etc_dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        logger.notify('Touching %s' % build_ini)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        f = open(build_ini, 'w')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        f.close()
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    logger.notify('Run "%s fassembler:topp" (etc) to build out the environment'
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                  % script_dest)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    logger.notify('Run "%s Package" to install new packages that provide builds'
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
                  % join(home_dir, 'bin', 'easy_install'))
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
def fs_ensure_dir(dir):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    if not os.path.exists(dir):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        logger.info('Creating directory %s' % dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        os.makedirs(dir)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
def filter_python_develop(line):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    if not line.strip():
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        return Logger.DEBUG
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ',
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
                   'Moving ', 'Adding ', 'running ', 'writing ', 'Creating ',
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
                   'creating ', 'Copying ']:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        if line.startswith(prefix):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            return Logger.DEBUG
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    return Logger.NOTIFY
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
"""
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
def main():
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version='2.4')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    if os.path.exists(script_name):
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        f = open(script_name)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        cur_text = f.read()
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        f.close()
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    else:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        cur_text = ''
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    print 'Updating %s' % script_name
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    if cur_text == 'text':
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        print 'No update'
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    else:
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        print 'Script changed; updating...'
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        f = open(script_name, 'w')
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        f.write(text)
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        f.close()
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
if __name__ == '__main__':
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    main()
a727d83c8f88 add create_python_env file
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126