contrib/packaging/hgpackaging/inno.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sun, 19 Apr 2020 15:35:21 -0700
branchstable
changeset 44762 eec66d9c9e50
parent 44224 e2589b9e4562
child 44763 94f4f2ec7dee
permissions -rw-r--r--
packaging: split Inno installer building from Mercurial building We want to make the logic for producing the installer agnostic about how Mercurial is built to allow for alternate build methods (like PyOxidizer). Differential Revision: https://phab.mercurial-scm.org/D8472
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
     1
# inno.py - Inno Setup functionality.
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
# no-check-code because Python 3 native.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    10
import os
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    11
import pathlib
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
import shutil
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    13
import subprocess
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
    15
import jinja2
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
    16
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    17
from .py2exe import (
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    18
    build_py2exe,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    19
    stage_install,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    20
)
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    21
from .util import (
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    22
    find_vc_runtime_files,
44221
f37971c31067 packaging: set the FileVersion field in the Inno installer executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 43518
diff changeset
    23
    normalize_windows_version,
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    24
    process_install_rules,
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    25
    read_version_py,
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    26
)
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    27
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    28
EXTRA_PACKAGES = {
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    29
    'dulwich',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    30
    'keyring',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    31
    'pygments',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    32
    'win32ctypes',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    33
}
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    34
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    35
EXTRA_INSTALL_RULES = [
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    36
    ('contrib/win32/mercurial.ini', 'defaultrc/mercurial.rc'),
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    37
]
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    38
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    39
PACKAGE_FILES_METADATA = {
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    40
    'ReadMe.html': 'Flags: isreadme',
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    41
}
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    42
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    43
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    44
def build(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    45
    source_dir: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    46
    build_dir: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    47
    python_exe: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    48
    iscc_exe: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    49
    version=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    50
):
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    51
    """Build the Inno installer.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    52
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    53
    Build files will be placed in ``build_dir``.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    54
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    55
    py2exe's setup.py doesn't use setuptools. It doesn't have modern logic
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    56
    for finding the Python 2.7 toolchain. So, we require the environment
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    57
    to already be configured with an active toolchain.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    58
    """
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    59
    if not iscc_exe.exists():
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    60
        raise Exception('%s does not exist' % iscc_exe)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    61
41915
a2e191a937a9 packaging: extract py2exe functionality to own module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41914
diff changeset
    62
    vc_x64 = r'\x64' in os.environ.get('LIB', '')
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    63
    arch = 'x64' if vc_x64 else 'x86'
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
    64
    inno_build_dir = build_dir / ('inno-py2exe-%s' % arch)
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    65
    staging_dir = inno_build_dir / 'stage'
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    66
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    67
    requirements_txt = (
44224
e2589b9e4562 packaging: merge the requirements.txt files for WiX and Inno
Matt Harbison <matt_harbison@yahoo.com>
parents: 44222
diff changeset
    68
        source_dir / 'contrib' / 'packaging' / 'requirements_win32.txt'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    69
    )
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    70
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    71
    inno_build_dir.mkdir(parents=True, exist_ok=True)
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    72
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    73
    build_py2exe(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    74
        source_dir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    75
        build_dir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    76
        python_exe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    77
        'inno',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    78
        requirements_txt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    79
        extra_packages=EXTRA_PACKAGES,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    80
    )
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    81
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    82
    # Purge the staging directory for every build so packaging is
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    83
    # pristine.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    84
    if staging_dir.exists():
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    85
        print('purging %s' % staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    86
        shutil.rmtree(staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    87
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    88
    # Now assemble all the packaged files into the staging directory.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    89
    stage_install(source_dir, staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    90
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    91
    # We also install some extra files.
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    92
    process_install_rules(EXTRA_INSTALL_RULES, source_dir, staging_dir)
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    93
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    94
    # hg.exe depends on VC9 runtime DLLs. Copy those into place.
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    95
    for f in find_vc_runtime_files(vc_x64):
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    96
        if f.name.endswith('.manifest'):
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    97
            basename = 'Microsoft.VC90.CRT.manifest'
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    98
        else:
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
    99
            basename = f.name
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   100
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   101
        dest_path = staging_dir / basename
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   102
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   103
        print('copying %s to %s' % (f, dest_path))
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   104
        shutil.copyfile(f, dest_path)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   105
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   106
    build_installer(
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   107
        source_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   108
        inno_build_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   109
        staging_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   110
        iscc_exe,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   111
        version,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   112
        arch="x64" if vc_x64 else None,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   113
    )
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   114
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   115
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   116
def build_installer(
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   117
    source_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   118
    inno_build_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   119
    staging_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   120
    iscc_exe: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   121
    version,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   122
    arch=None,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   123
):
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   124
    """Build an Inno installer from staged Mercurial files.
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   125
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   126
    This function is agnostic about how to build Mercurial. It just
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   127
    cares that Mercurial files are in ``staging_dir``.
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   128
    """
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   129
    inno_source_dir = source_dir / "contrib" / "packaging" / "inno"
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   130
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   131
    # The final package layout is simply a mirror of the staging directory.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   132
    package_files = []
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   133
    for root, dirs, files in os.walk(staging_dir):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   134
        dirs.sort()
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   135
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   136
        root = pathlib.Path(root)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   137
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   138
        for f in sorted(files):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   139
            full = root / f
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   140
            rel = full.relative_to(staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   141
            if str(rel.parent) == '.':
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   142
                dest_dir = '{app}'
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   143
            else:
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   144
                dest_dir = '{app}\\%s' % rel.parent
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   145
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   146
            package_files.append(
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   147
                {
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   148
                    'source': rel,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   149
                    'dest_dir': dest_dir,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   150
                    'metadata': PACKAGE_FILES_METADATA.get(str(rel), None),
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   151
                }
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   152
            )
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   153
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   154
    print('creating installer')
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   155
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   156
    # Install Inno files by rendering a template.
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   157
    jinja_env = jinja2.Environment(
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   158
        loader=jinja2.FileSystemLoader(str(inno_source_dir)),
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   159
        # Need to change these to prevent conflict with Inno Setup.
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   160
        comment_start_string='{##',
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   161
        comment_end_string='##}',
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   162
    )
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   163
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   164
    try:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   165
        template = jinja_env.get_template('mercurial.iss')
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   166
    except jinja2.TemplateSyntaxError as e:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   167
        raise Exception(
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   168
            'template syntax error at %s:%d: %s'
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   169
            % (e.name, e.lineno, e.message,)
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   170
        )
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   171
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   172
    content = template.render(package_files=package_files)
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   173
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   174
    with (inno_build_dir / 'mercurial.iss').open('w', encoding='utf-8') as fh:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   175
        fh.write(content)
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
   176
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   177
    # Copy additional files used by Inno.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   178
    for p in ('mercurial.ico', 'postinstall.txt'):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   179
        shutil.copyfile(
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   180
            source_dir / 'contrib' / 'win32' / p, inno_build_dir / p
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   181
        )
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   182
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   183
    args = [str(iscc_exe)]
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   184
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   185
    if arch:
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   186
        args.append('/dARCH=%s' % arch)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   187
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   188
    if not version:
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   189
        version = read_version_py(source_dir)
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   190
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   191
    args.append('/dVERSION=%s' % version)
44221
f37971c31067 packaging: set the FileVersion field in the Inno installer executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 43518
diff changeset
   192
    args.append('/dQUAD_VERSION=%s' % normalize_windows_version(version))
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   193
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   194
    args.append('/Odist')
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
   195
    args.append(str(inno_build_dir / 'mercurial.iss'))
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   196
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   197
    subprocess.run(args, cwd=str(source_dir), check=True)