tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

install.py (4581B)


      1 # mypy: allow-untyped-defs
      2 
      3 import argparse
      4 from . import browser
      5 
      6 latest_channels = {
      7    'android_webview': 'dev',
      8    'firefox': 'nightly',
      9    'firefox_android': 'nightly',
     10    'chrome': 'canary',
     11    'chrome_android': 'dev',
     12    'chromium': 'nightly',
     13    'edge': 'dev',
     14    'safari': 'preview',
     15    'servo': 'nightly',
     16    'webkitgtk_minibrowser': 'nightly',
     17    'wpewebkit_minibrowser': 'nightly',
     18    'wktr': 'main',
     19 }
     20 
     21 channel_by_name = {
     22    'stable': 'stable',
     23    'release': 'stable',
     24    'beta': 'beta',
     25    'dev': 'dev',
     26    'canary': 'canary',
     27    'nightly': latest_channels,
     28    'preview': latest_channels,
     29    'experimental': latest_channels,
     30 }
     31 
     32 channel_args = argparse.ArgumentParser(add_help=False)
     33 channel_args.add_argument('--channel', choices=channel_by_name.keys(),
     34                          default='nightly',
     35                          help='''
     36 Name of browser release channel (default: nightly). "stable" and "release" are
     37 synonyms for the latest browser stable release; "beta" is the beta release;
     38 "dev" is only meaningful for Chrome (i.e. Chrome Dev); "nightly",
     39 "experimental", and "preview" are all synonyms for the latest available
     40 development or trunk release. (For WebDriver installs, we attempt to select an
     41 appropriate, compatible version for the latest browser release on the selected
     42 channel.) This flag overrides --browser-channel.''')
     43 
     44 
     45 def get_parser():
     46    parser = argparse.ArgumentParser(
     47        parents=[channel_args],
     48        description="Install a given browser or webdriver frontend.")
     49    parser.add_argument('browser', choices=['firefox', 'chrome', 'chromium', 'servo', 'safari', 'wktr'],
     50                        help='name of web browser product')
     51    parser.add_argument('component', choices=['browser', 'webdriver'],
     52                        help='name of component')
     53    parser.add_argument('--download-only', action="store_true",
     54                        help="Download the selected component but don't install it")
     55    parser.add_argument('--rename',
     56                        help="Filename, excluding extension for downloaded archive "
     57                        "(only with --download-only)")
     58    parser.add_argument('-d', '--destination',
     59                        help='filesystem directory to place the component')
     60    parser.add_argument('--revision',
     61                        help='Chromium revision to install from snapshots')
     62    return parser
     63 
     64 
     65 def get_channel(browser, channel):
     66    channel = channel_by_name[channel]
     67    if isinstance(channel, dict):
     68        channel = channel.get(browser)
     69    return channel
     70 
     71 
     72 def run(venv, **kwargs):
     73    import logging
     74    logger = logging.getLogger("install")
     75 
     76    browser = kwargs["browser"]
     77    destination = kwargs["destination"]
     78    channel = get_channel(browser, kwargs["channel"])
     79 
     80    if channel != kwargs["channel"]:
     81        logger.info("Interpreting channel '%s' as '%s'", kwargs["channel"], channel)
     82 
     83    if destination is None:
     84        if venv:
     85            if kwargs["component"] == "browser":
     86                destination = venv.path
     87            else:
     88                destination = venv.bin_path
     89        else:
     90            raise argparse.ArgumentError(None,
     91                                         "No --destination argument, and no default for the environment")
     92 
     93    if kwargs["revision"] is not None and browser != "chromium":
     94        raise argparse.ArgumentError(None, "--revision flag cannot be used for non-Chromium browsers.")
     95 
     96    install(browser, kwargs["component"], destination, channel, logger=logger,
     97            download_only=kwargs["download_only"], rename=kwargs["rename"],
     98            revision=kwargs["revision"])
     99 
    100 
    101 def install(name, component, destination, channel="nightly", logger=None, download_only=False,
    102            rename=None, revision=None):
    103    if logger is None:
    104        import logging
    105        logger = logging.getLogger("install")
    106 
    107    prefix = "download" if download_only else "install"
    108    suffix = "_webdriver" if component == 'webdriver' else ""
    109 
    110    method = prefix + suffix
    111 
    112    if name == "wktr":
    113        canonical_name = "WebKitTestRunner"
    114    else:
    115        canonical_name = name.title()
    116 
    117    browser_cls = getattr(browser, canonical_name)
    118    logger.info('Now installing %s %s...', name, component)
    119    kwargs = {}
    120    if download_only and rename:
    121        kwargs["rename"] = rename
    122    if revision:
    123        kwargs["revision"] = revision
    124 
    125    path = getattr(browser_cls(logger), method)(dest=destination, channel=channel, **kwargs)
    126    if path:
    127        logger.info('Binary %s as %s', "downloaded" if download_only else "installed", path)