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