annotate contrib/packaging/hgpackaging/util.py @ 41914:7d1211168863

packaging: extract python exe info to own function This is generic functionality. We'll need it for WIX. As part of the port, we expose the full version and return the data as a dict. Differential Revision: https://phab.mercurial-scm.org/D6090
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 07 Mar 2019 10:49:59 -0800
parents 1440dd6164f2
children 4371f543efda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41907
9da97f49d4f4 packaging: establish hgpackaging package
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41853
diff changeset
1 # util.py - Common packaging utility code.
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
41914
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
10 import distutils.version
41910
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
11 import os
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
12 import pathlib
41914
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
13 import subprocess
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
14 import tarfile
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
15 import zipfile
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
16
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
17
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
18 def extract_tar_to_directory(source: pathlib.Path, dest: pathlib.Path):
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
19 with tarfile.open(source, 'r') as tf:
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
20 tf.extractall(dest)
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
21
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
22
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
23 def extract_zip_to_directory(source: pathlib.Path, dest: pathlib.Path):
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
24 with zipfile.ZipFile(source, 'r') as zf:
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
25 zf.extractall(dest)
41910
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
26
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
27
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
28 def find_vc_runtime_files(x64=False):
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
29 """Finds Visual C++ Runtime DLLs to include in distribution."""
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
30 winsxs = pathlib.Path(os.environ['SYSTEMROOT']) / 'WinSxS'
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
31
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
32 prefix = 'amd64' if x64 else 'x86'
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
33
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
34 candidates = sorted(p for p in os.listdir(winsxs)
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
35 if p.lower().startswith('%s_microsoft.vc90.crt_' % prefix))
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
36
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
37 for p in candidates:
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
38 print('found candidate VC runtime: %s' % p)
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
39
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
40 # Take the newest version.
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
41 version = candidates[-1]
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
42
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
43 d = winsxs / version
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
44
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
45 return [
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
46 d / 'msvcm90.dll',
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
47 d / 'msvcp90.dll',
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
48 d / 'msvcr90.dll',
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
49 winsxs / 'Manifests' / ('%s.manifest' % version),
1440dd6164f2 packaging: move find_vc_runtime_files() into hgpackaging.util
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41908
diff changeset
50 ]
41914
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
51
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
52
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
53 PRINT_PYTHON_INFO = '''
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
54 import platform; print("%s:%s" % (platform.architecture()[0], platform.python_version()))
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
55 '''.strip()
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
56
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
57
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
58 def python_exe_info(python_exe: pathlib.Path):
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
59 """Obtain information about a Python executable."""
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
60
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
61 res = subprocess.run(
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
62 [str(python_exe), '-c', PRINT_PYTHON_INFO],
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
63 capture_output=True, check=True)
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
64
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
65 arch, version = res.stdout.decode('utf-8').split(':')
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
66
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
67 version = distutils.version.LooseVersion(version)
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
68
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
69 return {
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
70 'arch': arch,
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
71 'version': version,
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
72 'py3': version >= distutils.version.LooseVersion('3'),
7d1211168863 packaging: extract python exe info to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
73 }