setup.py
author paugier <pierre.augier@univ-grenoble-alpes.fr>
Wed, 08 Jan 2025 05:07:00 +0100
changeset 52664 f5091286b10c
parent 52663 25bb409da058
child 52677 b7afc38468bd
permissions -rw-r--r--
packaging: modernize (compat PEP 517) with less distutils and setup.py calls - setup.py: less distutils imports and setuptools required distutils is deprecated and one should import commands from setuptools to support modern workflows depending on PEP 517 and 518. Moreover, for Python >=3.12, distutils comes from setuptools. It corresponds to old and unmaintain code that do not support PEP 517. The PEP 517 frontends (pip, build, pipx, PDM, UV, etc.) are responsible for creating a venv just for the build. The build dependencies (currently only setuptools) are specified in the pyproject.toml file. Therefore, there is no reason to support building without setuptools. Calling directly setup.py is deprecated and we have to use a PEP 517 frontend. For this commit we use pip with venv. - run-tests.py: install with pip instead of direct call of setup.py Mercurial is then built in an isolated environment. - Makefile: use venv+pip instead of setup.py
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 429
diff changeset
     1
# This is the mercurial setup script.
52315
737e169b8948 setup_py: first tiny cleanup
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52312
diff changeset
     2
52321
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
     3
import ctypes
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
     4
import logging
33591
ee11d18fcd3c setup: fix mistake that prevented Python 3 from being excluded
Augie Fackler <augie@google.com>
parents: 33589
diff changeset
     5
import os
52321
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
     6
import re
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
     7
import shutil
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
     8
import ssl
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
     9
import stat
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
    10
import subprocess
52315
737e169b8948 setup_py: first tiny cleanup
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52312
diff changeset
    11
import sys
42457
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
    12
import sysconfig
52321
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
    13
import tempfile
dd8e7d4fe8c3 setup_py: imports standard lib at the top
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52320
diff changeset
    14
import time
44874
4c53c12b92d5 setup: require a Python version with modern SSL features
Manuel Jacob <me@manueljacob.de>
parents: 44852
diff changeset
    15
52317
5d81f4b7e024 setup_py: simplify ssl check
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52316
diff changeset
    16
if not ssl.HAS_TLSv1_2:
44893
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    17
    error = """
52312
a820a7a1fce0 setup: require TLS 1.2 support from the Python interpreter (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 52243
diff changeset
    18
The `ssl` module does not advertise support for TLS 1.2.
44893
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    19
Please make sure that your Python installation was compiled against an OpenSSL
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    20
version enabling these features (likely this requires the OpenSSL version to
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    21
be at least 1.0.1).
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    22
"""
48827
1371c18e467d setup: remove printf trampoline
Augie Fackler <augie@google.com>
parents: 48826
diff changeset
    23
    print(error, file=sys.stderr)
44893
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    24
    sys.exit(1)
95c832849955 setup: require that Python has TLS 1.1 or TLS 1.2
Manuel Jacob <me@manueljacob.de>
parents: 44874
diff changeset
    25
48830
3491c450dcae setup: remove Python 2 support code for determining dylib suffix
Augie Fackler <augie@google.com>
parents: 48829
diff changeset
    26
DYLIB_SUFFIX = sysconfig.get_config_vars()['EXT_SUFFIX']
42457
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
    27
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    28
# Solaris Python packaging brain damage
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    29
try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    30
    import hashlib
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    31
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    32
    sha = hashlib.sha1()
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
    33
except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    34
    try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    35
        import sha
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    36
52320
ad23dc96e7d6 setup_py: simpler silence warnings unused-import
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52319
diff changeset
    37
        del sha  # silence unused import warning
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
    38
    except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    39
        raise SystemExit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    40
            "Couldn't import standard hashlib (incomplete Python install)."
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    41
        )
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    42
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    43
try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    44
    import zlib
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    45
52320
ad23dc96e7d6 setup_py: simpler silence warnings unused-import
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52319
diff changeset
    46
    del zlib  # silence unused import warning
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
    47
except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    48
    raise SystemExit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    49
        "Couldn't import standard zlib (incomplete Python install)."
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    50
    )
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    51
10761
16a13fdb4b36 setup: fail if bz2 is not available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10521
diff changeset
    52
try:
52318
7606466300c1 setup_py: remove IronPython Python 2.7 specific code
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52317
diff changeset
    53
    import bz2
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
    54
52320
ad23dc96e7d6 setup_py: simpler silence warnings unused-import
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52319
diff changeset
    55
    del bz2  # silence unused import warning
52318
7606466300c1 setup_py: remove IronPython Python 2.7 specific code
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52317
diff changeset
    56
except ImportError:
7606466300c1 setup_py: remove IronPython Python 2.7 specific code
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52317
diff changeset
    57
    raise SystemExit(
7606466300c1 setup_py: remove IronPython Python 2.7 specific code
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52317
diff changeset
    58
        "Couldn't import standard bz2 (incomplete Python install)."
7606466300c1 setup_py: remove IronPython Python 2.7 specific code
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52317
diff changeset
    59
    )
10761
16a13fdb4b36 setup: fail if bz2 is not available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10521
diff changeset
    60
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    61
from setuptools import setup, Command, Extension, Distribution
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    62
from setuptools.command.build import build
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    63
from setuptools.command.build_ext import build_ext
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    64
from setuptools.command.build_py import build_py
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    65
from setuptools.command.install import install
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    66
from setuptools.command.install_lib import install_lib
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    67
from setuptools.command.install_scripts import install_scripts
24192
390410a6545d setup.py: do not install c extensions on pypy
Joan Massich <mailsik@gmail.com>
parents: 24191
diff changeset
    68
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    69
from setuptools.errors import (
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    70
    CCompilerError,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    71
    BaseError as DistutilsError,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    72
    ExecError as DistutilsExecError,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    73
)
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    74
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    75
# no setuptools.command.build_scripts
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
    76
from distutils.command.build_scripts import build_scripts
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    77
51845
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
    78
from distutils.spawn import spawn
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
    79
from distutils import file_util
49879
dd804d83822c setup: drop legacy osx compiler tuning to enable universal builds
Matt Harbison <matt_harbison@yahoo.com>
parents: 49845
diff changeset
    80
from distutils.sysconfig import get_python_inc
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    81
from distutils.ccompiler import new_compiler
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    82
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
    83
ispypy = "PyPy" in sys.version
40446
b6bc2293cdf3 setup: explain to distutils how we write rc versions
"Paul Morelle <paul.morelle@octobus.net"
parents: 40397
diff changeset
    84
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
    85
52319
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    86
def sysstr(s):
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    87
    return s.decode('latin-1')
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    88
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    89
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    90
def eprint(*args, **kwargs):
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    91
    kwargs['file'] = sys.stderr
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    92
    print(*args, **kwargs)
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    93
fcc059b1eed0 setup_py: function defs after imports
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52318
diff changeset
    94
35229
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
    95
def write_if_changed(path, content):
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
    96
    """Write content to a file iff the content hasn't changed."""
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
    97
    if os.path.exists(path):
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
    98
        with open(path, 'rb') as fh:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
    99
            current = fh.read()
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   100
    else:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   101
        current = b''
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   102
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   103
    if current != content:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   104
        with open(path, 'wb') as fh:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   105
            fh.write(content)
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   106
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   107
6513
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   108
scripts = ['hg']
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   109
if os.name == 'nt':
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   110
    # We remove hg.bat if we are able to build hg.exe.
6513
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   111
    scripts.append('contrib/win32/hg.bat')
3893
070628929e1f Fix setup.py warning
Matt Mackall <mpm@selenic.com>
parents: 3892
diff changeset
   112
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   113
31559
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   114
def cancompile(cc, code):
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   115
    tmpdir = tempfile.mkdtemp(prefix='hg-install-')
52322
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   116
    oldstderr = None
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   117
    try:
31559
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   118
        fname = os.path.join(tmpdir, 'testcomp.c')
52322
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   119
        with open(fname, 'w') as file:
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   120
            file.write(code)
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   121
        oldstderr = os.dup(sys.stderr.fileno())
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   122
        # Redirect stderr to /dev/null to hide any error messages
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   123
        # from the compiler.
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   124
        # This will have to be changed if we ever have to check
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   125
        # for a function on Windows.
52322
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   126
        with open('/dev/null', 'w') as devnull:
40f649592ba9 setup_py: simplify cancompile with 'with open(...)'
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52321
diff changeset
   127
            os.dup2(devnull.fileno(), sys.stderr.fileno())
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   128
        objects = cc.compile([fname], output_dir=tmpdir)
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   129
        cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   130
        return True
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   131
    except Exception:
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   132
        return False
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   133
    finally:
6373
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   134
        if oldstderr is not None:
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   135
            os.dup2(oldstderr, sys.stderr.fileno())
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   136
        shutil.rmtree(tmpdir)
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   137
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   138
31559
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   139
# simplified version of distutils.ccompiler.CCompiler.has_function
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   140
# that actually removes its temporary files.
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   141
def hasfunction(cc, funcname):
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   142
    code = 'int main(void) { %s(); }\n' % funcname
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   143
    return cancompile(cc, code)
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31316
diff changeset
   144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   145
31560
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31559
diff changeset
   146
def hasheader(cc, headername):
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31559
diff changeset
   147
    code = '#include <%s>\nint main(void) { return 0; }\n' % headername
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31559
diff changeset
   148
    return cancompile(cc, code)
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31559
diff changeset
   149
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   150
1283
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   151
# py2exe needs to be installed to work
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   152
try:
1294
372971e1c40d Clean up whitespace damage.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1284
diff changeset
   153
    import py2exe
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   154
49073
97f2554cb647 setup: fix the py2exe logic to work with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 49038
diff changeset
   155
    py2exe.patch_distutils()
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
   156
    py2exeloaded = True
15527
9926aab3d0b5 setup: fix py2exe generation broken by c3a6ec304055 (issue3116)
Pascal Quantin <pascal.quantin@gmail.com>
parents: 15523
diff changeset
   157
    # import py2exe's patched Distribution class
9926aab3d0b5 setup: fix py2exe generation broken by c3a6ec304055 (issue3116)
Pascal Quantin <pascal.quantin@gmail.com>
parents: 15523
diff changeset
   158
    from distutils.core import Distribution
1284
59d07a6bd513 Fix Volker's modifications to setup.py for non-Windows systems.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1283
diff changeset
   159
except ImportError:
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
   160
    py2exeloaded = False
1283
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   161
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   162
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   163
def runcmd(cmd, env, cwd=None):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   164
    p = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   165
        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd=cwd
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   166
    )
32886
19b0fd4b5570 plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents: 32782
diff changeset
   167
    out, err = p.communicate()
33111
87ee783f7299 setup: update runcmd() to also return the exit status
Adam Simpkins <simpkins@fb.com>
parents: 33110
diff changeset
   168
    return p.returncode, out, err
13636
4bfff063aed6 setup: fix mac build broken by e42d18538e1d
Jon M. Dugan <jdugan@x1024.net>
parents: 13594
diff changeset
   169
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   170
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48850
diff changeset
   171
class hgcommand:
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   172
    def __init__(self, cmd, env):
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   173
        self.cmd = cmd
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   174
        self.env = env
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   175
51157
3c5b66d03c37 setup: make debug simpler by adding a `__repr__` to `hgcommand`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50984
diff changeset
   176
    def __repr__(self):
3c5b66d03c37 setup: make debug simpler by adding a `__repr__` to `hgcommand`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50984
diff changeset
   177
        return f"<hgcommand cmd={self.cmd} env={self.env}>"
3c5b66d03c37 setup: make debug simpler by adding a `__repr__` to `hgcommand`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50984
diff changeset
   178
33113
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   179
    def run(self, args):
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   180
        cmd = self.cmd + args
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   181
        returncode, out, err = runcmd(cmd, self.env)
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   182
        err = filterhgerr(err)
49971
ac93876ea2df setup: treat error output and non-zero return code differently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49970
diff changeset
   183
        if err:
48827
1371c18e467d setup: remove printf trampoline
Augie Fackler <augie@google.com>
parents: 48826
diff changeset
   184
            print("stderr from '%s':" % (' '.join(cmd)), file=sys.stderr)
1371c18e467d setup: remove printf trampoline
Augie Fackler <augie@google.com>
parents: 48826
diff changeset
   185
            print(err, file=sys.stderr)
49971
ac93876ea2df setup: treat error output and non-zero return code differently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49970
diff changeset
   186
        if returncode != 0:
51556
ee132657647d setup: display return code information about failed `hg` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51158
diff changeset
   187
            print(
ee132657647d setup: display return code information about failed `hg` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51158
diff changeset
   188
                "non zero-return '%s': %d" % (' '.join(cmd), returncode),
ee132657647d setup: display return code information about failed `hg` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51158
diff changeset
   189
                file=sys.stderr,
ee132657647d setup: display return code information about failed `hg` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51158
diff changeset
   190
            )
44603
bda050bc9987 py3: make setup.py's hgcommand() consistently return bytes
Martin von Zweigbergk <martinvonz@google.com>
parents: 44378
diff changeset
   191
            return b''
33113
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   192
        return out
8548
3ccbe42ff72f setup: read .hg_archival.txt for version info (issue1670)
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8547
diff changeset
   193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   194
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   195
def filterhgerr(err):
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   196
    # If root is executing setup.py, but the repository is owned by
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   197
    # another user (as in "sudo python setup.py install") we will get
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   198
    # trust warnings since the .hg/hgrc file is untrusted. That is
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   199
    # fine, we don't want to load it anyway.  Python may warn about
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   200
    # a missing __init__.py in mercurial/locale, we also ignore that.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   201
    err = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   202
        e
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   203
        for e in err.splitlines()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   204
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   205
            not e.startswith(b'not trusting file')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   206
            and not e.startswith(b'warning: Not importing')
51628
bf1d26bd5b6a obsolete: quote the feature name
Joerg Sonnenberger <joerg@bec.de>
parents: 51556
diff changeset
   207
            and not (
bf1d26bd5b6a obsolete: quote the feature name
Joerg Sonnenberger <joerg@bec.de>
parents: 51556
diff changeset
   208
                e.startswith(b'obsolete feature not enabled')
bf1d26bd5b6a obsolete: quote the feature name
Joerg Sonnenberger <joerg@bec.de>
parents: 51556
diff changeset
   209
                or e.startswith(b'"obsolete" feature not enabled')
bf1d26bd5b6a obsolete: quote the feature name
Joerg Sonnenberger <joerg@bec.de>
parents: 51556
diff changeset
   210
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   211
            and not e.startswith(b'*** failed to import extension')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   212
            and not e.startswith(b'devel-warn:')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   213
            and not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   214
                e.startswith(b'(third party extension')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   215
                and e.endswith(b'or newer of Mercurial; disabling)')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   216
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   217
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   218
    ]
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   219
    return b'\n'.join(b'  ' + e for e in err)
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   220
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   221
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   222
def findhg():
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   223
    """Try to figure out how we should invoke hg for examining the local
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   224
    repository contents.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   225
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   226
    Returns an hgcommand object."""
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   227
    # By default, prefer the "hg" command in the user's path.  This was
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   228
    # presumably the hg command that the user used to create this repository.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   229
    #
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   230
    # This repository may require extensions or other settings that would not
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   231
    # be enabled by running the hg script directly from this local repository.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   232
    hgenv = os.environ.copy()
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   233
    # Use HGPLAIN to disable hgrc settings that would change output formatting,
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   234
    # and disable localization for the same reasons.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   235
    hgenv['HGPLAIN'] = '1'
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   236
    hgenv['LANGUAGE'] = 'C'
52661
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   237
    # PYTHONPATH and co can be used for isolated builds, which can break hg
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   238
    hgenv.pop("PYTHONNOUSERSITE", None)
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   239
    if "PYTHONPATH" in hgenv:
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   240
        hgenv["PYTHONPATH"] = os.pathsep.join(
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   241
            [
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   242
                path
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   243
                for path in hgenv["PYTHONPATH"].split(os.pathsep)
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   244
                if "-build-env-" not in path
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   245
            ]
958d5c998505 setup-py: weaken build isolation when calling hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52640
diff changeset
   246
        )
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   247
    hgcmd = ['hg']
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   248
    # Run a simple "hg log" command just to see if using hg from the user's
40980
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   249
    # path works and can successfully interact with this repository.  Windows
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   250
    # gives precedence to hg.exe in the current directory, so fall back to the
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   251
    # python invocation of local hg, where pythonXY.dll can always be found.
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   252
    check_cmd = ['log', '-r.', '-Ttest']
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   253
    attempts = []
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   254
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   255
    def attempt(cmd, env):
40980
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   256
        try:
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   257
            retcode, out, err = runcmd(hgcmd + check_cmd, hgenv)
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   258
            res = (True, retcode, out, err)
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   259
            if retcode == 0 and not filterhgerr(err):
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   260
                return True
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52448
diff changeset
   261
        except OSError as e:
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   262
            res = (False, e)
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   263
        attempts.append((cmd, res))
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   264
        return False
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   265
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   266
    if os.name != 'nt' or not os.path.exists("hg.exe"):
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   267
        if attempt(hgcmd + check_cmd, hgenv):
40980
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40967
diff changeset
   268
            return hgcommand(hgcmd, hgenv)
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   269
51158
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   270
    # Fall back to trying the local hg installation (pure python)
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   271
    repo_hg = os.path.join(os.path.dirname(__file__), 'hg')
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   272
    hgenv = localhgenv()
51158
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   273
    hgcmd = [sys.executable, repo_hg]
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   274
    if attempt(hgcmd + check_cmd, hgenv):
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   275
        return hgcommand(hgcmd, hgenv)
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   276
    # Fall back to trying the local hg installation (whatever we can)
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   277
    hgenv = localhgenv(pure_python=False)
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   278
    hgcmd = [sys.executable, repo_hg]
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   279
    if attempt(hgcmd + check_cmd, hgenv):
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   280
        return hgcommand(hgcmd, hgenv)
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   281
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   282
    eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   283
    eprint(r"/!\ Unable to find a working hg binary")
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   284
    eprint(r"/!\ Version cannot be extracted from the repository")
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   285
    eprint(r"/!\ Re-run the setup once a first version is built")
50927
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   286
    eprint(r"/!\ Attempts:")
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   287
    for i, e in enumerate(attempts):
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   288
        eprint(r"/!\   attempt #%d:" % (i))
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   289
        eprint(r"/!\     cmd:        ", e[0])
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   290
        res = e[1]
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   291
        if res[0]:
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   292
            eprint(r"/!\     return code:", res[1])
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   293
            eprint("/!\\     std output:\n%s" % (res[2].decode()), end="")
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   294
            eprint("/!\\     std error:\n%s" % (res[3].decode()), end="")
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   295
        else:
5dc7e1907e48 setup: make the error "Unable to find a working hg binary" more informative
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50730
diff changeset
   296
            eprint(r"/!\     exception:  ", res[1])
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   297
    return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   298
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   299
51158
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   300
def localhgenv(pure_python=True):
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   301
    """Get an environment dictionary to use for invoking or importing
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   302
    mercurial from the local repository."""
33112
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   303
    # Execute hg out of this directory with a custom environment which takes
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   304
    # care to not use any hgrc files and do no localization.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   305
    env = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   306
        'HGRCPATH': '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   307
        'LANGUAGE': 'C',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   308
        'PATH': '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   309
    }  # make pypi modules that use os.environ['PATH'] happy
51158
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   310
    if pure_python:
f816ca29a285 setup: try a non-pure version of the local Mercurial if the pure fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51157
diff changeset
   311
        env['HGMODULEPOLICY'] = 'py'
33112
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   312
    if 'LD_LIBRARY_PATH' in os.environ:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   313
        env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   314
    if 'SystemRoot' in os.environ:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   315
        # SystemRoot is required by Windows to load various DLLs.  See:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   316
        # https://bugs.python.org/issue13524#msg148850
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   317
        env['SystemRoot'] = os.environ['SystemRoot']
33117
6ef5f0c95d64 setup: fix localhgenv
Jun Wu <quark@fb.com>
parents: 33114
diff changeset
   318
    return env
33112
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   319
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   320
33112
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33111
diff changeset
   321
version = ''
15367
b357a972d6cd setup: set env global earlier (3073)
Matt Mackall <mpm@selenic.com>
parents: 15215
diff changeset
   322
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   323
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   324
def _try_get_version():
33114
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33113
diff changeset
   325
    hg = findhg()
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   326
    if hg is None:
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   327
        return ''
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   328
    hgid = None
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   329
    numerictags = []
33113
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   330
    cmd = ['log', '-r', '.', '--template', '{tags}\n']
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   331
    pieces = sysstr(hg.run(cmd)).split()
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   332
    numerictags = [t for t in pieces if t[0:1].isdigit()]
35246
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35229
diff changeset
   333
    hgid = sysstr(hg.run(['id', '-i'])).strip()
50168
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   334
    if hgid.count('+') == 2:
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   335
        hgid = hgid.replace("+", ".", 1)
33110
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33103
diff changeset
   336
    if not hgid:
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   337
        eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   338
        eprint(r"/!\ Unable to determine hg version from local repository")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   339
        eprint(r"/!\ Failed to retrieve current revision tags")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   340
        return ''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   341
    if numerictags:  # tag(s) found
52235
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   342
        return _version(tag=numerictags[-1], dirty=hgid.endswith('+'))
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   343
    else:  # no tag found on the checked out revision
50168
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   344
        ltagcmd = ['log', '--rev', 'wdir()', '--template', '{latesttag}']
35246
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35229
diff changeset
   345
        ltag = sysstr(hg.run(ltagcmd))
49970
8d390a13474d setup: make the version computation process more resistant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49830
diff changeset
   346
        if not ltag:
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   347
            eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   348
            eprint(r"/!\ Unable to determine hg version from local repository")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   349
            eprint(
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   350
                r"/!\ Failed to retrieve current revision distance to lated tag"
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   351
            )
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   352
            return ''
50168
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   353
        changessincecmd = [
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   354
            'log',
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   355
            '-T',
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   356
            'x\n',
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   357
            '-r',
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   358
            "only(parents(),'%s')" % ltag,
593f5e4076ff setup: support building from an ongoing merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50092
diff changeset
   359
        ]
33113
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33112
diff changeset
   360
        changessince = len(hg.run(changessincecmd).splitlines())
52214
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   361
        branch = hg.run(["branch"]).strip()
52235
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   362
        return _version(
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   363
            tag=ltag,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   364
            branch=branch,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   365
            hgid=hgid.rstrip('+'),
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   366
            changes_since=changessince,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   367
            dirty=hgid.endswith('+'),
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   368
        )
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   369
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   370
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   371
def _version(
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   372
    tag: str,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   373
    branch: str = '',
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   374
    hgid: str = '',
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   375
    changes_since: int = 0,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   376
    dirty: bool = False,
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   377
):
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   378
    """compute a version number from available information"""
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   379
    version = tag
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   380
    if changes_since > 0:
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   381
        assert branch
52214
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   382
        if branch == b'stable':
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   383
            post_nb = 0
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   384
        elif branch == b'default':
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   385
            # we use 1 here to be greater than 0 to make sure change from
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   386
            # default are considered newer than change on stable
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   387
            post_nb = 1
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   388
        else:
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   389
            # what is this branch ? probably a local variant ?
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   390
            post_nb = 2
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   391
52235
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   392
        assert hgid
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   393
52214
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   394
        # logic of the scheme
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   395
        # - '.postX' to mark the version as "above" the tagged version
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   396
        #   X is 0 for stable, 1 for default, 2 for anything else
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   397
        # - use '.devY'
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   398
        #   Y is the number of extra revision compared to the tag. So that
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   399
        #   revision with more change are "above" previous ones.
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   400
        # - '+hg.NODEID.local.DATE' if there is any uncommitted changes.
52235
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   401
        version += '.post%d.dev%d+hg.%s' % (post_nb, changes_since, hgid)
35a9b6d3b484 setup: factor version computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52234
diff changeset
   402
    if dirty:
52214
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   403
        version = version[:-1] + '.local.' + time.strftime('%Y%m%d')
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   404
    # try to give warning early about bad version if possible
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   405
    try:
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   406
        from packaging.version import Version
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   407
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   408
        Version(version)
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   409
    except ImportError:
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   410
        pass
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   411
    except ValueError as exc:
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   412
        eprint(r"/!\ generated version is invalid")
9048a0d782e1 dev-version: change the scheme of non tagged version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52194
diff changeset
   413
        eprint(r"/!\ error: %s" % exc)
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   414
    return version
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   415
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   416
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   417
if os.path.isdir('.hg'):
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   418
    version = _try_get_version()
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   419
elif os.path.exists('.hg_archival.txt'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   420
    kw = dict(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   421
        [[t.strip() for t in l.split(':', 1)] for l in open('.hg_archival.txt')]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   422
    )
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   423
    if 'tag' in kw:
52236
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   424
        version = _version(tag=kw['tag'])
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   425
    elif 'latesttag' in kw:
52236
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   426
        distance = int(kw.get('changessincelatesttag', kw['latesttagdistance']))
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   427
        version = _version(
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   428
            tag=kw['latesttag'],
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   429
            branch=kw['branch'],
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   430
            changes_since=distance,
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   431
            hgid=kw['node'][:12],
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   432
        )
8547
548fd7a05373 setup.py: subprocess instead of os.popen, sys.stderr.write instead of print
Christian Ebert <blacktrash@gmx.net>
parents: 8494
diff changeset
   433
    else:
52236
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   434
        version = _version(
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   435
            tag='0',
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   436
            branch='unknown-source',
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   437
            changes_since=1,
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   438
            hgid=kw.get('node', 'unknownid')[:12],
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   439
            dirty=True,
2b7e3177f99c setup: use the same code to compute tag from archive
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52235
diff changeset
   440
        )
46996
8d2b62d716b0 packaging: extract pre-computed version when running from plain tarball
Joerg Sonnenberger <joerg@bec.de>
parents: 46869
diff changeset
   441
elif os.path.exists('mercurial/__version__.py'):
47007
fceccc36873d lint: fix failing code check
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46996
diff changeset
   442
    with open('mercurial/__version__.py') as f:
fceccc36873d lint: fix failing code check
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46996
diff changeset
   443
        data = f.read()
46996
8d2b62d716b0 packaging: extract pre-computed version when running from plain tarball
Joerg Sonnenberger <joerg@bec.de>
parents: 46869
diff changeset
   444
    version = re.search('version = b"(.*)"', data).group(1)
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   445
if not version:
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   446
    if os.environ.get("MERCURIAL_SETUP_MAKE_LOCAL") == "1":
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   447
        version = "0.0+0"
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   448
        eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   449
        eprint(r"/!\ Using '0.0+0' as the default version")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   450
        eprint(r"/!\ Re-run make local once that first version is built")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   451
        eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   452
    else:
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   453
        eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   454
        eprint(r"/!\ Could not determine the Mercurial version")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   455
        eprint(r"/!\ You need to build a local version first")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   456
        eprint(r"/!\ Run `make local` and try again")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   457
        eprint("/!\\")
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   458
        msg = "Run `make local` first to get a working local version"
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   459
        raise SystemExit(msg)
35229
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   460
50092
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   461
versionb = version
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   462
if not isinstance(versionb, bytes):
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   463
    versionb = versionb.encode('ascii')
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   464
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   465
write_if_changed(
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   466
    'mercurial/__version__.py',
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   467
    b''.join(
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   468
        [
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   469
            b'# this file is autogenerated by setup.py\n'
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   470
            b'version = b"%s"\n' % versionb,
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   471
        ]
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   472
    ),
010a1e73f69e setup: further improve the error path for version retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49971
diff changeset
   473
)
8493
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   474
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   475
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   476
class hgbuild(build):
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   477
    # Insert hgbuildmo first so that files in mercurial/locale/ are found
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   478
    # when build_py is run next.
28398
712298942c82 setup: remove support for 2to3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28041
diff changeset
   479
    sub_commands = [('build_mo', None)] + build.sub_commands
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   480
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   481
15523
f9da84a950d0 setup: backout 8504699d1aa6
Matt Mackall <mpm@selenic.com>
parents: 15500
diff changeset
   482
class hgbuildmo(build):
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   483
    description = "build translations (.mo files)"
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   484
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   485
    def run(self):
52194
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   486
        result = self._run()
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   487
        if (
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   488
            not result
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   489
            and os.environ.get('MERCURIAL_SETUP_FORCE_TRANSLATIONS') == '1'
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   490
        ):
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   491
            raise DistutilsExecError("failed to build translations")
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   492
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   493
    def _run(self):
51845
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   494
        try:
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   495
            from shutil import which as find_executable
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   496
        except ImportError:
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   497
            # Deprecated in py3.12
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   498
            from distutils.spawn import find_executable
4dc1fc2b2f3a setup: avoid the deprecated `distutils.spawn.find_executable`
Matt Harbison <mharbison@atto.com>
parents: 51844
diff changeset
   499
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   500
        if not find_executable('msgfmt'):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   501
            logging.warning(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   502
                "could not find msgfmt executable, no translations "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   503
                "will be built"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   504
            )
52194
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   505
            return False
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   506
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   507
        podir = 'i18n'
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   508
        if not os.path.isdir(podir):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   509
            logging.warning("could not find %s/ directory", podir)
52194
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   510
            return False
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   511
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   512
        join = os.path.join
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   513
        for po in os.listdir(podir):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   514
            if not po.endswith('.po'):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   515
                continue
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   516
            pofile = join(podir, po)
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   517
            modir = join('locale', po[:-3], 'LC_MESSAGES')
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   518
            mofile = join(modir, 'hg.mo')
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   519
            mobuildfile = join('mercurial', mofile)
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   520
            cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
7720
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   521
            if sys.platform != 'sunos5':
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   522
                # msgfmt on Solaris does not know about -c
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   523
                cmd.append('-c')
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   524
            self.mkpath(join('mercurial', modir))
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   525
            self.make_file([pofile], mobuildfile, spawn, (cmd,))
52194
2c4283c9fa93 setup: add a way to force the setup to translate (or fail)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51999
diff changeset
   526
        return True
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   527
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   528
15458
c3a6ec304055 setup: subclass distribution instead of overwriting original
Simon Heimberg <simohe@besonet.ch>
parents: 15388
diff changeset
   529
class hgdist(Distribution):
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   530
    pure = False
44487
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   531
    rust = False
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   532
    no_rust = False
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   533
    cffi = ispypy
15458
c3a6ec304055 setup: subclass distribution instead of overwriting original
Simon Heimberg <simohe@besonet.ch>
parents: 15388
diff changeset
   534
41759
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41533
diff changeset
   535
    global_options = Distribution.global_options + [
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41533
diff changeset
   536
        ('pure', None, "use pure (slow) Python code instead of C extensions"),
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   537
        ('rust', None, "use Rust extensions additionally to C extensions"),
44487
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   538
        (
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   539
            'no-rust',
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   540
            None,
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   541
            "do not use Rust extensions additionally to C extensions",
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   542
        ),
41759
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41533
diff changeset
   543
    ]
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   544
44487
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   545
    negative_opt = Distribution.negative_opt.copy()
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   546
    boolean_options = ['pure', 'rust', 'no-rust']
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   547
    negative_opt['no-rust'] = 'rust'
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   548
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   549
    def _set_command_options(self, command_obj, option_dict=None):
44630
4c6189d45d67 setup: work around old versions of distutils breaking setup.py
Augie Fackler <augie@google.com>
parents: 44605
diff changeset
   550
        # Not all distutils versions in the wild have boolean_options.
4c6189d45d67 setup: work around old versions of distutils breaking setup.py
Augie Fackler <augie@google.com>
parents: 44605
diff changeset
   551
        # This should be cleaned up when we're Python 3 only.
4c6189d45d67 setup: work around old versions of distutils breaking setup.py
Augie Fackler <augie@google.com>
parents: 44605
diff changeset
   552
        command_obj.boolean_options = (
4c6189d45d67 setup: work around old versions of distutils breaking setup.py
Augie Fackler <augie@google.com>
parents: 44605
diff changeset
   553
            getattr(command_obj, 'boolean_options', []) + self.boolean_options
4c6189d45d67 setup: work around old versions of distutils breaking setup.py
Augie Fackler <augie@google.com>
parents: 44605
diff changeset
   554
        )
44487
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   555
        return Distribution._set_command_options(
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   556
            self, command_obj, option_dict=option_dict
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   557
        )
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   558
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   559
    def parse_command_line(self):
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   560
        ret = Distribution.parse_command_line(self)
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   561
        if not (self.rust or self.no_rust):
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   562
            hgrustext = os.environ.get('HGWITHRUSTEXT')
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   563
            # TODO record it for proper rebuild upon changes
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   564
            # (see mercurial/__modulepolicy__.py)
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   565
            if hgrustext != 'cpython' and hgrustext is not None:
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   566
                if hgrustext:
48423
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48303
diff changeset
   567
                    msg = 'unknown HGWITHRUSTEXT value: %s' % hgrustext
48827
1371c18e467d setup: remove printf trampoline
Augie Fackler <augie@google.com>
parents: 48826
diff changeset
   568
                    print(msg, file=sys.stderr)
44487
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   569
                hgrustext = None
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   570
            self.rust = hgrustext is not None
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   571
            self.no_rust = not self.rust
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   572
        return ret
06b0aa048007 setup-rust: add a --no-rust flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44485
diff changeset
   573
15459
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   574
    def has_ext_modules(self):
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   575
        # self.ext_modules is emptied in hgbuildpy.finalize_options which is
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   576
        # too late for some cases
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   577
        return not self.pure and Distribution.has_ext_modules(self)
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   578
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   579
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   580
# This is ugly as a one-liner. So use a variable.
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   581
buildextnegops = dict(getattr(build_ext, 'negative_options', {}))
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   582
buildextnegops['no-zstd'] = 'zstd'
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   583
buildextnegops['no-rust'] = 'rust'
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   584
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   585
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   586
class hgbuildext(build_ext):
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   587
    user_options = build_ext.user_options + [
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   588
        ('zstd', None, 'compile zstd bindings [default]'),
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   589
        ('no-zstd', None, 'do not compile zstd bindings'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   590
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   591
            'rust',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   592
            None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   593
            'compile Rust extensions if they are in use '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   594
            '(requires Cargo) [default]',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   595
        ),
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   596
        ('no-rust', None, 'do not compile Rust extensions'),
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   597
    ]
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   598
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   599
    boolean_options = build_ext.boolean_options + ['zstd', 'rust']
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   600
    negative_opt = buildextnegops
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   601
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   602
    def initialize_options(self):
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   603
        self.zstd = True
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   604
        self.rust = True
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   605
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   606
        return build_ext.initialize_options(self)
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   607
43044
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   608
    def finalize_options(self):
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   609
        # Unless overridden by the end user, build extensions in parallel.
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   610
        # Only influences behavior on Python 3.5+.
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   611
        if getattr(self, 'parallel', None) is None:
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   612
            self.parallel = True
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   613
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   614
        return build_ext.finalize_options(self)
f9d35f01b8b3 setup: build extensions in parallel by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42813
diff changeset
   615
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   616
    def build_extensions(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   617
        ruststandalones = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   618
            e for e in self.extensions if isinstance(e, RustStandaloneExtension)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   619
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   620
        self.extensions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   621
            e for e in self.extensions if e not in ruststandalones
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   622
        ]
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   623
        # Filter out zstd if disabled via argument.
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   624
        if not self.zstd:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   625
            self.extensions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   626
                e for e in self.extensions if e.name != 'mercurial.zstd'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   627
            ]
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   628
48502
23ce9e7bf1e5 setup.py: fix some documentation typos
Matt Harbison <matt_harbison@yahoo.com>
parents: 48423
diff changeset
   629
        # Build Rust standalone extensions if it'll be used
23ce9e7bf1e5 setup.py: fix some documentation typos
Matt Harbison <matt_harbison@yahoo.com>
parents: 48423
diff changeset
   630
        # and its build is not explicitly disabled (for external build
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   631
        # as Linux distributions would do)
44466
79ac59d3f73d setup-rust: remove the legacy 'direct-ffi' variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44452
diff changeset
   632
        if self.distribution.rust and self.rust:
46369
cabc5e9366c5 rust: lower compile error on non-linux platforms to a warning
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 46315
diff changeset
   633
            if not sys.platform.startswith('linux'):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   634
                logging.warning(
46369
cabc5e9366c5 rust: lower compile error on non-linux platforms to a warning
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 46315
diff changeset
   635
                    "rust extensions have only been tested on Linux "
cabc5e9366c5 rust: lower compile error on non-linux platforms to a warning
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 46315
diff changeset
   636
                    "and may not behave correctly on other platforms"
cabc5e9366c5 rust: lower compile error on non-linux platforms to a warning
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 46315
diff changeset
   637
                )
cabc5e9366c5 rust: lower compile error on non-linux platforms to a warning
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 46315
diff changeset
   638
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   639
            for rustext in ruststandalones:
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   640
                rustext.build('' if self.inplace else self.build_lib)
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
   641
30450
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30436
diff changeset
   642
        return build_ext.build_extensions(self)
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   643
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   644
    def build_extension(self, ext):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   645
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   646
            self.distribution.rust
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   647
            and self.rust
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   648
            and isinstance(ext, RustExtension)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   649
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   650
            ext.rustbuild()
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   651
        try:
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   652
            build_ext.build_extension(self, ext)
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   653
        except CCompilerError:
12501
98f21e4d9633 setup: slight simplification
Martin Geisler <mg@lazybytes.net>
parents: 11533
diff changeset
   654
            if not getattr(ext, 'optional', False):
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   655
                raise
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   656
            logging.warning(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   657
                "Failed to build optional extension '%s' (skipping)", ext.name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   658
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   659
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   660
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   661
class hgbuildscripts(build_scripts):
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   662
    def run(self):
28041
8da94662afe5 setup: avoid procedure related to hg.exe at setup.py --pure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27925
diff changeset
   663
        if os.name != 'nt' or self.distribution.pure:
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   664
            return build_scripts.run(self)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   665
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   666
        exebuilt = False
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   667
        try:
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   668
            self.run_command('build_hgexe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   669
            exebuilt = True
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   670
        except (DistutilsError, CCompilerError):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   671
            logging.warning('failed to build optional hg.exe')
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   672
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   673
        if exebuilt:
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   674
            # Copying hg.exe to the scripts build directory ensures it is
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   675
            # installed by the install_scripts command.
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   676
            hgexecommand = self.get_finalized_command('build_hgexe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   677
            dest = os.path.join(self.build_dir, 'hg.exe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   678
            self.mkpath(self.build_dir)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   679
            self.copy_file(hgexecommand.hgexepath, dest)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   680
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   681
            # Remove hg.bat because it is redundant with hg.exe.
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   682
            self.scripts.remove('contrib/win32/hg.bat')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   683
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   684
        return build_scripts.run(self)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   685
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   686
10000
16f49d671c7f setup: cleanup coding style
Martin Geisler <mg@lazybytes.net>
parents: 9999
diff changeset
   687
class hgbuildpy(build_py):
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   688
    def finalize_options(self):
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   689
        build_py.finalize_options(self)
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   690
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   691
        if self.distribution.pure:
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   692
            self.distribution.ext_modules = []
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   693
        elif self.distribution.cffi:
30346
9cc438bf7d9a setup: move cffi stuff to mercurial/cffi
Jun Wu <quark@fb.com>
parents: 29833
diff changeset
   694
            from mercurial.cffi import (
32505
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32420
diff changeset
   695
                bdiffbuild,
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32420
diff changeset
   696
                mpatchbuild,
30346
9cc438bf7d9a setup: move cffi stuff to mercurial/cffi
Jun Wu <quark@fb.com>
parents: 29833
diff changeset
   697
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   698
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   699
            exts = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   700
                mpatchbuild.ffi.distutils_extension(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   701
                bdiffbuild.ffi.distutils_extension(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   702
            ]
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   703
            # cffi modules go here
29600
7a157639b8f2 osutil: add darwin-only version of os.listdir using cffi
Maciej Fijalkowski <fijall@gmail.com>
parents: 29541
diff changeset
   704
            if sys.platform == 'darwin':
32505
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32420
diff changeset
   705
                from mercurial.cffi import osutilbuild
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   706
32505
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32420
diff changeset
   707
                exts.append(osutilbuild.ffi.distutils_extension())
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   708
            self.distribution.ext_modules = exts
12649
6c0e1aee1b19 setup: user-friendly error message if Python headers are missing
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12501
diff changeset
   709
        else:
18905
012780620d4f setup: make error message for missing Python headers more helpful
Mads Kiilerich <mads@kiilerich.com>
parents: 18900
diff changeset
   710
            h = os.path.join(get_python_inc(), 'Python.h')
012780620d4f setup: make error message for missing Python headers more helpful
Mads Kiilerich <mads@kiilerich.com>
parents: 18900
diff changeset
   711
            if not os.path.exists(h):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   712
                raise SystemExit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   713
                    'Python headers are required to build '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   714
                    'Mercurial but weren\'t found in %s' % h
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   715
                )
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   716
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   717
    def run(self):
32655
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32647
diff changeset
   718
        basepath = os.path.join(self.build_lib, 'mercurial')
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32647
diff changeset
   719
        self.mkpath(basepath)
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32647
diff changeset
   720
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   721
        rust = self.distribution.rust
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   722
        if self.distribution.pure:
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   723
            modulepolicy = 'py'
32251
a04f5c651e52 policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents: 32233
diff changeset
   724
        elif self.build_lib == '.':
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   725
            # in-place build should run without rebuilding and Rust extensions
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   726
            modulepolicy = 'rust+c-allow' if rust else 'allow'
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   727
        else:
42453
94167e701e12 rust: new rust options in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42451
diff changeset
   728
            modulepolicy = 'rust+c' if rust else 'c'
35229
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35103
diff changeset
   729
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   730
        content = b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   731
            [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   732
                b'# this file is autogenerated by setup.py\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   733
                b'modulepolicy = b"%s"\n' % modulepolicy.encode('ascii'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   734
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   735
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   736
        write_if_changed(os.path.join(basepath, '__modulepolicy__.py'), content)
27222
511a4384b033 setup: refactor handling of modules with C/Python implementations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27220
diff changeset
   737
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   738
        build_py.run(self)
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   739
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   740
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   741
class buildhgextindex(Command):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   742
    description = 'generate prebuilt index of hgext (for frozen package)'
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   743
    user_options = []
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   744
    _indexfilename = 'hgext/__index__.py'
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   745
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   746
    def initialize_options(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   747
        pass
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   748
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   749
    def finalize_options(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   750
        pass
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   751
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   752
    def run(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   753
        if os.path.exists(self._indexfilename):
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   754
            with open(self._indexfilename, 'w') as f:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   755
                f.write('# empty\n')
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   756
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   757
        # here no extension enabled, disabled() lists up everything
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   758
        code = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   759
            'import pprint; from mercurial import extensions; '
44378
bb58931d0c4f setup: exclude the __index__ module from itself when generating
Matt Harbison <matt_harbison@yahoo.com>
parents: 44170
diff changeset
   760
            'ext = extensions.disabled();'
bb58931d0c4f setup: exclude the __index__ module from itself when generating
Matt Harbison <matt_harbison@yahoo.com>
parents: 44170
diff changeset
   761
            'ext.pop("__index__", None);'
bb58931d0c4f setup: exclude the __index__ module from itself when generating
Matt Harbison <matt_harbison@yahoo.com>
parents: 44170
diff changeset
   762
            'pprint.pprint(ext)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   763
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   764
        returncode, out, err = runcmd(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   765
            [sys.executable, '-c', code], localhgenv()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   766
        )
33111
87ee783f7299 setup: update runcmd() to also return the exit status
Adam Simpkins <simpkins@fb.com>
parents: 33110
diff changeset
   767
        if err or returncode != 0:
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   768
            raise DistutilsExecError(err)
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   769
42075
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   770
        with open(self._indexfilename, 'wb') as f:
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   771
            f.write(b'# this file is autogenerated by setup.py\n')
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   772
            f.write(b'docs = ')
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   773
            f.write(out)
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   774
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   775
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   776
class buildhgexe(build_ext):
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   777
    description = 'compile hg.exe from mercurial/exewrapper.c'
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   778
49396
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   779
    LONG_PATHS_MANIFEST = """\
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   780
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   781
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   782
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   783
    <security>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   784
      <requestedPrivileges>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   785
        <requestedExecutionLevel
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   786
          level="asInvoker"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   787
          uiAccess="false"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   788
        />
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   789
      </requestedPrivileges>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   790
    </security>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   791
  </trustInfo>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   792
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   793
    <application>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   794
      <!-- Windows Vista -->
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   795
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   796
      <!-- Windows 7 -->
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   797
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   798
      <!-- Windows 8 -->
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   799
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   800
      <!-- Windows 8.1 -->
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   801
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   802
      <!-- Windows 10 and Windows 11 -->
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   803
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   804
    </application>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   805
  </compatibility>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   806
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   807
    <windowsSettings
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   808
        xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   809
      <ws2:longPathAware>true</ws2:longPathAware>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   810
    </windowsSettings>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   811
  </application>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   812
  <dependency>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   813
    <dependentAssembly>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   814
      <assemblyIdentity type="win32"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   815
                        name="Microsoft.Windows.Common-Controls"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   816
                        version="6.0.0.0"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   817
                        processorArchitecture="*"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   818
                        publicKeyToken="6595b64144ccf1df"
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   819
                        language="*" />
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   820
    </dependentAssembly>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   821
  </dependency>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   822
</assembly>
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   823
"""
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   824
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   825
    def initialize_options(self):
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   826
        build_ext.initialize_options(self)
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   827
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   828
    def build_extensions(self):
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   829
        if os.name != 'nt':
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   830
            return
17246
bf5bb38bcc7c setup: fix build_hgexe for mingw32 compiler
Adrian Buehlmann <adrian@cadifra.com>
parents: 17121
diff changeset
   831
        if isinstance(self.compiler, HackedMingw32CCompiler):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   832
            self.compiler.compiler_so = self.compiler.compiler  # no -mdll
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   833
            self.compiler.dll_libraries = []  # no -lmsrvc90
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   834
43678
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   835
        pythonlib = None
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   836
49394
5cf73de964e1 setup: stop shadowing the builtin `dir` symbol
Matt Harbison <matt_harbison@yahoo.com>
parents: 49310
diff changeset
   837
        dirname = os.path.dirname(self.get_ext_fullpath('dummy'))
5cf73de964e1 setup: stop shadowing the builtin `dir` symbol
Matt Harbison <matt_harbison@yahoo.com>
parents: 49310
diff changeset
   838
        self.hgtarget = os.path.join(dirname, 'hg')
48303
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   839
43678
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   840
        if getattr(sys, 'dllhandle', None):
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   841
            # Different Python installs can have different Python library
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   842
            # names. e.g. the official CPython distribution uses pythonXY.dll
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   843
            # and MinGW uses libpythonX.Y.dll.
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   844
            _kernel32 = ctypes.windll.kernel32
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   845
            _kernel32.GetModuleFileNameA.argtypes = [
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   846
                ctypes.c_void_p,
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   847
                ctypes.c_void_p,
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   848
                ctypes.c_ulong,
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   849
            ]
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   850
            _kernel32.GetModuleFileNameA.restype = ctypes.c_ulong
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   851
            size = 1000
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   852
            buf = ctypes.create_string_buffer(size + 1)
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   853
            filelen = _kernel32.GetModuleFileNameA(
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   854
                sys.dllhandle, ctypes.byref(buf), size
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   855
            )
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   856
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   857
            if filelen > 0 and filelen != size:
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   858
                dllbasename = os.path.basename(buf.value)
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   859
                if not dllbasename.lower().endswith(b'.dll'):
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   860
                    raise SystemExit(
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   861
                        'Python DLL does not end with .dll: %s' % dllbasename
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   862
                    )
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   863
                pythonlib = dllbasename[:-4]
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   864
48303
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   865
                # Copy the pythonXY.dll next to the binary so that it runs
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   866
                # without tampering with PATH.
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   867
                dest = os.path.join(
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   868
                    os.path.dirname(self.hgtarget),
48829
fef4198c855c setup: inline os.fsdecode now that we're done with Python 2
Augie Fackler <augie@google.com>
parents: 48828
diff changeset
   869
                    os.fsdecode(dllbasename),
48303
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   870
                )
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   871
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   872
                if not os.path.exists(dest):
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   873
                    shutil.copy(buf.value, dest)
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   874
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   875
                # Also overwrite python3.dll so that hgext.git is usable.
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   876
                # TODO: also handle the MSYS flavor
48831
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   877
                python_x = os.path.join(
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   878
                    os.path.dirname(os.fsdecode(buf.value)),
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   879
                    "python3.dll",
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   880
                )
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   881
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   882
                if os.path.exists(python_x):
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   883
                    dest = os.path.join(
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   884
                        os.path.dirname(self.hgtarget),
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   885
                        os.path.basename(python_x),
48303
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   886
                    )
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   887
48831
40e35034eac8 setup: unconditionally do this python 3 step
Augie Fackler <augie@google.com>
parents: 48830
diff changeset
   888
                    shutil.copy(python_x, dest)
48303
2ce31dbde4b1 backout: backed out changeset f78d8b8c46d7
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48182
diff changeset
   889
43678
52e4bfebc4ba setup: conditionalize access to `sys.dllhandle` when building extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43676
diff changeset
   890
        if not pythonlib:
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   891
            logging.warning(
43675
666441b649e4 setup: combine two contiguous string literals
Matt Harbison <matt_harbison@yahoo.com>
parents: 43632
diff changeset
   892
                'could not determine Python DLL filename; assuming pythonXY'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   893
            )
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   894
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   895
            hv = sys.hexversion
43676
6a5dc4d767a0 setup: use bytes for assumed python version
Matt Harbison <matt_harbison@yahoo.com>
parents: 43675
diff changeset
   896
            pythonlib = b'python%d%d' % (hv >> 24, (hv >> 16) & 0xFF)
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   897
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   898
        logging.info('using %s as Python library name', pythonlib)
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   899
        with open('mercurial/hgpythonlib.h', 'wb') as f:
39608
ec68135a8935 py3: add b'' to some setup.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39572
diff changeset
   900
            f.write(b'/* this file is autogenerated by setup.py */\n')
ec68135a8935 py3: add b'' to some setup.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39572
diff changeset
   901
            f.write(b'#define HGPYTHONLIB "%s"\n' % pythonlib)
40397
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   902
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   903
        objects = self.compiler.compile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   904
            ['mercurial/exewrapper.c'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   905
            output_dir=self.build_temp,
48832
b07b034cf548 setup: inline now-constant list
Augie Fackler <augie@google.com>
parents: 48831
diff changeset
   906
            macros=[('_UNICODE', None), ('UNICODE', None)],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   907
        )
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
   908
        self.compiler.link_executable(objects, self.hgtarget, libraries=[])
49395
747c4fc20886 setup: unconditionally enable the `long-paths-support` option on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 49394
diff changeset
   909
747c4fc20886 setup: unconditionally enable the `long-paths-support` option on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 49394
diff changeset
   910
        self.addlongpathsmanifest()
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   911
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   912
    def addlongpathsmanifest(self):
49395
747c4fc20886 setup: unconditionally enable the `long-paths-support` option on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 49394
diff changeset
   913
        """Add manifest pieces so that hg.exe understands long paths
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   914
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   915
        Why resource #1 should be used for .exe manifests? I don't know and
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   916
        wasn't able to find an explanation for mortals. But it seems to work.
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   917
        """
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   918
        exefname = self.compiler.executable_filename(self.hgtarget)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   919
        fdauto, manfname = tempfile.mkstemp(suffix='.hg.exe.manifest')
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   920
        os.close(fdauto)
49396
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   921
        with open(manfname, 'w', encoding="UTF-8") as f:
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   922
            f.write(self.LONG_PATHS_MANIFEST)
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   923
        logging.info("long paths manifest is written to '%s'", manfname)
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   924
        outputresource = '-outputresource:%s;#1' % exefname
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   925
        logging.info("running mt.exe to update hg.exe's manifest in-place")
49396
ece490b02a9b setup: use the full executable manifest from `python.exe`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49395
diff changeset
   926
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   927
        self.spawn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   928
            [
49395
747c4fc20886 setup: unconditionally enable the `long-paths-support` option on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 49394
diff changeset
   929
                self.compiler.mt,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   930
                '-nologo',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   931
                '-manifest',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   932
                manfname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   933
                outputresource,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   934
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   935
        )
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   936
        logging.info("done updating hg.exe's manifest")
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34397
diff changeset
   937
        os.remove(manfname)
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   938
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   939
    @property
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   940
    def hgexepath(self):
52664
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
   941
        return os.path.join(
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
   942
            os.path.dirname(self.get_ext_fullpath('dummy')), 'hg.exe'
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52663
diff changeset
   943
        )
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   944
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   945
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   946
class hgbuilddoc(Command):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   947
    description = 'build documentation'
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   948
    user_options = [
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   949
        ('man', None, 'generate man pages'),
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   950
        ('html', None, 'generate html pages'),
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   951
    ]
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   952
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   953
    def initialize_options(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   954
        self.man = None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   955
        self.html = None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   956
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   957
    def finalize_options(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   958
        # If --man or --html are set, only generate what we're told to.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   959
        # Otherwise generate everything.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   960
        have_subset = self.man is not None or self.html is not None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   961
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   962
        if have_subset:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   963
            self.man = True if self.man else False
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   964
            self.html = True if self.html else False
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   965
        else:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   966
            self.man = True
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   967
            self.html = True
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   968
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   969
    def run(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   970
        def normalizecrlf(p):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   971
            with open(p, 'rb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   972
                orig = fh.read()
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   973
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   974
            if b'\r\n' not in orig:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   975
                return
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   976
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   977
            logging.info('normalizing %s to LF line endings', p)
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   978
            with open(p, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   979
                fh.write(orig.replace(b'\r\n', b'\n'))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   980
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   981
        def gentxt(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   982
            txt = 'doc/%s.txt' % root
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   983
            logging.info('generating %s', txt)
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   984
            res, out, err = runcmd(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   985
                [sys.executable, 'gendoc.py', root], os.environ, cwd='doc'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   986
            )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   987
            if res:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   988
                raise SystemExit(
44742
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
   989
                    'error running gendoc.py: %s'
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
   990
                    % '\n'.join([sysstr(out), sysstr(err)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
   991
                )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   992
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   993
            with open(txt, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   994
                fh.write(out)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   995
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   996
        def gengendoc(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   997
            gendoc = 'doc/%s.gendoc.txt' % root
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
   998
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
   999
            logging.info('generating %s', gendoc)
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1000
            res, out, err = runcmd(
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1001
                [sys.executable, 'gendoc.py', '%s.gendoc' % root],
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1002
                os.environ,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1003
                cwd='doc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1004
            )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1005
            if res:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1006
                raise SystemExit(
44742
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1007
                    'error running gendoc: %s'
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1008
                    % '\n'.join([sysstr(out), sysstr(err)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1009
                )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1010
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1011
            with open(gendoc, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1012
                fh.write(out)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1013
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1014
        def genman(root):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
  1015
            logging.info('generating doc/%s', root)
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1016
            res, out, err = runcmd(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1017
                [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1018
                    sys.executable,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1019
                    'runrst',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1020
                    'hgmanpage',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1021
                    '--halt',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1022
                    'warning',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1023
                    '--strip-elements-with-class',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1024
                    'htmlonly',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1025
                    '%s.txt' % root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1026
                    root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1027
                ],
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1028
                os.environ,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1029
                cwd='doc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1030
            )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1031
            if res:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1032
                raise SystemExit(
44742
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1033
                    'error running runrst: %s'
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1034
                    % '\n'.join([sysstr(out), sysstr(err)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1035
                )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1036
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1037
            normalizecrlf('doc/%s' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1038
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1039
        def genhtml(root):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
  1040
            logging.info('generating doc/%s.html', root)
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1041
            res, out, err = runcmd(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1042
                [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1043
                    sys.executable,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1044
                    'runrst',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1045
                    'html',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1046
                    '--halt',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1047
                    'warning',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1048
                    '--link-stylesheet',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1049
                    '--stylesheet-path',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1050
                    'style.css',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1051
                    '%s.txt' % root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1052
                    '%s.html' % root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1053
                ],
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1054
                os.environ,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1055
                cwd='doc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1056
            )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1057
            if res:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1058
                raise SystemExit(
44742
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1059
                    'error running runrst: %s'
380959c6f75e setup: use sysstr() on process output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44729
diff changeset
  1060
                    % '\n'.join([sysstr(out), sysstr(err)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1061
                )
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1062
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1063
            normalizecrlf('doc/%s.html' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1064
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1065
        # This logic is duplicated in doc/Makefile.
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44440
diff changeset
  1066
        sources = {
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1067
            f
43749
c7fc2d92067e windows: further build fixes for the WiX installer
Augie Fackler <augie@google.com>
parents: 43678
diff changeset
  1068
            for f in os.listdir('mercurial/helptext')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1069
            if re.search(r'[0-9]\.txt$', f)
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44440
diff changeset
  1070
        }
41850
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1071
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1072
        # common.txt is a one-off.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1073
        gentxt('common')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1074
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1075
        for source in sorted(sources):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1076
            assert source[-4:] == '.txt'
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1077
            root = source[:-4]
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1078
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1079
            gentxt(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1080
            gengendoc(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1081
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1082
            if self.man:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1083
                genman(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1084
            if self.html:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1085
                genhtml(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41759
diff changeset
  1086
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1087
32647
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1088
class hginstall(install):
32725
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1089
    user_options = install.user_options + [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1090
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1091
            'old-and-unmanageable',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1092
            None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1093
            'noop, present for eggless setuptools compat',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1094
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1095
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1096
            'single-version-externally-managed',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1097
            None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1098
            'noop, present for eggless setuptools compat',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1099
        ),
32725
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1100
    ]
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1101
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1102
    sub_commands = install.sub_commands + [
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1103
        ('install_completion', lambda self: True)
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1104
    ]
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1105
32725
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1106
    # Also helps setuptools not be sad while we refuse to create eggs.
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1107
    single_version_externally_managed = True
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32655
diff changeset
  1108
32647
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1109
    def get_sub_commands(self):
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1110
        # Screen out egg related commands to prevent egg generation.  But allow
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1111
        # mercurial.egg-info generation, since that is part of modern
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1112
        # packaging.
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44440
diff changeset
  1113
        excl = {'bdist_egg'}
46315
2ef575c62f10 test-regression: backing out D9640 (63c923fd7fa8)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46243
diff changeset
  1114
        return filter(lambda x: x not in excl, install.get_sub_commands(self))
32647
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32506
diff changeset
  1115
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1116
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1117
class hginstalllib(install_lib):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1118
    """
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1119
    This is a specialization of install_lib that replaces the copy_file used
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1120
    there so that it supports setting the mode of files after copying them,
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1121
    instead of just preserving the mode that the files originally had.  If your
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1122
    system has a umask of something like 027, preserving the permissions when
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1123
    copying will lead to a broken install.
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1124
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1125
    Note that just passing keep_permissions=False to copy_file would be
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1126
    insufficient, as it might still be applying a umask.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1127
    """
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1128
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1129
    def run(self):
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1130
        realcopyfile = file_util.copy_file
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1131
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1132
        def copyfileandsetmode(*args, **kwargs):
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1133
            src, dst = args[0], args[1]
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1134
            dst, copied = realcopyfile(*args, **kwargs)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1135
            if copied:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1136
                st = os.stat(src)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1137
                # Persist executable bit (apply it to group and other if user
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1138
                # has it)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1139
                if st[stat.ST_MODE] & stat.S_IXUSR:
24941
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
  1140
                    setmode = int('0755', 8)
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1141
                else:
24941
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
  1142
                    setmode = int('0644', 8)
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
  1143
                m = stat.S_IMODE(st[stat.ST_MODE])
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
  1144
                m = (m & ~int('0777', 8)) | setmode
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
  1145
                os.chmod(dst, m)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1146
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1147
        file_util.copy_file = copyfileandsetmode
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1148
        try:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1149
            install_lib.run(self)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1150
        finally:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1151
            file_util.copy_file = realcopyfile
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
  1152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1153
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1154
class hginstallscripts(install_scripts):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1155
    """
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1156
    This is a specialization of install_scripts that replaces the @LIBDIR@ with
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1157
    the configured directory for modules. If possible, the path is made relative
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1158
    to the directory for scripts.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1159
    """
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1160
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1161
    def initialize_options(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1162
        install_scripts.initialize_options(self)
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1163
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1164
        self.install_lib = None
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1165
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1166
    def finalize_options(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1167
        install_scripts.finalize_options(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1168
        self.set_undefined_options('install', ('install_lib', 'install_lib'))
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1169
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1170
    def run(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1171
        install_scripts.run(self)
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1172
27269
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1173
        # It only makes sense to replace @LIBDIR@ with the install path if
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1174
        # the install path is known. For wheels, the logic below calculates
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1175
        # the libdir to be "../..". This is because the internal layout of a
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1176
        # wheel archive looks like:
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1177
        #
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1178
        #   mercurial-3.6.1.data/scripts/hg
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1179
        #   mercurial/__init__.py
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1180
        #
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1181
        # When installing wheels, the subdirectories of the "<pkg>.data"
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1182
        # directory are translated to system local paths and files therein
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1183
        # are copied in place. The mercurial/* files are installed into the
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1184
        # site-packages directory. However, the site-packages directory
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1185
        # isn't known until wheel install time. This means we have no clue
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1186
        # at wheel generation time what the installed site-packages directory
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1187
        # will be. And, wheels don't appear to provide the ability to register
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1188
        # custom code to run during wheel installation. This all means that
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1189
        # we can't reliably set the libdir in wheels: the default behavior
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1190
        # of looking in sys.path must do.
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1191
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1192
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1193
            os.path.splitdrive(self.install_dir)[0]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1194
            != os.path.splitdrive(self.install_lib)[0]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1195
        ):
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1196
            # can't make relative paths from one drive to another, so use an
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1197
            # absolute path instead
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1198
            libdir = self.install_lib
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1199
        else:
44080
4e05272dd681 packaging: leverage os.path.relpath() in setup.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 44058
diff changeset
  1200
            libdir = os.path.relpath(self.install_lib, self.install_dir)
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1201
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1202
        for outfile in self.outfiles:
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
  1203
            with open(outfile, 'rb') as fp:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
  1204
                data = fp.read()
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1205
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1206
            # skip binary files
27348
83a8219fb790 setup.py: use bytes literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27269
diff changeset
  1207
            if b'\0' in data:
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1208
                continue
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1209
27269
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1210
            # During local installs, the shebang will be rewritten to the final
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1211
            # install path. During wheel packaging, the shebang has a special
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1212
            # value.
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1213
            if data.startswith(b'#!python'):
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
  1214
                logging.info(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1215
                    'not rewriting @LIBDIR@ in %s because install path '
52323
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
  1216
                    'not known',
599b6ce304a7 setup_py: logging without distutils
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52322
diff changeset
  1217
                    outfile,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1218
                )
27269
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1219
                continue
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
  1220
48828
40a65f5594f5 setup: inline encoding constant that is only used once
Augie Fackler <augie@google.com>
parents: 48827
diff changeset
  1221
            data = data.replace(b'@LIBDIR@', libdir.encode('unicode_escape'))
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
  1222
            with open(outfile, 'wb') as fp:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
  1223
                fp.write(data)
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
  1224
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1225
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1226
class hginstallcompletion(Command):
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1227
    description = 'Install shell completion'
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1228
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1229
    def initialize_options(self):
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1230
        self.install_dir = None
49038
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1231
        self.outputs = []
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1232
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1233
    def finalize_options(self):
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1234
        self.set_undefined_options(
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1235
            'install_data', ('install_dir', 'install_dir')
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1236
        )
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1237
49038
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1238
    def get_outputs(self):
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1239
        return self.outputs
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1240
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1241
    def run(self):
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1242
        for src, dir_path, dest in (
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1243
            (
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1244
                'bash_completion',
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1245
                ('share', 'bash-completion', 'completions'),
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1246
                'hg',
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1247
            ),
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1248
            ('zsh_completion', ('share', 'zsh', 'site-functions'), '_hg'),
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1249
        ):
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1250
            dir = os.path.join(self.install_dir, *dir_path)
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1251
            self.mkpath(dir)
49038
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1252
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1253
            dest = os.path.join(dir, dest)
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1254
            self.outputs.append(dest)
b6f535f3beda setup: fix incomplete implementation of Command
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48988
diff changeset
  1255
            self.copy_file(os.path.join('contrib', src), dest)
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1256
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1257
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1258
# virtualenv installs custom distutils/__init__.py and
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1259
# distutils/distutils.cfg files which essentially proxy back to the
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1260
# "real" distutils in the main Python install. The presence of this
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1261
# directory causes py2exe to pick up the "hacked" distutils package
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1262
# from the virtualenv and "import distutils" will fail from the py2exe
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1263
# build because the "real" distutils files can't be located.
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1264
#
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1265
# We work around this by monkeypatching the py2exe code finding Python
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1266
# modules to replace the found virtualenv distutils modules with the
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1267
# original versions via filesystem scanning. This is a bit hacky. But
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1268
# it allows us to use virtualenvs for py2exe packaging, which is more
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1269
# deterministic and reproducible.
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1270
#
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1271
# It's worth noting that the common StackOverflow suggestions for this
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1272
# problem involve copying the original distutils files into the
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1273
# virtualenv or into the staging directory after setup() is invoked.
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1274
# The former is very brittle and can easily break setup(). Our hacking
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1275
# of the found modules routine has a similar result as copying the files
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1276
# manually. But it makes fewer assumptions about how py2exe works and
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1277
# is less brittle.
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1278
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1279
# This only catches virtualenvs made with virtualenv (as opposed to
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1280
# venv, which is likely what Python 3 uses).
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1281
py2exehacked = py2exeloaded and getattr(sys, 'real_prefix', None) is not None
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1282
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1283
if py2exehacked:
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1284
    from distutils.command.py2exe import py2exe as buildpy2exe
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1285
    from py2exe.mf import Module as py2exemodule
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1286
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1287
    class hgbuildpy2exe(buildpy2exe):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1288
        def find_needed_modules(self, mf, files, modules):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1289
            res = buildpy2exe.find_needed_modules(self, mf, files, modules)
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1290
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1291
            # Replace virtualenv's distutils modules with the real ones.
42174
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1292
            modules = {}
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1293
            for k, v in res.modules.items():
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1294
                if k != 'distutils' and not k.startswith('distutils.'):
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1295
                    modules[k] = v
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1296
bd92dd3eff42 setup: remove set and dict comprehensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42172
diff changeset
  1297
            res.modules = modules
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1298
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1299
            import opcode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1300
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1301
            distutilsreal = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1302
                os.path.dirname(opcode.__file__), 'distutils'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1303
            )
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1304
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1305
            for root, dirs, files in os.walk(distutilsreal):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1306
                for f in sorted(files):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1307
                    if not f.endswith('.py'):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1308
                        continue
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1309
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1310
                    full = os.path.join(root, f)
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1311
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1312
                    parents = ['distutils']
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1313
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1314
                    if root != distutilsreal:
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1315
                        rel = os.path.relpath(root, distutilsreal)
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1316
                        parents.extend(p for p in rel.split(os.sep))
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1317
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1318
                    modname = '%s.%s' % ('.'.join(parents), f[:-3])
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1319
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1320
                    if modname.startswith('distutils.tests.'):
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1321
                        continue
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1322
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1323
                    if modname.endswith('.__init__'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1324
                        modname = modname[: -len('.__init__')]
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1325
                        path = os.path.dirname(full)
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1326
                    else:
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1327
                        path = None
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1328
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1329
                    res.modules[modname] = py2exemodule(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1330
                        modname, full, path=path
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1331
                    )
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1332
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1333
            if 'distutils' not in res.modules:
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1334
                raise SystemExit('could not find distutils modules')
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1335
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1336
            return res
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1337
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1338
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1339
cmdclass = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1340
    'build': hgbuild,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1341
    'build_doc': hgbuilddoc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1342
    'build_mo': hgbuildmo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1343
    'build_ext': hgbuildext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1344
    'build_py': hgbuildpy,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1345
    'build_scripts': hgbuildscripts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1346
    'build_hgextindex': buildhgextindex,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1347
    'install': hginstall,
48988
8d7eaff92f9c completion: install completers to conventional locations
Matthew Martin <phy1729@gmail.com>
parents: 48946
diff changeset
  1348
    'install_completion': hginstallcompletion,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1349
    'install_lib': hginstalllib,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1350
    'install_scripts': hginstallscripts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1351
    'build_hgexe': buildhgexe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1352
}
3238
3dba9ec89164 Applied coding style to setup.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2402
diff changeset
  1353
42172
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1354
if py2exehacked:
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1355
    cmdclass['py2exe'] = hgbuildpy2exe
71d8b4d91616 setup: properly package distutils in py2exe virtualenv builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42075
diff changeset
  1356
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1357
packages = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1358
    'mercurial',
50984
727428c7e1fc commands: add admin namespace
Franck Bret <franck.bret@octobus.net>
parents: 50933
diff changeset
  1359
    'mercurial.admin',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1360
    'mercurial.cext',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1361
    'mercurial.cffi',
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52323
diff changeset
  1362
    'mercurial.cmd_impls',
52416
0a81f3ef054c config: move `rcutil` module under a new `mercurial.configuration` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52406
diff changeset
  1363
    'mercurial.configuration',
51897
f0e07efc199f rev-branch-cache: move the code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51845
diff changeset
  1364
    'mercurial.branching',
44026
44b03c0313aa setup: include `defaultrc` in the package list
Matt Harbison <matt_harbison@yahoo.com>
parents: 43794
diff changeset
  1365
    'mercurial.defaultrc',
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47007
diff changeset
  1366
    'mercurial.dirstateutils',
43632
2e017696181f help: create packages for the help text
Matt Harbison <matt_harbison@yahoo.com>
parents: 43349
diff changeset
  1367
    'mercurial.helptext',
2e017696181f help: create packages for the help text
Matt Harbison <matt_harbison@yahoo.com>
parents: 43349
diff changeset
  1368
    'mercurial.helptext.internals',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1369
    'mercurial.hgweb',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1370
    'mercurial.interfaces',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1371
    'mercurial.pure',
50423
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents: 50405
diff changeset
  1372
    'mercurial.stabletailgraph',
45304
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1373
    'mercurial.templates',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1374
    'mercurial.thirdparty',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1375
    'mercurial.thirdparty.attr',
50758
2c34c9b61a4f thirdparty: vendor tomli
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50730
diff changeset
  1376
    'mercurial.thirdparty.tomli',
46046
f105c49e89cd upgrade: split actual upgrade code away from the main module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
  1377
    'mercurial.upgrade_utils',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1378
    'mercurial.utils',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1379
    'mercurial.revlogutils',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1380
    'mercurial.testing',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1381
    'hgext',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1382
    'hgext.convert',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1383
    'hgext.fsmonitor',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1384
    'hgext.fastannotate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1385
    'hgext.fsmonitor.pywatchman',
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents: 44466
diff changeset
  1386
    'hgext.git',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1387
    'hgext.highlight',
44413
4cabeea6d214 hgext: start building a library for simple hooks
Joerg Sonnenberger <joerg@bec.de>
parents: 44305
diff changeset
  1388
    'hgext.hooklib',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1389
    'hgext.largefiles',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1390
    'hgext.lfs',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1391
    'hgext.narrow',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1392
    'hgext.remotefilelog',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1393
    'hgext.zeroconf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1394
    'hgext3rd',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1395
    'hgdemandimport',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1396
]
45304
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1397
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1398
for name in os.listdir(os.path.join('mercurial', 'templates')):
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1399
    if name != '__pycache__' and os.path.isdir(
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1400
        os.path.join('mercurial', 'templates', name)
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1401
    ):
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1402
        packages.append('mercurial.templates.%s' % name)
41ff8a463e10 packaging: mark mercurial.templates and subdirs as packages
Martin von Zweigbergk <martinvonz@google.com>
parents: 45270
diff changeset
  1403
42054
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1404
if 'HG_PY2EXE_EXTRA_INSTALL_PACKAGES' in os.environ:
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1405
    # py2exe can't cope with namespace packages very well, so we have to
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1406
    # install any hgext3rd.* extensions that we want in the final py2exe
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1407
    # image here. This is gross, but you gotta do what you gotta do.
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1408
    packages.extend(os.environ['HG_PY2EXE_EXTRA_INSTALL_PACKAGES'].split(' '))
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41954
diff changeset
  1409
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1410
common_depends = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1411
    'mercurial/bitmanipulation.h',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1412
    'mercurial/compat.h',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1413
    'mercurial/cext/util.h',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1414
]
32211
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32125
diff changeset
  1415
common_include_dirs = ['mercurial']
19724
2b2a2e858fb7 setup: check if mercurial/util.h has been modified
Wei, Elson <elson.wei@gmail.com>
parents: 18905
diff changeset
  1416
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1417
common_cflags = []
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1418
44605
960770add699 setup: relax -Werror for declaration-after-statement on Python 3.9
Augie Fackler <augie@google.com>
parents: 44588
diff changeset
  1419
# MSVC 2008 still needs declarations at the top of the scope, but Python 3.9
960770add699 setup: relax -Werror for declaration-after-statement on Python 3.9
Augie Fackler <augie@google.com>
parents: 44588
diff changeset
  1420
# makes declarations not at the top of a scope in the headers.
960770add699 setup: relax -Werror for declaration-after-statement on Python 3.9
Augie Fackler <augie@google.com>
parents: 44588
diff changeset
  1421
if os.name != 'nt' and sys.version_info[1] < 9:
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1422
    common_cflags = ['-Werror=declaration-after-statement']
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1423
30408
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30346
diff changeset
  1424
osutil_cflags = []
25073
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1425
osutil_ldflags = []
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1426
31561
312e62640798 setup: detect statfs
Jun Wu <quark@fb.com>
parents: 31560
diff changeset
  1427
# platform specific macros
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31596
diff changeset
  1428
for plat, func in [('bsd', 'setproctitle')]:
31561
312e62640798 setup: detect statfs
Jun Wu <quark@fb.com>
parents: 31560
diff changeset
  1429
    if re.search(plat, sys.platform) and hasfunction(new_compiler(), func):
30408
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30346
diff changeset
  1430
        osutil_cflags.append('-DHAVE_%s' % func.upper())
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30346
diff changeset
  1431
31596
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1432
for plat, macro, code in [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1433
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1434
        'bsd|darwin',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1435
        'BSD_STATFS',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1436
        '''
31596
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1437
     #include <sys/param.h>
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1438
     #include <sys/mount.h>
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1439
     int main() { struct statfs s; return sizeof(s.f_fstypename); }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1440
     ''',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1441
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1442
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1443
        'linux',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1444
        'LINUX_STATFS',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1445
        '''
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31596
diff changeset
  1446
     #include <linux/magic.h>
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31596
diff changeset
  1447
     #include <sys/vfs.h>
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31596
diff changeset
  1448
     int main() { struct statfs s; return sizeof(s.f_type); }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1449
     ''',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1450
    ),
31596
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1451
]:
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1452
    if re.search(plat, sys.platform) and cancompile(new_compiler(), code):
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1453
        osutil_cflags.append('-DHAVE_%s' % macro)
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31562
diff changeset
  1454
25073
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1455
if sys.platform == 'darwin':
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1456
    osutil_ldflags += ['-framework', 'ApplicationServices']
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1457
44692
539490756a72 setup: link osutil.so to libsocket on Solaris/illumos (issue6299)
Alexander Pyhalov <apyhalov@gmail.com>
parents: 44603
diff changeset
  1458
if sys.platform == 'sunos5':
539490756a72 setup: link osutil.so to libsocket on Solaris/illumos (issue6299)
Alexander Pyhalov <apyhalov@gmail.com>
parents: 44603
diff changeset
  1459
    osutil_ldflags += ['-lsocket']
539490756a72 setup: link osutil.so to libsocket on Solaris/illumos (issue6299)
Alexander Pyhalov <apyhalov@gmail.com>
parents: 44603
diff changeset
  1460
36675
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1461
xdiff_srcs = [
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1462
    'mercurial/thirdparty/xdiff/xdiffi.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1463
    'mercurial/thirdparty/xdiff/xprepare.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1464
    'mercurial/thirdparty/xdiff/xutils.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1465
]
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1466
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1467
xdiff_headers = [
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1468
    'mercurial/thirdparty/xdiff/xdiff.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1469
    'mercurial/thirdparty/xdiff/xdiffi.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1470
    'mercurial/thirdparty/xdiff/xinclude.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1471
    'mercurial/thirdparty/xdiff/xmacros.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1472
    'mercurial/thirdparty/xdiff/xprepare.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1473
    'mercurial/thirdparty/xdiff/xtypes.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1474
    'mercurial/thirdparty/xdiff/xutils.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1475
]
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36607
diff changeset
  1476
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1477
40966
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1478
class RustCompilationError(CCompilerError):
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1479
    """Exception class for Rust compilation errors."""
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1480
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1481
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1482
class RustExtension(Extension):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1483
    """Base classes for concrete Rust Extension classes."""
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1484
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1485
    rusttargetdir = os.path.join('rust', 'target', 'release')
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1486
48182
01c3dd208c75 rust: Make the hg-cpython crate default to Python 3
Simon Sapin <simon.sapin@octobus.net>
parents: 48180
diff changeset
  1487
    def __init__(self, mpath, sources, rustlibname, subcrate, **kw):
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1488
        Extension.__init__(self, mpath, sources, **kw)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1489
        srcdir = self.rustsrcdir = os.path.join('rust', subcrate)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1490
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1491
        # adding Rust source and control files to depends so that the extension
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1492
        # gets rebuilt if they've changed
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1493
        self.depends.append(os.path.join(srcdir, 'Cargo.toml'))
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1494
        cargo_lock = os.path.join(srcdir, 'Cargo.lock')
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1495
        if os.path.exists(cargo_lock):
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1496
            self.depends.append(cargo_lock)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1497
        for dirpath, subdir, fnames in os.walk(os.path.join(srcdir, 'src')):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1498
            self.depends.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1499
                os.path.join(dirpath, fname)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1500
                for fname in fnames
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1501
                if os.path.splitext(fname)[1] == '.rs'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1502
            )
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1503
42457
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1504
    @staticmethod
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1505
    def rustdylibsuffix():
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1506
        """Return the suffix for shared libraries produced by rustc.
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1507
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1508
        See also: https://doc.rust-lang.org/reference/linkage.html
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1509
        """
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1510
        if sys.platform == 'darwin':
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1511
            return '.dylib'
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1512
        elif os.name == 'nt':
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1513
            return '.dll'
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1514
        else:
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1515
            return '.so'
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1516
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1517
    def rustbuild(self):
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1518
        env = os.environ.copy()
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1519
        if 'HGTEST_RESTOREENV' in env:
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1520
            # Mercurial tests change HOME to a temporary directory,
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1521
            # but, if installed with rustup, the Rust toolchain needs
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1522
            # HOME to be correct (otherwise the 'no default toolchain'
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1523
            # error message is issued and the build fails).
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1524
            # This happens currently with test-hghave.t, which does
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1525
            # invoke this build.
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1526
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1527
            # Unix only fix (os.path.expanduser not really reliable if
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1528
            # HOME is shadowed like this)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1529
            import pwd
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1530
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1531
            env['HOME'] = pwd.getpwuid(os.getuid()).pw_dir
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1532
52242
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1533
        # Wildy shooting in the dark to make sure rust-cpython use the right
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1534
        # python
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1535
        if not sys.executable:
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1536
            msg = "Cannot determine which Python to compile Rust for"
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1537
            raise RustCompilationError(msg)
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1538
        env['PYTHON_SYS_EXECUTABLE'] = sys.executable
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1539
        env['PYTHONEXECUTABLE'] = sys.executable
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1540
        env['PYTHON'] = sys.executable
124c944b71b2 setup: make sure Rust build its extension for the right python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52236
diff changeset
  1541
44846
47787a48f469 setup: stop asking cargo to spam
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44742
diff changeset
  1542
        cargocmd = ['cargo', 'rustc', '--release']
44305
d8d4fa9a7f18 rust-re2: add wrapper for calling Re2 from Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44240
diff changeset
  1543
d8d4fa9a7f18 rust-re2: add wrapper for calling Re2 from Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44240
diff changeset
  1544
        rust_features = env.get("HG_RUST_FEATURES")
d8d4fa9a7f18 rust-re2: add wrapper for calling Re2 from Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44240
diff changeset
  1545
        if rust_features:
48842
649ff7f86f96 rust: enable Python 3 support unconditionally
Simon Sapin <simon.sapin@octobus.net>
parents: 48838
diff changeset
  1546
            cargocmd.extend(('--features', rust_features))
44305
d8d4fa9a7f18 rust-re2: add wrapper for calling Re2 from Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44240
diff changeset
  1547
42459
85041e2b69c7 rust: switched to 'cargo rustc' in setup.py
Georges Racinet <georges.racinet@octobus.net>
parents: 42458
diff changeset
  1548
        cargocmd.append('--')
42458
8ee0fdf3b087 rust-cpython: fix build for MacOSX
Georges Racinet <georges.racinet@octobus.net>
parents: 42457
diff changeset
  1549
        if sys.platform == 'darwin':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1550
            cargocmd.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1551
                ("-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1552
            )
40966
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1553
        try:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1554
            subprocess.check_call(cargocmd, env=env, cwd=self.rustsrcdir)
49310
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1555
        except FileNotFoundError:
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1556
            raise RustCompilationError("Cargo not found")
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1557
        except PermissionError:
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1558
            raise RustCompilationError(
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1559
                "Cargo found, but permission to execute it is denied"
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49073
diff changeset
  1560
            )
40966
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1561
        except subprocess.CalledProcessError:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1562
            raise RustCompilationError(
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40859
diff changeset
  1563
                "Cargo failed. Working directory: %r, "
42074
59b1bdf85b1a setup: fix a possible NameError on rust build
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 42065
diff changeset
  1564
                "command: %r, environment: %r"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1565
                % (self.rustsrcdir, cargocmd, env)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1566
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1567
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40121
diff changeset
  1568
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1569
class RustStandaloneExtension(RustExtension):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1570
    def __init__(self, pydottedname, rustcrate, dylibname, **kw):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1571
        RustExtension.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1572
            self, pydottedname, [], dylibname, rustcrate, **kw
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1573
        )
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1574
        self.dylibname = dylibname
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1575
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1576
    def build(self, target_dir):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1577
        self.rustbuild()
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1578
        target = [target_dir]
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1579
        target.extend(self.name.split('.'))
42457
f4a65077e949 rust-cpython: management of shared libray suffix
Georges Racinet <georges.racinet@octobus.net>
parents: 42453
diff changeset
  1580
        target[-1] += DYLIB_SUFFIX
49957
ff4df0954742 setup: Ensure target directory exists with building rust extension
C?dric Krier <ced@b2ck.com>
parents: 49879
diff changeset
  1581
        target = os.path.join(*target)
ff4df0954742 setup: Ensure target directory exists with building rust extension
C?dric Krier <ced@b2ck.com>
parents: 49879
diff changeset
  1582
        os.makedirs(os.path.dirname(target), exist_ok=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1583
        shutil.copy2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1584
            os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1585
                self.rusttargetdir, self.dylibname + self.rustdylibsuffix()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1586
            ),
49957
ff4df0954742 setup: Ensure target directory exists with building rust extension
C?dric Krier <ced@b2ck.com>
parents: 49879
diff changeset
  1587
            target,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1588
        )
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1589
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1590
10000
16f49d671c7f setup: cleanup coding style
Martin Geisler <mg@lazybytes.net>
parents: 9999
diff changeset
  1591
extmodules = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1592
    Extension(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1593
        'mercurial.cext.base85',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1594
        ['mercurial/cext/base85.c'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1595
        include_dirs=common_include_dirs,
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1596
        extra_compile_args=common_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1597
        depends=common_depends,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1598
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1599
    Extension(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1600
        'mercurial.cext.bdiff',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1601
        ['mercurial/bdiff.c', 'mercurial/cext/bdiff.c'] + xdiff_srcs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1602
        include_dirs=common_include_dirs,
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1603
        extra_compile_args=common_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1604
        depends=common_depends + ['mercurial/bdiff.h'] + xdiff_headers,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1605
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1606
    Extension(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1607
        'mercurial.cext.mpatch',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1608
        ['mercurial/mpatch.c', 'mercurial/cext/mpatch.c'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1609
        include_dirs=common_include_dirs,
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1610
        extra_compile_args=common_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1611
        depends=common_depends,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1612
    ),
44466
79ac59d3f73d setup-rust: remove the legacy 'direct-ffi' variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44452
diff changeset
  1613
    Extension(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1614
        'mercurial.cext.parsers',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1615
        [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1616
            'mercurial/cext/charencode.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1617
            'mercurial/cext/dirs.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1618
            'mercurial/cext/manifest.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1619
            'mercurial/cext/parsers.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1620
            'mercurial/cext/pathencode.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1621
            'mercurial/cext/revlog.c',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1622
        ],
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1623
        include_dirs=common_include_dirs,
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1624
        extra_compile_args=common_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1625
        depends=common_depends
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1626
        + [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1627
            'mercurial/cext/charencode.h',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1628
            'mercurial/cext/revlog.h',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1629
        ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1630
    ),
37180
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37130
diff changeset
  1631
    Extension(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1632
        'mercurial.cext.osutil',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1633
        ['mercurial/cext/osutil.c'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1634
        include_dirs=common_include_dirs,
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1635
        extra_compile_args=common_cflags + osutil_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1636
        extra_link_args=osutil_ldflags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1637
        depends=common_depends,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1638
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1639
    Extension(
44058
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1640
        'mercurial.thirdparty.sha1dc',
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1641
        [
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1642
            'mercurial/thirdparty/sha1dc/cext.c',
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1643
            'mercurial/thirdparty/sha1dc/lib/sha1.c',
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1644
            'mercurial/thirdparty/sha1dc/lib/ubc_check.c',
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1645
        ],
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1646
        extra_compile_args=common_cflags,
44058
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1647
    ),
bde1cd4c99d9 sha1dc: initial implementation of Python extension
Augie Fackler <augie@google.com>
parents: 44026
diff changeset
  1648
    Extension(
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1649
        'hgext.fsmonitor.pywatchman.bser',
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1650
        ['hgext/fsmonitor/pywatchman/bser.c'],
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1651
        extra_compile_args=common_cflags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1652
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1653
]
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5197
diff changeset
  1654
52662
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1655
if os.name != 'nt':
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1656
    extmodules += [
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1657
        RustStandaloneExtension(
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1658
            'mercurial.rustext',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1659
            'hg-cpython',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1660
            'librusthg',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1661
        ),
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1662
        RustStandaloneExtension(
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1663
            'mercurial.pyo3_rustext',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1664
            'hg-pyo3',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1665
            'librusthgpyo3',
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1666
        ),
e5aadff6cb7d setup: skip building rust extensions on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 52661
diff changeset
  1667
    ]
40967
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40966
diff changeset
  1668
30436
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30408
diff changeset
  1669
sys.path.insert(0, 'contrib/python-zstandard')
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30408
diff changeset
  1670
import setup_zstd
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1671
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1672
zstd = setup_zstd.get_c_extension(
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1673
    name='mercurial.zstd', root=os.path.abspath(os.path.dirname(__file__))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1674
)
44588
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1675
zstd.extra_compile_args += common_cflags
2a98b0cd4995 setup: build C extensions with -Werror=declaration-after-statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 44487
diff changeset
  1676
extmodules.append(zstd)
30436
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30408
diff changeset
  1677
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1678
try:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1679
    from distutils import cygwinccompiler
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1680
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1681
    # the -mno-cygwin option has been deprecated for years
33669
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1682
    mingw32compilerclass = cygwinccompiler.Mingw32CCompiler
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1683
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1684
    class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler):
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1685
        def __init__(self, *args, **kwargs):
33669
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1686
            mingw32compilerclass.__init__(self, *args, **kwargs)
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1687
            for i in 'compiler compiler_so linker_exe linker_so'.split():
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1688
                try:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1689
                    getattr(self, i).remove('-mno-cygwin')
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1690
                except ValueError:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1691
                    pass
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1692
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1693
    cygwinccompiler.Mingw32CCompiler = HackedMingw32CCompiler
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1694
except ImportError:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1695
    # the cygwinccompiler package is not available on some Python
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1696
    # distributions like the ones from the optware project for Synology
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1697
    # DiskStation boxes
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48850
diff changeset
  1698
    class HackedMingw32CCompiler:
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1699
        pass
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1700
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1701
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1702
packagedata = {
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1703
    'mercurial': [
50759
c51b178b0b7e configitems: declare items in a TOML file
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50758
diff changeset
  1704
        'configitems.toml',
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1705
        'locale/*/LC_MESSAGES/hg.mo',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1706
        'dummycert.pem',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1707
    ],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1708
    'mercurial.defaultrc': [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1709
        '*.rc',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1710
    ],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1711
    'mercurial.helptext': [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1712
        '*.txt',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1713
    ],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1714
    'mercurial.helptext.internals': [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1715
        '*.txt',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45939
diff changeset
  1716
    ],
49655
54421ef8a423 setup: include vendored 3rd party type stubs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49396
diff changeset
  1717
    'mercurial.thirdparty.attr': [
54421ef8a423 setup: include vendored 3rd party type stubs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49396
diff changeset
  1718
        '*.pyi',
54421ef8a423 setup: include vendored 3rd party type stubs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49396
diff changeset
  1719
        'py.typed',
54421ef8a423 setup: include vendored 3rd party type stubs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49396
diff changeset
  1720
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1721
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1722
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1723
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1724
def ordinarypath(p):
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1725
    return p and p[0] != '.' and p[-1] != '~'
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1726
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1727
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1728
for root in ('templates',):
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1729
    for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
45305
e2320bb7a99f packaging: include templates with their package as key in package_data
Martin von Zweigbergk <martinvonz@google.com>
parents: 45304
diff changeset
  1730
        packagename = curdir.replace(os.sep, '.')
e2320bb7a99f packaging: include templates with their package as key in package_data
Martin von Zweigbergk <martinvonz@google.com>
parents: 45304
diff changeset
  1731
        packagedata[packagename] = list(filter(ordinarypath, files))
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1732
31316
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31308
diff changeset
  1733
# distutils expects version to be str/unicode. Converting it to
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31308
diff changeset
  1734
# unicode on Python 2 still works because it won't contain any
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31308
diff changeset
  1735
# non-ascii bytes and will be implicitly converted back to bytes
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31308
diff changeset
  1736
# when operated on.
46512
866eb4d6bd9f build: fake PEP440 versions
Joerg Sonnenberger <joerg@bec.de>
parents: 46414
diff changeset
  1737
assert isinstance(version, str)
866eb4d6bd9f build: fake PEP440 versions
Joerg Sonnenberger <joerg@bec.de>
parents: 46414
diff changeset
  1738
setupversion = version
31316
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31308
diff changeset
  1739
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1740
extra = {}
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1741
41851
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1742
py2exepackages = [
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1743
    'hgdemandimport',
41918
5d9fdc9b0178 setup: include hgext3rd package in py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41917
diff changeset
  1744
    'hgext3rd',
41851
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1745
    'hgext',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1746
    'email',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1747
    # implicitly imported per module policy
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1748
    # (cffi wouldn't be used as a frozen exe)
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1749
    'mercurial.cext',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1750
    #'mercurial.cffi',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1751
    'mercurial.pure',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1752
]
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1753
46363
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1754
py2exe_includes = []
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1755
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1756
py2exeexcludes = []
41954
e5ac701e5b7c setup: exclude crypt32.dll in py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41953
diff changeset
  1757
py2exedllexcludes = ['crypt32.dll']
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1758
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1759
if py2exeloaded:
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1760
    extra['console'] = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1761
        {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1762
            'script': 'hg',
51664
45ba8416afc4 copyright: update to 2024
Anton Shestakov <av6@dwimlabs.net>
parents: 51628
diff changeset
  1763
            'copyright': 'Copyright (C) 2005-2024 Olivia Mackall and others',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1764
            'product_version': version,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1765
        }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1766
    ]
41917
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41916
diff changeset
  1767
    # Sub command of 'build' because 'py2exe' does not handle sub_commands.
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41916
diff changeset
  1768
    # Need to override hgbuild because it has a private copy of
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41916
diff changeset
  1769
    # build.sub_commands.
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41916
diff changeset
  1770
    hgbuild.sub_commands.insert(0, ('build_hgextindex', None))
25409
95e042d77a5f wix: move library.zip and all *.pyd into a lib/ folder
Steve Borho <steve@borho.org>
parents: 25089
diff changeset
  1771
    # put dlls in sub directory so that they won't pollute PATH
95e042d77a5f wix: move library.zip and all *.pyd into a lib/ folder
Steve Borho <steve@borho.org>
parents: 25089
diff changeset
  1772
    extra['zipfile'] = 'lib/library.zip'
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1773
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1774
    # We allow some configuration to be supplemented via environment
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1775
    # variables. This is better than setup.cfg files because it allows
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1776
    # supplementing configs instead of replacing them.
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1777
    extrapackages = os.environ.get('HG_PY2EXE_EXTRA_PACKAGES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1778
    if extrapackages:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1779
        py2exepackages.extend(extrapackages.split(' '))
41851
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1780
46363
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1781
    extra_includes = os.environ.get('HG_PY2EXE_EXTRA_INCLUDES')
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1782
    if extra_includes:
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1783
        py2exe_includes.extend(extra_includes.split(' '))
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1784
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1785
    excludes = os.environ.get('HG_PY2EXE_EXTRA_EXCLUDES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1786
    if excludes:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1787
        py2exeexcludes.extend(excludes.split(' '))
41851
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1788
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1789
    dllexcludes = os.environ.get('HG_PY2EXE_EXTRA_DLL_EXCLUDES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1790
    if dllexcludes:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41854
diff changeset
  1791
        py2exedllexcludes.extend(dllexcludes.split(' '))
41851
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41850
diff changeset
  1792
45132
9d532329ee97 extensions: make `hg help extensions` list disabled extensions with PyOxidizer
Martin von Zweigbergk <martinvonz@google.com>
parents: 44893
diff changeset
  1793
if os.environ.get('PYOXIDIZER'):
9d532329ee97 extensions: make `hg help extensions` list disabled extensions with PyOxidizer
Martin von Zweigbergk <martinvonz@google.com>
parents: 44893
diff changeset
  1794
    hgbuild.sub_commands.insert(0, ('build_hgextindex', None))
9d532329ee97 extensions: make `hg help extensions` list disabled extensions with PyOxidizer
Martin von Zweigbergk <martinvonz@google.com>
parents: 44893
diff changeset
  1795
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1796
setup(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1797
    version=setupversion,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1798
    long_description=(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1799
        'Mercurial is a distributed SCM tool written in Python.'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1800
        ' It is used by a number of large projects that require'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1801
        ' fast, reliable distributed revision control, such as '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1802
        'Mozilla.'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1803
    ),
51977
d07034819565 install: add long_description_content_type
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 51897
diff changeset
  1804
    long_description_content_type='text/x-rst',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1805
    scripts=scripts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1806
    packages=packages,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1807
    ext_modules=extmodules,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1808
    package_data=packagedata,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1809
    cmdclass=cmdclass,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1810
    distclass=hgdist,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1811
    options={
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1812
        'py2exe': {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1813
            'bundle_files': 3,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1814
            'dll_excludes': py2exedllexcludes,
46363
d6cfe45afb18 packaging: allow specifying modules to include with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 46315
diff changeset
  1815
            'includes': py2exe_includes,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1816
            'excludes': py2exeexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1817
            'packages': py2exepackages,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1818
        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1819
        'bdist_mpkg': {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1820
            'zipdist': False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1821
            'license': 'COPYING',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1822
            'readme': 'contrib/packaging/macosx/Readme.html',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1823
            'welcome': 'contrib/packaging/macosx/Welcome.html',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1824
        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1825
    },
51157
3c5b66d03c37 setup: make debug simpler by adding a `__repr__` to `hgcommand`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50984
diff changeset
  1826
    **extra,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43044
diff changeset
  1827
)