summaryrefslogtreecommitdiffstats
path: root/testing/tps/create_venv.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xtesting/tps/create_venv.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/testing/tps/create_venv.py b/testing/tps/create_venv.py
new file mode 100755
index 0000000000..3d938ffc78
--- /dev/null
+++ b/testing/tps/create_venv.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python3
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+"""
+This scripts sets up a virtualenv and installs TPS into it.
+It's probably best to specify a path NOT inside the repo, otherwise
+all the virtualenv files will show up in e.g. hg status.
+"""
+
+import optparse
+import os
+import subprocess
+import sys
+import venv
+
+here = os.path.dirname(os.path.abspath(__file__))
+usage_message = """
+***********************************************************************
+
+To run TPS, activate the virtualenv using:
+ source {TARGET}/{BIN_NAME}
+
+To change your TPS config, please edit the file:
+ {TARGET}/config.json
+
+To execute tps use:
+ runtps --binary=/path/to/firefox
+
+See runtps --help for all options
+
+***********************************************************************
+"""
+
+if sys.platform == "win32":
+ bin_name = os.path.join("Scripts", "activate.bat")
+ python_env = os.path.join("Scripts", "python.exe")
+else:
+ bin_name = os.path.join("bin", "activate")
+ python_env = os.path.join("bin", "python")
+
+
+def setup_virtualenv(target):
+ print("Creating new virtual environment:", os.path.abspath(target))
+ # system_site_packages=True so we have access to setuptools.
+ venv.create(target, system_site_packages=True)
+
+
+def update_configfile(source, target, replacements):
+ lines = []
+
+ with open(source) as config:
+ for line in config:
+ for source_string, target_string in replacements.items():
+ if target_string:
+ line = line.replace(source_string, target_string)
+ lines.append(line)
+
+ with open(target, "w") as config:
+ for line in lines:
+ config.write(line)
+
+
+def main():
+ parser = optparse.OptionParser("Usage: %prog [options] path_to_venv")
+ parser.add_option(
+ "--keep-config",
+ dest="keep_config",
+ action="store_true",
+ help="Keep the existing config file.",
+ )
+ parser.add_option(
+ "--password",
+ type="string",
+ dest="password",
+ metavar="FX_ACCOUNT_PASSWORD",
+ default=None,
+ help="The Firefox Account password.",
+ )
+ parser.add_option(
+ "-p",
+ "--python",
+ type="string",
+ dest="python",
+ metavar="PYTHON_BIN",
+ default=None,
+ help="The Python interpreter to use.",
+ )
+ parser.add_option(
+ "--sync-passphrase",
+ type="string",
+ dest="sync_passphrase",
+ metavar="SYNC_ACCOUNT_PASSPHRASE",
+ default=None,
+ help="The old Firefox Sync account passphrase.",
+ )
+ parser.add_option(
+ "--sync-password",
+ type="string",
+ dest="sync_password",
+ metavar="SYNC_ACCOUNT_PASSWORD",
+ default=None,
+ help="The old Firefox Sync account password.",
+ )
+ parser.add_option(
+ "--sync-username",
+ type="string",
+ dest="sync_username",
+ metavar="SYNC_ACCOUNT_USERNAME",
+ default=None,
+ help="The old Firefox Sync account username.",
+ )
+ parser.add_option(
+ "--username",
+ type="string",
+ dest="username",
+ metavar="FX_ACCOUNT_USERNAME",
+ default=None,
+ help="The Firefox Account username.",
+ )
+
+ (options, args) = parser.parse_args(args=None, values=None)
+
+ if len(args) != 1:
+ parser.error("Path to the environment has to be specified")
+ target = args[0]
+ assert target
+
+ setup_virtualenv(target)
+
+ # Activate tps environment
+ activate(target)
+
+ # Install TPS in environment
+ subprocess.check_call(
+ [os.path.join(target, python_env), os.path.join(here, "setup.py"), "install"]
+ )
+
+ # Get the path to tests and extensions directory by checking check where
+ # the tests and extensions directories are located
+ sync_dir = os.path.abspath(os.path.join(here, "..", "..", "services", "sync"))
+ if os.path.exists(sync_dir):
+ testdir = os.path.join(sync_dir, "tests", "tps")
+ extdir = os.path.join(sync_dir, "tps", "extensions")
+ else:
+ testdir = os.path.join(here, "tests")
+ extdir = os.path.join(here, "extensions")
+
+ if not options.keep_config:
+ update_configfile(
+ os.path.join(here, "config", "config.json.in"),
+ os.path.join(target, "config.json"),
+ replacements={
+ "__TESTDIR__": testdir.replace("\\", "/"),
+ "__EXTENSIONDIR__": extdir.replace("\\", "/"),
+ "__FX_ACCOUNT_USERNAME__": options.username,
+ "__FX_ACCOUNT_PASSWORD__": options.password,
+ "__SYNC_ACCOUNT_USERNAME__": options.sync_username,
+ "__SYNC_ACCOUNT_PASSWORD__": options.sync_password,
+ "__SYNC_ACCOUNT_PASSPHRASE__": options.sync_passphrase,
+ },
+ )
+
+ if not (options.username and options.password):
+ print("\nFirefox Account credentials not specified.")
+ if not (options.sync_username and options.sync_password and options.passphrase):
+ print("\nFirefox Sync account credentials not specified.")
+
+ # Print the user instructions
+ print(usage_message.format(TARGET=target, BIN_NAME=bin_name))
+
+
+def activate(target):
+ # This is a lightly modified copy of `activate_this.py`, which existed when
+ # venv was an external package, but doesn't come with the builtin venv support.
+ old_os_path = os.environ.get("PATH", "")
+ os.environ["PATH"] = (
+ os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
+ )
+ base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ if sys.platform == "win32":
+ site_packages = os.path.join(base, "Lib", "site-packages")
+ else:
+ site_packages = os.path.join(
+ base, "lib", "python%s" % sys.version[:3], "site-packages"
+ )
+ prev_sys_path = list(sys.path)
+ import site
+
+ site.addsitedir(site_packages)
+ sys.real_prefix = sys.prefix
+ sys.prefix = base
+ # Move the added items to the front of the path:
+ new_sys_path = []
+ for item in list(sys.path):
+ if item not in prev_sys_path:
+ new_sys_path.append(item)
+ sys.path.remove(item)
+ sys.path[:0] = new_sys_path
+
+
+if __name__ == "__main__":
+ main()