|
1 #!/usr/bin/env python |
|
2 # This Source Code Form is subject to the terms of the Mozilla Public |
|
3 # License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
|
5 |
|
6 """ |
|
7 This scripts sets up a virtualenv and installs TPS into it. |
|
8 It's probably best to specify a path NOT inside the repo, otherwise |
|
9 all the virtualenv files will show up in e.g. hg status. |
|
10 """ |
|
11 |
|
12 import optparse |
|
13 import os |
|
14 import shutil |
|
15 import subprocess |
|
16 import sys |
|
17 import urllib2 |
|
18 import zipfile |
|
19 |
|
20 |
|
21 here = os.path.dirname(os.path.abspath(__file__)) |
|
22 usage_message = """ |
|
23 *********************************************************************** |
|
24 |
|
25 To run TPS, activate the virtualenv using: |
|
26 source {TARGET}/{BIN_NAME} |
|
27 |
|
28 To change your TPS config, please edit the file: |
|
29 {TARGET}/config.json |
|
30 |
|
31 To execute tps use: |
|
32 runtps --binary=/path/to/firefox |
|
33 |
|
34 See runtps --help for all options |
|
35 |
|
36 *********************************************************************** |
|
37 """ |
|
38 |
|
39 # Link to the folder, which contains the zip archives of virtualenv |
|
40 URL_VIRTUALENV = 'https://codeload.github.com/pypa/virtualenv/zip/' |
|
41 VERSION_VIRTUALENV = '1.11.6' |
|
42 |
|
43 |
|
44 if sys.platform == 'win32': |
|
45 bin_name = os.path.join('Scripts', 'activate.bat') |
|
46 activate_env = os.path.join('Scripts', 'activate_this.py') |
|
47 python_env = os.path.join('Scripts', 'python.exe') |
|
48 else: |
|
49 bin_name = os.path.join('bin', 'activate') |
|
50 activate_env = os.path.join('bin', 'activate_this.py') |
|
51 python_env = os.path.join('bin', 'python') |
|
52 |
|
53 |
|
54 def download(url, target): |
|
55 """Downloads the specified url to the given target.""" |
|
56 response = urllib2.urlopen(url) |
|
57 with open(target, 'wb') as f: |
|
58 f.write(response.read()) |
|
59 |
|
60 return target |
|
61 |
|
62 |
|
63 def setup_virtualenv(target, python_bin=None): |
|
64 script_path = os.path.join(here, 'virtualenv-%s' % VERSION_VIRTUALENV, |
|
65 'virtualenv.py') |
|
66 |
|
67 print 'Downloading virtualenv %s' % VERSION_VIRTUALENV |
|
68 zip_path = download(URL_VIRTUALENV + VERSION_VIRTUALENV, |
|
69 os.path.join(here, 'virtualenv.zip')) |
|
70 |
|
71 try: |
|
72 with zipfile.ZipFile(zip_path, 'r') as f: |
|
73 f.extractall(here) |
|
74 |
|
75 print 'Creating new virtual environment' |
|
76 cmd_args = [sys.executable, script_path, target] |
|
77 |
|
78 if python_bin: |
|
79 cmd_args.extend(['-p', python_bin]) |
|
80 |
|
81 subprocess.check_call(cmd_args) |
|
82 finally: |
|
83 try: |
|
84 os.remove(zip_path) |
|
85 except OSError: |
|
86 pass |
|
87 |
|
88 shutil.rmtree(os.path.dirname(script_path), ignore_errors=True) |
|
89 |
|
90 |
|
91 def update_configfile(source, target, replacements): |
|
92 lines = [] |
|
93 |
|
94 with open(source) as config: |
|
95 for line in config: |
|
96 for source_string, target_string in replacements.iteritems(): |
|
97 if target_string: |
|
98 line = line.replace(source_string, target_string) |
|
99 lines.append(line) |
|
100 |
|
101 with open(target, 'w') as config: |
|
102 for line in lines: |
|
103 config.write(line) |
|
104 |
|
105 |
|
106 def main(): |
|
107 parser = optparse.OptionParser('Usage: %prog [options] path_to_venv') |
|
108 parser.add_option('--password', |
|
109 type='string', |
|
110 dest='password', |
|
111 metavar='FX_ACCOUNT_PASSWORD', |
|
112 default=None, |
|
113 help='The Firefox Account password.') |
|
114 parser.add_option('-p', '--python', |
|
115 type='string', |
|
116 dest='python', |
|
117 metavar='PYTHON_BIN', |
|
118 default=None, |
|
119 help='The Python interpreter to use.') |
|
120 parser.add_option('--sync-passphrase', |
|
121 type='string', |
|
122 dest='sync_passphrase', |
|
123 metavar='SYNC_ACCOUNT_PASSPHRASE', |
|
124 default=None, |
|
125 help='The old Firefox Sync account passphrase.') |
|
126 parser.add_option('--sync-password', |
|
127 type='string', |
|
128 dest='sync_password', |
|
129 metavar='SYNC_ACCOUNT_PASSWORD', |
|
130 default=None, |
|
131 help='The old Firefox Sync account password.') |
|
132 parser.add_option('--sync-username', |
|
133 type='string', |
|
134 dest='sync_username', |
|
135 metavar='SYNC_ACCOUNT_USERNAME', |
|
136 default=None, |
|
137 help='The old Firefox Sync account username.') |
|
138 parser.add_option('--username', |
|
139 type='string', |
|
140 dest='username', |
|
141 metavar='FX_ACCOUNT_USERNAME', |
|
142 default=None, |
|
143 help='The Firefox Account username.') |
|
144 |
|
145 (options, args) = parser.parse_args(args=None, values=None) |
|
146 |
|
147 if len(args) != 1: |
|
148 parser.error('Path to the environment has to be specified') |
|
149 target = args[0] |
|
150 assert(target) |
|
151 |
|
152 setup_virtualenv(target, python_bin=options.python) |
|
153 |
|
154 # Activate tps environment |
|
155 tps_env = os.path.join(target, activate_env) |
|
156 execfile(tps_env, dict(__file__=tps_env)) |
|
157 |
|
158 # Install TPS in environment |
|
159 subprocess.check_call([os.path.join(target, python_env), |
|
160 os.path.join(here, 'setup.py'), 'install']) |
|
161 |
|
162 # Get the path to tests and extensions directory by checking check where |
|
163 # the tests and extensions directories are located |
|
164 sync_dir = os.path.abspath(os.path.join(here, '..', '..', 'services', |
|
165 'sync')) |
|
166 if os.path.exists(sync_dir): |
|
167 testdir = os.path.join(sync_dir, 'tests', 'tps') |
|
168 extdir = os.path.join(sync_dir, 'tps', 'extensions') |
|
169 else: |
|
170 testdir = os.path.join(here, 'tests') |
|
171 extdir = os.path.join(here, 'extensions') |
|
172 |
|
173 update_configfile(os.path.join(here, 'config', 'config.json.in'), |
|
174 os.path.join(target, 'config.json'), |
|
175 replacements={ |
|
176 '__TESTDIR__': testdir.replace('\\','/'), |
|
177 '__EXTENSIONDIR__': extdir.replace('\\','/'), |
|
178 '__FX_ACCOUNT_USERNAME__': options.username, |
|
179 '__FX_ACCOUNT_PASSWORD__': options.password, |
|
180 '__SYNC_ACCOUNT_USERNAME__': options.sync_username, |
|
181 '__SYNC_ACCOUNT_PASSWORD__': options.sync_password, |
|
182 '__SYNC_ACCOUNT_PASSPHRASE__': options.sync_passphrase}) |
|
183 |
|
184 if not (options.username and options.password): |
|
185 print '\nFirefox Account credentials not specified.' |
|
186 if not (options.sync_username and options.sync_password and options.passphrase): |
|
187 print '\nFirefox Sync account credentials not specified.' |
|
188 |
|
189 # Print the user instructions |
|
190 print usage_message.format(TARGET=target, |
|
191 BIN_NAME=bin_name) |
|
192 |
|
193 if __name__ == "__main__": |
|
194 main() |