| import argparse |
| from . import browser |
| |
| latest_channels = { |
| 'android_weblayer': 'dev', |
| 'android_webview': 'dev', |
| 'firefox': 'nightly', |
| 'chrome': 'nightly', |
| 'chrome_android': 'dev', |
| 'edgechromium': 'dev', |
| 'safari': 'preview', |
| 'servo': 'nightly', |
| 'webkitgtk_minibrowser': 'nightly' |
| } |
| |
| channel_by_name = { |
| 'stable': 'stable', |
| 'release': 'stable', |
| 'beta': 'beta', |
| 'dev': 'dev', |
| 'canary': 'canary', |
| 'nightly': latest_channels, |
| 'preview': latest_channels, |
| 'experimental': latest_channels, |
| } |
| |
| channel_args = argparse.ArgumentParser(add_help=False) |
| channel_args.add_argument('--channel', choices=channel_by_name.keys(), |
| default='nightly', action='store', |
| help=''' |
| Name of browser release channel (default: nightly). "stable" and "release" are |
| synonyms for the latest browser stable release; "beta" is the beta release; |
| "dev" is only meaningful for Chrome (i.e. Chrome Dev); "nightly", |
| "experimental", and "preview" are all synonyms for the latest available |
| development or trunk release. (For WebDriver installs, we attempt to select an |
| appropriate, compatible version for the latest browser release on the selected |
| channel.) This flag overrides --browser-channel.''') |
| |
| |
| def get_parser(): |
| parser = argparse.ArgumentParser( |
| parents=[channel_args], |
| description="Install a given browser or webdriver frontend.") |
| parser.add_argument('browser', choices=['firefox', 'chrome', 'servo'], |
| help='name of web browser product') |
| parser.add_argument('component', choices=['browser', 'webdriver'], |
| help='name of component') |
| parser.add_argument('--download-only', action="store_true", |
| help="Download the selected component but don't install it") |
| parser.add_argument('--rename', action="store", default=None, |
| help="Filename, excluding extension for downloaded archive " |
| "(only with --download-only)") |
| parser.add_argument('-d', '--destination', |
| help='filesystem directory to place the component') |
| return parser |
| |
| |
| def get_channel(browser, channel): |
| channel = channel_by_name[channel] |
| if isinstance(channel, dict): |
| channel = channel.get(browser) |
| return channel |
| |
| |
| def run(venv, **kwargs): |
| import logging |
| logger = logging.getLogger("install") |
| |
| browser = kwargs["browser"] |
| destination = kwargs["destination"] |
| channel = get_channel(browser, kwargs["channel"]) |
| |
| if channel != kwargs["channel"]: |
| logger.info("Interpreting channel '%s' as '%s'", kwargs["channel"], channel) |
| |
| if destination is None: |
| if venv: |
| if kwargs["component"] == "browser": |
| destination = venv.path |
| else: |
| destination = venv.bin_path |
| else: |
| raise argparse.ArgumentError(None, |
| "No --destination argument, and no default for the environment") |
| |
| install(browser, kwargs["component"], destination, channel, logger=logger, |
| download_only=kwargs["download_only"], rename=kwargs["rename"]) |
| |
| |
| def install(name, component, destination, channel="nightly", logger=None, download_only=False, |
| rename=None): |
| if logger is None: |
| import logging |
| logger = logging.getLogger("install") |
| |
| prefix = "download" if download_only else "install" |
| suffix = "_webdriver" if component == 'webdriver' else "" |
| |
| method = prefix + suffix |
| |
| browser_cls = getattr(browser, name.title()) |
| logger.info('Now installing %s %s...', name, component) |
| kwargs = {} |
| if download_only and rename: |
| kwargs["rename"] = rename |
| path = getattr(browser_cls(logger), method)(dest=destination, channel=channel, **kwargs) |
| if path: |
| logger.info('Binary %s as %s', "downloaded" if download_only else "installed", path) |