changeset 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 5e923355c595
children a2e191a937a9
files contrib/packaging/hgpackaging/inno.py contrib/packaging/hgpackaging/util.py
diffstat 2 files changed, 30 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/packaging/hgpackaging/inno.py	Thu Mar 07 10:36:20 2019 -0800
+++ b/contrib/packaging/hgpackaging/inno.py	Thu Mar 07 10:49:59 2019 -0800
@@ -19,14 +19,10 @@
     extract_tar_to_directory,
     extract_zip_to_directory,
     find_vc_runtime_files,
+    python_exe_info,
 )
 
 
-PRINT_PYTHON_INFO = '''
-import platform, sys; print("%s:%d" % (platform.architecture()[0], sys.version_info[0]))
-'''.strip()
-
-
 def build(source_dir: pathlib.Path, build_dir: pathlib.Path,
           python_exe: pathlib.Path, iscc_exe: pathlib.Path,
           version=None):
@@ -50,23 +46,18 @@
     # architecture.
     vc_x64 = r'\x64' in os.environ['LIB']
 
-    res = subprocess.run(
-        [str(python_exe), '-c', PRINT_PYTHON_INFO],
-        capture_output=True, check=True)
-
-    py_arch, py_version = res.stdout.decode('utf-8').split(':')
-    py_version = int(py_version)
+    py_info = python_exe_info(python_exe)
 
     if vc_x64:
-        if py_arch != '64bit':
+        if py_info['arch'] != '64bit':
             raise Exception('architecture mismatch: Visual C++ environment '
                             'is configured for 64-bit but Python is 32-bit')
     else:
-        if py_arch != '32bit':
+        if py_info['arch'] != '32bit':
             raise Exception('architecture mismatch: Visual C++ environment '
                             'is configured for 32-bit but Python is 64-bit')
 
-    if py_version != 2:
+    if py_info['py3']:
         raise Exception('Only Python 2 is currently supported')
 
     build_dir.mkdir(exist_ok=True)
--- a/contrib/packaging/hgpackaging/util.py	Thu Mar 07 10:36:20 2019 -0800
+++ b/contrib/packaging/hgpackaging/util.py	Thu Mar 07 10:49:59 2019 -0800
@@ -7,8 +7,10 @@
 
 # no-check-code because Python 3 native.
 
+import distutils.version
 import os
 import pathlib
+import subprocess
 import tarfile
 import zipfile
 
@@ -46,3 +48,26 @@
         d / 'msvcr90.dll',
         winsxs / 'Manifests' / ('%s.manifest' % version),
     ]
+
+
+PRINT_PYTHON_INFO = '''
+import platform; print("%s:%s" % (platform.architecture()[0], platform.python_version()))
+'''.strip()
+
+
+def python_exe_info(python_exe: pathlib.Path):
+    """Obtain information about a Python executable."""
+
+    res = subprocess.run(
+        [str(python_exe), '-c', PRINT_PYTHON_INFO],
+        capture_output=True, check=True)
+
+    arch, version = res.stdout.decode('utf-8').split(':')
+
+    version = distutils.version.LooseVersion(version)
+
+    return {
+        'arch': arch,
+        'version': version,
+        'py3': version >= distutils.version.LooseVersion('3'),
+    }