view contrib/packaging/wix/build.py @ 42049:1711f5813a63

wix: add functionality to inject additional Features into installer This is the last bit required to be able to glue extra configs etc into the installer. Differential Revision: https://phab.mercurial-scm.org/D6180
author Augie Fackler <raf@durin42.com>
date Mon, 01 Apr 2019 20:01:48 -0400
parents 978b03d5f66e
children 57645939df59
line wrap: on
line source

#!/usr/bin/env python3
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

# no-check-code because Python 3 native.

"""Code to build Mercurial WiX installer."""

import argparse
import os
import pathlib
import sys


if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument('--name',
                        help='Application name',
                        default='Mercurial')
    parser.add_argument('--python',
                        help='Path to Python executable to use',
                        required=True)
    parser.add_argument('--sign-sn',
                        help='Subject name (or fragment thereof) of certificate '
                             'to use for signing')
    parser.add_argument('--sign-cert',
                        help='Path to certificate to use for signing')
    parser.add_argument('--sign-password',
                        help='Password for signing certificate')
    parser.add_argument('--sign-timestamp-url',
                        help='URL of timestamp server to use for signing')
    parser.add_argument('--version',
                        help='Version string to use')
    parser.add_argument('--extra-packages-script',
                        help=('Script to execute to include extra packages in '
                              'py2exe binary.'))
    parser.add_argument('--extra-wxs',
                        help='CSV of path_to_wxs_file=working_dir_for_wxs_file')
    parser.add_argument('--extra-features',
                        help=('CSV of extra feature names to include '
                              'in the installer from the extra wxs files'))

    args = parser.parse_args()

    here = pathlib.Path(os.path.abspath(os.path.dirname(__file__)))
    source_dir = here.parent.parent.parent

    sys.path.insert(0, str(source_dir / 'contrib' / 'packaging'))

    from hgpackaging.wix import (
        build_installer,
        build_signed_installer,
    )

    fn = build_installer
    kwargs = {
        'source_dir': source_dir,
        'python_exe': pathlib.Path(args.python),
        'version': args.version,
    }

    if args.extra_packages_script:
        kwargs['extra_packages_script'] = args.extra_packages_script
    if args.extra_wxs:
        kwargs['extra_wxs'] = dict(
            thing.split("=") for thing in args.extra_wxs.split(','))
    if args.extra_features:
        kwargs['extra_features'] = args.extra_features.split(',')

    if args.sign_sn or args.sign_cert:
        fn = build_signed_installer
        kwargs['name'] = args.name
        kwargs['subject_name'] = args.sign_sn
        kwargs['cert_path'] = args.sign_cert
        kwargs['cert_password'] = args.sign_password
        kwargs['timestamp_url'] = args.sign_timestamp_url

    fn(**kwargs)