Mercurial > hg
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 |
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 } |