contrib/packaging/hgpackaging/wix.py
changeset 43076 2372284d9457
parent 42049 1711f5813a63
child 43522 ce96be208ea4
--- a/contrib/packaging/hgpackaging/wix.py	Sat Oct 05 10:29:34 2019 -0400
+++ b/contrib/packaging/hgpackaging/wix.py	Sun Oct 06 09:45:02 2019 -0400
@@ -15,12 +15,8 @@
 import typing
 import xml.dom.minidom
 
-from .downloads import (
-    download_entry,
-)
-from .py2exe import (
-    build_py2exe,
-)
+from .downloads import download_entry
+from .py2exe import build_py2exe
 from .util import (
     extract_zip_to_directory,
     sign_with_signtool,
@@ -84,17 +80,29 @@
 
 def ensure_vc90_merge_modules(build_dir):
     x86 = (
-        download_entry('vc9-crt-x86-msm', build_dir,
-                       local_name='microsoft.vcxx.crt.x86_msm.msm')[0],
-        download_entry('vc9-crt-x86-msm-policy', build_dir,
-                       local_name='policy.x.xx.microsoft.vcxx.crt.x86_msm.msm')[0]
+        download_entry(
+            'vc9-crt-x86-msm',
+            build_dir,
+            local_name='microsoft.vcxx.crt.x86_msm.msm',
+        )[0],
+        download_entry(
+            'vc9-crt-x86-msm-policy',
+            build_dir,
+            local_name='policy.x.xx.microsoft.vcxx.crt.x86_msm.msm',
+        )[0],
     )
 
     x64 = (
-        download_entry('vc9-crt-x64-msm', build_dir,
-                       local_name='microsoft.vcxx.crt.x64_msm.msm')[0],
-        download_entry('vc9-crt-x64-msm-policy', build_dir,
-                       local_name='policy.x.xx.microsoft.vcxx.crt.x64_msm.msm')[0]
+        download_entry(
+            'vc9-crt-x64-msm',
+            build_dir,
+            local_name='microsoft.vcxx.crt.x64_msm.msm',
+        )[0],
+        download_entry(
+            'vc9-crt-x64-msm-policy',
+            build_dir,
+            local_name='policy.x.xx.microsoft.vcxx.crt.x64_msm.msm',
+        )[0],
     )
     return {
         'x86': x86,
@@ -116,17 +124,26 @@
     subprocess.run(args, cwd=str(cwd), check=True)
 
 
-def make_post_build_signing_fn(name, subject_name=None, cert_path=None,
-                               cert_password=None, timestamp_url=None):
+def make_post_build_signing_fn(
+    name,
+    subject_name=None,
+    cert_path=None,
+    cert_password=None,
+    timestamp_url=None,
+):
     """Create a callable that will use signtool to sign hg.exe."""
 
     def post_build_sign(source_dir, build_dir, dist_dir, version):
         description = '%s %s' % (name, version)
 
-        sign_with_signtool(dist_dir / 'hg.exe', description,
-                           subject_name=subject_name, cert_path=cert_path,
-                           cert_password=cert_password,
-                           timestamp_url=timestamp_url)
+        sign_with_signtool(
+            dist_dir / 'hg.exe',
+            description,
+            subject_name=subject_name,
+            cert_path=cert_path,
+            cert_password=cert_password,
+            timestamp_url=timestamp_url,
+        )
 
     return post_build_sign
 
@@ -155,7 +172,8 @@
     # We can't use ElementTree because it doesn't handle the
     # <?include ?> directives.
     doc = xml.dom.minidom.parseString(
-        LIBRARIES_XML.format(wix_dir=str(wix_dir)))
+        LIBRARIES_XML.format(wix_dir=str(wix_dir))
+    )
 
     component = doc.getElementsByTagName('Component')[0]
 
@@ -177,11 +195,16 @@
     return doc.toprettyxml()
 
 
-def build_installer(source_dir: pathlib.Path, python_exe: pathlib.Path,
-                    msi_name='mercurial', version=None, post_build_fn=None,
-                    extra_packages_script=None,
-                    extra_wxs:typing.Optional[typing.Dict[str,str]]=None,
-                    extra_features:typing.Optional[typing.List[str]]=None):
+def build_installer(
+    source_dir: pathlib.Path,
+    python_exe: pathlib.Path,
+    msi_name='mercurial',
+    version=None,
+    post_build_fn=None,
+    extra_packages_script=None,
+    extra_wxs: typing.Optional[typing.Dict[str, str]] = None,
+    extra_features: typing.Optional[typing.List[str]] = None,
+):
     """Build a WiX MSI installer.
 
     ``source_dir`` is the path to the Mercurial source tree to use.
@@ -209,10 +232,15 @@
 
     requirements_txt = wix_dir / 'requirements.txt'
 
-    build_py2exe(source_dir, hg_build_dir,
-                 python_exe, 'wix', requirements_txt,
-                 extra_packages=EXTRA_PACKAGES,
-                 extra_packages_script=extra_packages_script)
+    build_py2exe(
+        source_dir,
+        hg_build_dir,
+        python_exe,
+        'wix',
+        requirements_txt,
+        extra_packages=EXTRA_PACKAGES,
+        extra_packages_script=extra_packages_script,
+    )
 
     version = version or normalize_version(find_version(source_dir))
     print('using version string: %s' % version)
@@ -265,16 +293,19 @@
 
     run_candle(wix_path, build_dir, source, source_build_rel, defines=defines)
 
-    msi_path = source_dir / 'dist' / (
-        '%s-%s-%s.msi' % (msi_name, version, arch))
+    msi_path = (
+        source_dir / 'dist' / ('%s-%s-%s.msi' % (msi_name, version, arch))
+    )
 
     args = [
         str(wix_path / 'light.exe'),
         '-nologo',
-        '-ext', 'WixUIExtension',
+        '-ext',
+        'WixUIExtension',
         '-sw1076',
         '-spdb',
-        '-o', str(msi_path),
+        '-o',
+        str(msi_path),
     ]
 
     for source, rel_path in SUPPORT_WXS:
@@ -286,10 +317,12 @@
         source = os.path.basename(source)
         args.append(str(build_dir / ('%s.wixobj' % source[:-4])))
 
-    args.extend([
-        str(build_dir / 'library.wixobj'),
-        str(build_dir / 'mercurial.wixobj'),
-    ])
+    args.extend(
+        [
+            str(build_dir / 'library.wixobj'),
+            str(build_dir / 'mercurial.wixobj'),
+        ]
+    )
 
     subprocess.run(args, cwd=str(source_dir), check=True)
 
@@ -300,11 +333,19 @@
     }
 
 
-def build_signed_installer(source_dir: pathlib.Path, python_exe: pathlib.Path,
-                           name: str, version=None, subject_name=None,
-                           cert_path=None, cert_password=None,
-                           timestamp_url=None, extra_packages_script=None,
-                           extra_wxs=None, extra_features=None):
+def build_signed_installer(
+    source_dir: pathlib.Path,
+    python_exe: pathlib.Path,
+    name: str,
+    version=None,
+    subject_name=None,
+    cert_path=None,
+    cert_password=None,
+    timestamp_url=None,
+    extra_packages_script=None,
+    extra_wxs=None,
+    extra_features=None,
+):
     """Build an installer with signed executables."""
 
     post_build_fn = make_post_build_signing_fn(
@@ -312,16 +353,27 @@
         subject_name=subject_name,
         cert_path=cert_path,
         cert_password=cert_password,
-        timestamp_url=timestamp_url)
+        timestamp_url=timestamp_url,
+    )
 
-    info = build_installer(source_dir, python_exe=python_exe,
-                           msi_name=name.lower(), version=version,
-                           post_build_fn=post_build_fn,
-                           extra_packages_script=extra_packages_script,
-                           extra_wxs=extra_wxs, extra_features=extra_features)
+    info = build_installer(
+        source_dir,
+        python_exe=python_exe,
+        msi_name=name.lower(),
+        version=version,
+        post_build_fn=post_build_fn,
+        extra_packages_script=extra_packages_script,
+        extra_wxs=extra_wxs,
+        extra_features=extra_features,
+    )
 
     description = '%s %s' % (name, version)
 
-    sign_with_signtool(info['msi_path'], description,
-                       subject_name=subject_name, cert_path=cert_path,
-                       cert_password=cert_password, timestamp_url=timestamp_url)
+    sign_with_signtool(
+        info['msi_path'],
+        description,
+        subject_name=subject_name,
+        cert_path=cert_path,
+        cert_password=cert_password,
+        timestamp_url=timestamp_url,
+    )