contrib/packaging/wix/build.py
author Augie Fackler <augie@google.com>
Wed, 06 Nov 2019 15:35:44 -0500
changeset 43532 da9ecbb10368
parent 43076 2372284d9457
permissions -rwxr-xr-x
vfs: more attribute suppressions Differential Revision: https://phab.mercurial-scm.org/D7285

#!/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 not os.path.isabs(args.python):
        raise Exception('--python arg must be an absolute path')

    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)