##// END OF EJS Templates
http: drop custom http client logic...
http: drop custom http client logic Eight and a half years ago, as my starter bug on code.google.com, I investigated a mysterious "broken pipe" error from seemingly random clients[0]. That investigation revealed a tragic story: the Python standard library's httplib was (and remains) barely functional. During large POSTs, if a server responds early with an error (even a permission denied error!) the client only notices that the server closed the connection and everything breaks. Such server behavior is implicitly legal under RFC 2616 (the latest HTTP RFC as of when I was last working on this), and my understanding is that later RFCs have made it explicitly legal to respond early with any status code outside the 2xx range. I embarked, probably foolishly, on a journey to write a new http library with better overall behavior. The http library appears to work well in most cases, but it can get confused in the presence of proxies, and it depends on select(2) which limits its utility if a lot of file descriptors are open. I haven't touched the http library in almost two years, and in the interim the Python community has discovered a better way[1] of writing network code. In theory some day urllib3 will have its own home-grown http library built on h11[2], or we could do that. Either way, it's time to declare our current confusingly-named "http2" client logic and move on. I do hope to revisit this some day: it's still garbage that we can't even respond with a 401 or 403 without reading the entire POST body from the client, but the goalposts on writing a new http client library have moved substantially. We're almost certainly better off just switching to requests and eventually picking up their http fixes than trying to live with something that realistically only we'll ever use. Another approach would be to write an adapter so that Mercurial can use pycurl if it's installed. Neither of those approaches seem like they should be investigated prior to a release of Mercurial that works on Python 3: that's where the mindshare is going to be for any improvements to the state of the http client art. 0: http://web.archive.org/web/20130501031801/http://code.google.com/p/support/issues/detail?id=2716 1: http://sans-io.readthedocs.io/ 2: https://github.com/njsmith/h11 Differential Revision: https://phab.mercurial-scm.org/D2444

File last commit:

r36444:23d12524 default
r36444:23d12524 default
Show More
setup.py
1054 lines | 39.3 KiB | text/x-python | PythonLexer
mpm@selenic.com
More whitespace cleanups...
r575 #
# This is the mercurial setup script.
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 #
Christian Ebert
setup.py not executable: change instructions at beginning of file
r4816 # 'python setup.py install', or
# 'python setup.py --help' for more options
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Augie Fackler
setup: fix mistake that prevented Python 3 from being excluded...
r33592 import os
Augie Fackler
setup: explicitly declare supported Python versions...
r33588 supportedpy = '~= 2.7'
Augie Fackler
setup: fix mistake that prevented Python 3 from being excluded...
r33592 if os.environ.get('HGALLOWPYTHON3', ''):
Augie Fackler
setup: explicitly declare supported Python versions...
r33588 # Mercurial will never work on Python 3 before 3.5 due to a lack
# of % formatting on bytestrings, and can't work on 3.6.0 or 3.6.1
# due to a bug in % formatting in bytestrings.
#
# TODO: when we actually work on Python 3, use this string as the
# actual supportedpy string.
supportedpy = ','.join([
'>=2.7',
'!=3.0.*',
'!=3.1.*',
'!=3.2.*',
'!=3.3.*',
'!=3.4.*',
'!=3.6.0',
'!=3.6.1',
])
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 import sys, platform
Renato Cunha
setup.py: Adjustments to make setup.py run in py3k....
r11532 if sys.version_info[0] >= 3:
Augie Fackler
setup: handle more invalid python3 syntax...
r20696 printf = eval('print')
libdir_escape = 'unicode_escape'
Yuya Nishihara
setup: convert version strings to unicode on Python 3...
r35246 def sysstr(s):
return s.decode('latin-1')
Renato Cunha
setup.py: Adjustments to make setup.py run in py3k....
r11532 else:
Augie Fackler
setup: handle more invalid python3 syntax...
r20696 libdir_escape = 'string_escape'
def printf(*args, **kwargs):
f = kwargs.get('file', sys.stdout)
end = kwargs.get('end', '\n')
Gregory Szorc
setup.py: use bytes literals...
r27348 f.write(b' '.join(args) + end)
Yuya Nishihara
setup: convert version strings to unicode on Python 3...
r35246 def sysstr(s):
return s
Renato Cunha
setup.py: Adjustments to make setup.py run in py3k....
r11532
Augie Fackler
setup: add extra logic to try and recommend a new pip on bad Python...
r33589 # Attempt to guide users to a modern pip - this means that 2.6 users
# should have a chance of getting a 4.2 release, and when we ratchet
# the version requirement forward again hopefully everyone will get
# something that works for them.
if sys.version_info < (2, 7, 0, 'final'):
pip_message = ('This may be due to an out of date pip. '
'Make sure you have pip >= 9.0.1.')
try:
import pip
pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]])
if pip_version < (9, 0, 1) :
pip_message = (
'Your pip version is out of date, please install '
'pip >= 9.0.1. pip {} detected.'.format(pip.__version__))
else:
# pip is new enough - it must be something else
pip_message = ''
except Exception:
pass
error = """
Mercurial does not support Python older than 2.7.
Python {py} detected.
{pip}
""".format(py=sys.version_info, pip=pip_message)
printf(error, file=sys.stderr)
sys.exit(1)
Gregory Szorc
setup: only allow Python 3 from a source checkout (issue5804)...
r36404 # We don't yet officially support Python 3. But we want to allow developers to
# hack on. Detect and disallow running on Python 3 by default. But provide a
# backdoor to enable working on Python 3.
if sys.version_info[0] != 2:
badpython = True
# Allow Python 3 from source checkouts.
if os.path.isdir('.hg'):
badpython = False
if badpython:
error = """
Mercurial only supports Python 2.7.
Python {py} detected.
Please re-run with Python 2.7.
""".format(py=sys.version_info)
printf(error, file=sys.stderr)
sys.exit(1)
Matt Mackall
setup: warn about missing standard Python components
r7558 # Solaris Python packaging brain damage
try:
import hashlib
sha = hashlib.sha1()
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except ImportError:
Matt Mackall
setup: warn about missing standard Python components
r7558 try:
import sha
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 sha.sha # silence unused import warning
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except ImportError:
Matt Mackall
setup: warn about missing standard Python components
r7558 raise SystemExit(
"Couldn't import standard hashlib (incomplete Python install).")
try:
import zlib
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 zlib.compressobj # silence unused import warning
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except ImportError:
Matt Mackall
setup: warn about missing standard Python components
r7558 raise SystemExit(
"Couldn't import standard zlib (incomplete Python install).")
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 # The base IronPython distribution (as of 2.7.1) doesn't support bz2
isironpython = False
Dirkjan Ochtman
setup: fail if bz2 is not available
r10761 try:
Brodie Rao
cleanup: eradicate long lines
r16683 isironpython = (platform.python_implementation()
.lower().find("ironpython") != -1)
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except AttributeError:
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 pass
if isironpython:
Simon Heimberg
setup: make script executable with python3...
r15492 sys.stderr.write("warning: IronPython detected (no bz2 support)\n")
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 else:
try:
import bz2
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 bz2.BZ2Compressor # silence unused import warning
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except ImportError:
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 raise SystemExit(
"Couldn't import standard bz2 (incomplete Python install).")
Dirkjan Ochtman
setup: fail if bz2 is not available
r10761
Joan Massich
setup.py: do not install c extensions on pypy...
r24192 ispypy = "PyPy" in sys.version
Gregory Szorc
setup: detect Python DLL filename from loaded DLL...
r29020 import ctypes
Augie Fackler
setup: fix mistake that prevented Python 3 from being excluded...
r33592 import stat, subprocess, time
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 import re
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 import shutil
import tempfile
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 from distutils import log
Gregory Szorc
setup: use setuptools on Windows (issue5400)...
r31289 # We have issues with setuptools on some platforms and builders. Until
# those are resolved, setuptools is opt-in except for platforms where
# we don't have issues.
Yuya Nishihara
setup: silence warning of unknown option python_requires on distutils...
r33601 issetuptools = (os.name == 'nt' or 'FORCE_SETUPTOOLS' in os.environ)
if issetuptools:
Nathan Goldbaum
setup: import setup from setuptools if FORCE_SETUPTOOLS is set...
r26600 from setuptools import setup
else:
from distutils.core import setup
Jun Wu
setup: test setproctitle before building osutil...
r30408 from distutils.ccompiler import new_compiler
Nathan Goldbaum
setup: import setup from setuptools if FORCE_SETUPTOOLS is set...
r26600 from distutils.core import Command, Extension
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.dist import Distribution
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.command.build import build
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 from distutils.command.build_ext import build_ext
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.command.build_py import build_py
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 from distutils.command.build_scripts import build_scripts
Matt Harbison
setup: prevent setuptools from laying an egg...
r32647 from distutils.command.install import install
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 from distutils.command.install_lib import install_lib
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661 from distutils.command.install_scripts import install_scripts
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.spawn import spawn, find_executable
Ludovic Chabant
setup: don't fail when Python doesn't have the cygwinccompiler package...
r23677 from distutils import file_util
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 from distutils.errors import (
CCompilerError,
DistutilsError,
DistutilsExecError,
)
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 from distutils.sysconfig import get_python_inc, get_config_var
Dirkjan Ochtman
setup.py: use StrictVersion instead of manual comparison
r13594 from distutils.version import StrictVersion
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157
Gregory Szorc
setup: only write some autogenerated files if they change...
r35229 def write_if_changed(path, content):
"""Write content to a file iff the content hasn't changed."""
if os.path.exists(path):
with open(path, 'rb') as fh:
current = fh.read()
else:
current = b''
if current != content:
with open(path, 'wb') as fh:
fh.write(content)
Paul Moore
Add a batch file driver for Windows
r6513 scripts = ['hg']
if os.name == 'nt':
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 # We remove hg.bat if we are able to build hg.exe.
Paul Moore
Add a batch file driver for Windows
r6513 scripts.append('contrib/win32/hg.bat')
Matt Mackall
Fix setup.py warning
r3893
Jun Wu
setup: split "hasfunction" to test arbitrary code...
r31559 def cancompile(cc, code):
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 tmpdir = tempfile.mkdtemp(prefix='hg-install-')
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
r6373 devnull = oldstderr = None
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 try:
Jun Wu
setup: split "hasfunction" to test arbitrary code...
r31559 fname = os.path.join(tmpdir, 'testcomp.c')
Matt Mackall
setup: use try/except/finally...
r25089 f = open(fname, 'w')
Jun Wu
setup: split "hasfunction" to test arbitrary code...
r31559 f.write(code)
Matt Mackall
setup: use try/except/finally...
r25089 f.close()
# Redirect stderr to /dev/null to hide any error messages
# from the compiler.
# This will have to be changed if we ever have to check
# for a function on Windows.
devnull = open('/dev/null', 'w')
oldstderr = os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(), sys.stderr.fileno())
objects = cc.compile([fname], output_dir=tmpdir)
cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 return True
Matt Mackall
setup: use try/except/finally...
r25089 except Exception:
return False
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 finally:
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
r6373 if oldstderr is not None:
os.dup2(oldstderr, sys.stderr.fileno())
if devnull is not None:
devnull.close()
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 shutil.rmtree(tmpdir)
Jun Wu
setup: split "hasfunction" to test arbitrary code...
r31559 # simplified version of distutils.ccompiler.CCompiler.has_function
# that actually removes its temporary files.
def hasfunction(cc, funcname):
code = 'int main(void) { %s(); }\n' % funcname
return cancompile(cc, code)
Jun Wu
setup: add a function to test header files
r31560 def hasheader(cc, headername):
code = '#include <%s>\nint main(void) { return 0; }\n' % headername
return cancompile(cc, code)
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # py2exe needs to be installed to work
try:
Bryan O'Sullivan
Clean up whitespace damage.
r1294 import py2exe
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 py2exe.Distribution # silence unused import warning
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 py2exeloaded = True
Pascal Quantin
setup: fix py2exe generation broken by c3a6ec304055 (issue3116)...
r15527 # import py2exe's patched Distribution class
from distutils.core import Distribution
Bryan O'Sullivan
Fix Volker's modifications to setup.py for non-Windows systems.
r1284 except ImportError:
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 py2exeloaded = False
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 def runcmd(cmd, env):
Matt Harbison
plan9: drop py26 hacks
r32886 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)
out, err = p.communicate()
Adam Simpkins
setup: update runcmd() to also return the exit status...
r33111 return p.returncode, out, err
Jon M. Dugan
setup: fix mac build broken by e42d18538e1d...
r13636
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 class hgcommand(object):
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 def __init__(self, cmd, env):
self.cmd = cmd
self.env = env
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 def run(self, args):
cmd = self.cmd + args
returncode, out, err = runcmd(cmd, self.env)
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 err = filterhgerr(err)
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 if err or returncode != 0:
printf("stderr from '%s':" % (' '.join(cmd)), file=sys.stderr)
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 printf(err, file=sys.stderr)
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 return ''
return out
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 def filterhgerr(err):
# If root is executing setup.py, but the repository is owned by
# another user (as in "sudo python setup.py install") we will get
# trust warnings since the .hg/hgrc file is untrusted. That is
# fine, we don't want to load it anyway. Python may warn about
# a missing __init__.py in mercurial/locale, we also ignore that.
err = [e for e in err.splitlines()
if (not e.startswith(b'not trusting file')
and not e.startswith(b'warning: Not importing')
Kevin Bullock
setup: filter out devel-warn messages from system hg...
r34924 and not e.startswith(b'obsolete feature not enabled')
and not e.startswith(b'devel-warn:'))]
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 return b'\n'.join(b' ' + e for e in err)
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 def findhg():
"""Try to figure out how we should invoke hg for examining the local
repository contents.
Returns an hgcommand object."""
# By default, prefer the "hg" command in the user's path. This was
# presumably the hg command that the user used to create this repository.
#
# This repository may require extensions or other settings that would not
# be enabled by running the hg script directly from this local repository.
hgenv = os.environ.copy()
# Use HGPLAIN to disable hgrc settings that would change output formatting,
# and disable localization for the same reasons.
hgenv['HGPLAIN'] = '1'
hgenv['LANGUAGE'] = 'C'
hgcmd = ['hg']
# Run a simple "hg log" command just to see if using hg from the user's
# path works and can successfully interact with this repository.
check_cmd = ['log', '-r.', '-Ttest']
try:
retcode, out, err = runcmd(hgcmd + check_cmd, hgenv)
except EnvironmentError:
retcode = -1
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 if retcode == 0 and not filterhgerr(err):
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 return hgcommand(hgcmd, hgenv)
# Fall back to trying the local hg installation.
hgenv = localhgenv()
hgcmd = [sys.executable, 'hg']
try:
retcode, out, err = runcmd(hgcmd + check_cmd, hgenv)
except EnvironmentError:
retcode = -1
Yuya Nishihara
setup: do not select hg executable that prints unexpected warnings...
r33599 if retcode == 0 and not filterhgerr(err):
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 return hgcommand(hgcmd, hgenv)
raise SystemExit('Unable to find a working hg binary to extract the '
'version from the repository tags')
def localhgenv():
"""Get an environment dictionary to use for invoking or importing
mercurial from the local repository."""
Adam Simpkins
setup: move environment computation into a helper function...
r33112 # Execute hg out of this directory with a custom environment which takes
# care to not use any hgrc files and do no localization.
env = {'HGMODULEPOLICY': 'py',
'HGRCPATH': '',
'LANGUAGE': 'C',
'PATH': ''} # make pypi modules that use os.environ['PATH'] happy
if 'LD_LIBRARY_PATH' in os.environ:
env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
if 'SystemRoot' in os.environ:
# SystemRoot is required by Windows to load various DLLs. See:
# https://bugs.python.org/issue13524#msg148850
env['SystemRoot'] = os.environ['SystemRoot']
Jun Wu
setup: fix localhgenv...
r33117 return env
Adam Simpkins
setup: move environment computation into a helper function...
r33112
version = ''
Matt Mackall
setup: set env global earlier (3073)
r15367
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 if os.path.isdir('.hg'):
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 hg = findhg()
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 cmd = ['log', '-r', '.', '--template', '{tags}\n']
Yuya Nishihara
setup: convert version strings to unicode on Python 3...
r35246 numerictags = [t for t in sysstr(hg.run(cmd)).split() if t[0:1].isdigit()]
hgid = sysstr(hg.run(['id', '-i'])).strip()
Adam Simpkins
setup: fail if we cannot determine the version number...
r33110 if not hgid:
# Bail out if hg is having problems interacting with this repository,
# rather than falling through and producing a bogus version number.
# Continuing with an invalid version number will break extensions
# that define minimumhgversion.
raise SystemExit('Unable to determine hg version from local repository')
Bryan O'Sullivan
setup: calculate version more correctly...
r17709 if numerictags: # tag(s) found
version = numerictags[-1]
if hgid.endswith('+'): # propagate the dirty status to the tag
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 version += '+'
Bryan O'Sullivan
setup: calculate version more correctly...
r17709 else: # no tag found
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 ltagcmd = ['parents', '--template', '{latesttag}']
Yuya Nishihara
setup: convert version strings to unicode on Python 3...
r35246 ltag = sysstr(hg.run(ltagcmd))
Adam Simpkins
setup: replace runhg() with an hgcommand helper class...
r33113 changessincecmd = ['log', '-T', 'x\n', '-r', "only(.,'%s')" % ltag]
changessince = len(hg.run(changessincecmd).splitlines())
Siddharth Agarwal
setup: use changes since latest tag instead of just distance...
r23647 version = '%s+%s-%s' % (ltag, changessince, hgid)
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if version.endswith('+'):
version += time.strftime('%Y%m%d')
elif os.path.exists('.hg_archival.txt'):
Martin Geisler
setup.py: keep Python 2.3 compatibility...
r10124 kw = dict([[t.strip() for t in l.split(':', 1)]
for l in open('.hg_archival.txt')])
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if 'tag' in kw:
timeless
cleanup: remove superfluous space after space after equals (python)
r27637 version = kw['tag']
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 elif 'latesttag' in kw:
Siddharth Agarwal
setup: use changessincelatesttag from archive if present...
r23646 if 'changessincelatesttag' in kw:
version = '%(latesttag)s+%(changessincelatesttag)s-%(node).12s' % kw
else:
version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 else:
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 version = kw.get('node', '')[:12]
Matt Mackall
refactor version code...
r7632
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548 if version:
Gregory Szorc
setup: only write some autogenerated files if they change...
r35229 versionb = version
if not isinstance(versionb, bytes):
versionb = versionb.encode('ascii')
write_if_changed('mercurial/__version__.py', b''.join([
b'# this file is autogenerated by setup.py\n'
b'version = "%s"\n' % versionb,
]))
Jeremy Whitlock
Fix how setup.py identifies the Mercurial version....
r8493
try:
timeless
setup: show how to set the module policy for imports...
r28431 oldpolicy = os.environ.get('HGMODULEPOLICY', None)
os.environ['HGMODULEPOLICY'] = 'py'
Jeremy Whitlock
Fix how setup.py identifies the Mercurial version....
r8493 from mercurial import __version__
version = __version__.version
except ImportError:
version = 'unknown'
timeless
setup: show how to set the module policy for imports...
r28431 finally:
if oldpolicy is None:
del os.environ['HGMODULEPOLICY']
else:
os.environ['HGMODULEPOLICY'] = oldpolicy
Matt Mackall
refactor version code...
r7632
Simon Heimberg
setup: subclass build command
r15460 class hgbuild(build):
# Insert hgbuildmo first so that files in mercurial/locale/ are found
# when build_py is run next.
Gregory Szorc
setup: remove support for 2to3...
r28398 sub_commands = [('build_mo', None)] + build.sub_commands
Simon Heimberg
setup: subclass build command
r15460
Matt Mackall
setup: backout 8504699d1aa6...
r15523 class hgbuildmo(build):
Martin Geisler
i18n: new build_mo command for setup.py...
r7649
description = "build translations (.mo files)"
def run(self):
if not find_executable('msgfmt'):
self.warn("could not find msgfmt executable, no translations "
"will be built")
return
podir = 'i18n'
if not os.path.isdir(podir):
self.warn("could not find %s/ directory" % podir)
return
join = os.path.join
for po in os.listdir(podir):
if not po.endswith('.po'):
continue
pofile = join(podir, po)
modir = join('locale', po[:-3], 'LC_MESSAGES')
mofile = join(modir, 'hg.mo')
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 mobuildfile = join('mercurial', mofile)
cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
Martin Geisler
setup: do not use -c with msgfmt on Solaris (issue1489)
r7720 if sys.platform != 'sunos5':
# msgfmt on Solaris does not know about -c
cmd.append('-c')
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 self.mkpath(join('mercurial', modir))
self.make_file([pofile], mobuildfile, spawn, (cmd,))
Martin Geisler
i18n: new build_mo command for setup.py...
r7649
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661
Simon Heimberg
setup: subclass distribution instead of overwriting original
r15458 class hgdist(Distribution):
Maciej Fijalkowski
setup: prepare for future cffi modules by adding placeholder in setup
r29505 pure = False
cffi = ispypy
Simon Heimberg
setup: subclass distribution instead of overwriting original
r15458
global_options = Distribution.global_options + \
[('pure', None, "use pure (slow) Python "
"code instead of C extensions"),
]
Martin Geisler
add --pure flag to setup.py...
r7722
Simon Heimberg
setup: has_ext_modules always returns false when pure is specified...
r15459 def has_ext_modules(self):
# self.ext_modules is emptied in hgbuildpy.finalize_options which is
# too late for some cases
return not self.pure and Distribution.has_ext_modules(self)
Gregory Szorc
setup: add flag to build_ext to control building zstd...
r30450 # This is ugly as a one-liner. So use a variable.
buildextnegops = dict(getattr(build_ext, 'negative_options', {}))
buildextnegops['no-zstd'] = 'zstd'
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 class hgbuildext(build_ext):
Gregory Szorc
setup: add flag to build_ext to control building zstd...
r30450 user_options = build_ext.user_options + [
('zstd', None, 'compile zstd bindings [default]'),
('no-zstd', None, 'do not compile zstd bindings'),
]
boolean_options = build_ext.boolean_options + ['zstd']
negative_opt = buildextnegops
def initialize_options(self):
self.zstd = True
return build_ext.initialize_options(self)
def build_extensions(self):
# Filter out zstd if disabled via argument.
if not self.zstd:
self.extensions = [e for e in self.extensions
if e.name != 'mercurial.zstd']
return build_ext.build_extensions(self)
Christian Boos
setup: ignore failures to build optional inotify extension
r11468
def build_extension(self, ext):
try:
build_ext.build_extension(self, ext)
except CCompilerError:
Martin Geisler
setup: slight simplification
r12501 if not getattr(ext, 'optional', False):
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 raise
log.warn("Failed to build optional extension '%s' (skipping)",
ext.name)
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 class hgbuildscripts(build_scripts):
def run(self):
FUJIWARA Katsunori
setup: avoid procedure related to hg.exe at setup.py --pure...
r28041 if os.name != 'nt' or self.distribution.pure:
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 return build_scripts.run(self)
exebuilt = False
try:
self.run_command('build_hgexe')
exebuilt = True
except (DistutilsError, CCompilerError):
log.warn('failed to build optional hg.exe')
if exebuilt:
# Copying hg.exe to the scripts build directory ensures it is
# installed by the install_scripts command.
hgexecommand = self.get_finalized_command('build_hgexe')
dest = os.path.join(self.build_dir, 'hg.exe')
self.mkpath(self.build_dir)
self.copy_file(hgexecommand.hgexepath, dest)
# Remove hg.bat because it is redundant with hg.exe.
self.scripts.remove('contrib/win32/hg.bat')
return build_scripts.run(self)
Martin Geisler
setup: cleanup coding style
r10000 class hgbuildpy(build_py):
Martin Geisler
add --pure flag to setup.py...
r7722 def finalize_options(self):
build_py.finalize_options(self)
if self.distribution.pure:
self.distribution.ext_modules = []
Maciej Fijalkowski
setup: prepare for future cffi modules by adding placeholder in setup
r29505 elif self.distribution.cffi:
Jun Wu
setup: move cffi stuff to mercurial/cffi...
r30346 from mercurial.cffi import (
Yuya Nishihara
cffi: rename build scripts...
r32505 bdiffbuild,
mpatchbuild,
Jun Wu
setup: move cffi stuff to mercurial/cffi...
r30346 )
Yuya Nishihara
cffi: rename build scripts...
r32505 exts = [mpatchbuild.ffi.distutils_extension(),
bdiffbuild.ffi.distutils_extension()]
Maciej Fijalkowski
setup: prepare for future cffi modules by adding placeholder in setup
r29505 # cffi modules go here
Maciej Fijalkowski
osutil: add darwin-only version of os.listdir using cffi
r29600 if sys.platform == 'darwin':
Yuya Nishihara
cffi: rename build scripts...
r32505 from mercurial.cffi import osutilbuild
exts.append(osutilbuild.ffi.distutils_extension())
Maciej Fijalkowski
setup: prepare for future cffi modules by adding placeholder in setup
r29505 self.distribution.ext_modules = exts
Nicolas Dumazet
setup: user-friendly error message if Python headers are missing
r12649 else:
Mads Kiilerich
setup: make error message for missing Python headers more helpful
r18905 h = os.path.join(get_python_inc(), 'Python.h')
if not os.path.exists(h):
Brodie Rao
cleanup: eradicate long lines
r16683 raise SystemExit('Python headers are required to build '
Mads Kiilerich
setup: make error message for missing Python headers more helpful
r18905 'Mercurial but weren\'t found in %s' % h)
Martin Geisler
add --pure flag to setup.py...
r7722
timeless
setup: create a module for the modulepolicy...
r28430 def run(self):
Yuya Nishihara
setup: do not overwrite local __modulepolicy__.py on out-of-source build...
r32653 basepath = os.path.join(self.build_lib, 'mercurial')
self.mkpath(basepath)
timeless
setup: create a module for the modulepolicy...
r28430 if self.distribution.pure:
modulepolicy = 'py'
Yuya Nishihara
policy: relax the default for in-place build...
r32251 elif self.build_lib == '.':
# in-place build should run without rebuilding C extensions
modulepolicy = 'allow'
timeless
setup: create a module for the modulepolicy...
r28430 else:
modulepolicy = 'c'
Gregory Szorc
setup: only write some autogenerated files if they change...
r35229
content = b''.join([
b'# this file is autogenerated by setup.py\n',
b'modulepolicy = b"%s"\n' % modulepolicy.encode('ascii'),
])
write_if_changed(os.path.join(basepath, '__modulepolicy__.py'),
content)
Gregory Szorc
setup: refactor handling of modules with C/Python implementations...
r27222
timeless
setup: create a module for the modulepolicy...
r28430 build_py.run(self)
Martin Geisler
add --pure flag to setup.py...
r7722
Yuya Nishihara
setup: add command to generate index of extensions...
r14538 class buildhgextindex(Command):
description = 'generate prebuilt index of hgext (for frozen package)'
user_options = []
_indexfilename = 'hgext/__index__.py'
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
if os.path.exists(self._indexfilename):
timeless
setup: switch to with open as...
r28418 with open(self._indexfilename, 'w') as f:
f.write('# empty\n')
Yuya Nishihara
setup: add command to generate index of extensions...
r14538
# here no extension enabled, disabled() lists up everything
code = ('import pprint; from mercurial import extensions; '
'pprint.pprint(extensions.disabled())')
Adam Simpkins
setup: prefer using the system hg to interact with the local repository...
r33114 returncode, out, err = runcmd([sys.executable, '-c', code],
localhgenv())
Adam Simpkins
setup: update runcmd() to also return the exit status...
r33111 if err or returncode != 0:
Yuya Nishihara
setup: add command to generate index of extensions...
r14538 raise DistutilsExecError(err)
timeless
setup: switch to with open as...
r28418 with open(self._indexfilename, 'w') as f:
f.write('# this file is autogenerated by setup.py\n')
f.write('docs = ')
f.write(out)
Yuya Nishihara
setup: add command to generate index of extensions...
r14538
Adrian Buehlmann
setup: compile hg.exe...
r17061 class buildhgexe(build_ext):
description = 'compile hg.exe from mercurial/exewrapper.c'
Kostia Balytskyi
windows: add an experimental option for long paths support...
r34531 user_options = build_ext.user_options + [
('long-paths-support', None, 'enable support for long paths on '
'Windows (off by default and '
'experimental)'),
]
LONG_PATHS_MANIFEST = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application>
<windowsSettings
xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
</assembly>"""
def initialize_options(self):
build_ext.initialize_options(self)
self.long_paths_support = False
Adrian Buehlmann
setup: compile hg.exe...
r17061
def build_extensions(self):
if os.name != 'nt':
return
Adrian Buehlmann
setup: fix build_hgexe for mingw32 compiler...
r17246 if isinstance(self.compiler, HackedMingw32CCompiler):
self.compiler.compiler_so = self.compiler.compiler # no -mdll
self.compiler.dll_libraries = [] # no -lmsrvc90
Gregory Szorc
setup: detect Python DLL filename from loaded DLL...
r29020
# Different Python installs can have different Python library
# names. e.g. the official CPython distribution uses pythonXY.dll
# and MinGW uses libpythonX.Y.dll.
_kernel32 = ctypes.windll.kernel32
_kernel32.GetModuleFileNameA.argtypes = [ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_ulong]
_kernel32.GetModuleFileNameA.restype = ctypes.c_ulong
size = 1000
buf = ctypes.create_string_buffer(size + 1)
filelen = _kernel32.GetModuleFileNameA(sys.dllhandle, ctypes.byref(buf),
size)
if filelen > 0 and filelen != size:
dllbasename = os.path.basename(buf.value)
if not dllbasename.lower().endswith('.dll'):
raise SystemExit('Python DLL does not end with .dll: %s' %
dllbasename)
pythonlib = dllbasename[:-4]
else:
log.warn('could not determine Python DLL filename; '
'assuming pythonXY')
hv = sys.hexversion
pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff)
log.info('using %s as Python library name' % pythonlib)
timeless
setup: switch to with open as...
r28418 with open('mercurial/hgpythonlib.h', 'wb') as f:
f.write('/* this file is autogenerated by setup.py */\n')
f.write('#define HGPYTHONLIB "%s"\n' % pythonlib)
Adrian Buehlmann
setup: compile hg.exe...
r17061 objects = self.compiler.compile(['mercurial/exewrapper.c'],
output_dir=self.build_temp)
dir = os.path.dirname(self.get_ext_fullpath('dummy'))
Kostia Balytskyi
windows: add an experimental option for long paths support...
r34531 self.hgtarget = os.path.join(dir, 'hg')
self.compiler.link_executable(objects, self.hgtarget,
Adrian Buehlmann
exewrapper: adapt for legacy HackableMercurial...
r17732 libraries=[],
Adrian Buehlmann
setup: compile hg.exe...
r17061 output_dir=self.build_temp)
Kostia Balytskyi
windows: add an experimental option for long paths support...
r34531 if self.long_paths_support:
self.addlongpathsmanifest()
def addlongpathsmanifest(self):
"""Add manifest pieces so that hg.exe understands long paths
This is an EXPERIMENTAL feature, use with care.
To enable long paths support, one needs to do two things:
- build Mercurial with --long-paths-support option
- change HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\
LongPathsEnabled to have value 1.
Please ignore 'warning 81010002: Unrecognized Element "longPathAware"';
it happens because Mercurial uses mt.exe circa 2008, which is not
yet aware of long paths support in the manifest (I think so at least).
This does not stop mt.exe from embedding/merging the XML properly.
Why resource #1 should be used for .exe manifests? I don't know and
wasn't able to find an explanation for mortals. But it seems to work.
"""
exefname = self.compiler.executable_filename(self.hgtarget)
fdauto, manfname = tempfile.mkstemp(suffix='.hg.exe.manifest')
os.close(fdauto)
with open(manfname, 'w') as f:
f.write(self.LONG_PATHS_MANIFEST)
log.info("long paths manifest is written to '%s'" % manfname)
inputresource = '-inputresource:%s;#1' % exefname
outputresource = '-outputresource:%s;#1' % exefname
log.info("running mt.exe to update hg.exe's manifest in-place")
# supplying both -manifest and -inputresource to mt.exe makes
# it merge the embedded and supplied manifests in the -outputresource
self.spawn(['mt.exe', '-nologo', '-manifest', manfname,
inputresource, outputresource])
log.info("done updating hg.exe's manifest")
os.remove(manfname)
Adrian Buehlmann
setup: compile hg.exe...
r17061
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 @property
def hgexepath(self):
dir = os.path.dirname(self.get_ext_fullpath('dummy'))
return os.path.join(self.build_temp, dir, 'hg.exe')
Matt Harbison
setup: prevent setuptools from laying an egg...
r32647 class hginstall(install):
Augie Fackler
setup: introduce dummy copies of setuptools flags...
r32725
user_options = install.user_options + [
('old-and-unmanageable', None,
'noop, present for eggless setuptools compat'),
('single-version-externally-managed', None,
'noop, present for eggless setuptools compat'),
]
# Also helps setuptools not be sad while we refuse to create eggs.
single_version_externally_managed = True
Matt Harbison
setup: prevent setuptools from laying an egg...
r32647 def get_sub_commands(self):
# Screen out egg related commands to prevent egg generation. But allow
# mercurial.egg-info generation, since that is part of modern
# packaging.
Yuya Nishihara
setup: drop use of set literal so parsable on Python 2.6...
r33590 excl = set(['bdist_egg'])
Matt Harbison
setup: prevent setuptools from laying an egg...
r32647 return filter(lambda x: x not in excl, install.get_sub_commands(self))
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 class hginstalllib(install_lib):
'''
This is a specialization of install_lib that replaces the copy_file used
there so that it supports setting the mode of files after copying them,
instead of just preserving the mode that the files originally had. If your
system has a umask of something like 027, preserving the permissions when
copying will lead to a broken install.
Note that just passing keep_permissions=False to copy_file would be
insufficient, as it might still be applying a umask.
'''
def run(self):
realcopyfile = file_util.copy_file
def copyfileandsetmode(*args, **kwargs):
src, dst = args[0], args[1]
dst, copied = realcopyfile(*args, **kwargs)
if copied:
st = os.stat(src)
# Persist executable bit (apply it to group and other if user
# has it)
if st[stat.ST_MODE] & stat.S_IXUSR:
Augie Fackler
setup: hide octal literals inside strings so they're portable (issue4554)
r24941 setmode = int('0755', 8)
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 else:
Augie Fackler
setup: hide octal literals inside strings so they're portable (issue4554)
r24941 setmode = int('0644', 8)
m = stat.S_IMODE(st[stat.ST_MODE])
m = (m & ~int('0777', 8)) | setmode
os.chmod(dst, m)
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 file_util.copy_file = copyfileandsetmode
try:
install_lib.run(self)
finally:
file_util.copy_file = realcopyfile
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661 class hginstallscripts(install_scripts):
'''
This is a specialization of install_scripts that replaces the @LIBDIR@ with
the configured directory for modules. If possible, the path is made relative
to the directory for scripts.
'''
def initialize_options(self):
install_scripts.initialize_options(self)
self.install_lib = None
def finalize_options(self):
install_scripts.finalize_options(self)
self.set_undefined_options('install',
('install_lib', 'install_lib'))
def run(self):
install_scripts.run(self)
Gregory Szorc
setup.py: don't rewrite @LIBDIR@ when creating wheels...
r27269 # It only makes sense to replace @LIBDIR@ with the install path if
# the install path is known. For wheels, the logic below calculates
# the libdir to be "../..". This is because the internal layout of a
# wheel archive looks like:
#
# mercurial-3.6.1.data/scripts/hg
# mercurial/__init__.py
#
# When installing wheels, the subdirectories of the "<pkg>.data"
# directory are translated to system local paths and files therein
# are copied in place. The mercurial/* files are installed into the
# site-packages directory. However, the site-packages directory
# isn't known until wheel install time. This means we have no clue
# at wheel generation time what the installed site-packages directory
# will be. And, wheels don't appear to provide the ability to register
# custom code to run during wheel installation. This all means that
# we can't reliably set the libdir in wheels: the default behavior
# of looking in sys.path must do.
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661 if (os.path.splitdrive(self.install_dir)[0] !=
os.path.splitdrive(self.install_lib)[0]):
# can't make relative paths from one drive to another, so use an
# absolute path instead
libdir = self.install_lib
else:
common = os.path.commonprefix((self.install_dir, self.install_lib))
rest = self.install_dir[len(common):]
uplevel = len([n for n in os.path.split(rest) if n])
timeless
cleanup: remove superfluous space after space after equals (python)
r27637 libdir = uplevel * ('..' + os.sep) + self.install_lib[len(common):]
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661
for outfile in self.outfiles:
timeless
setup: switch to with open as...
r28418 with open(outfile, 'rb') as fp:
data = fp.read()
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661
# skip binary files
Gregory Szorc
setup.py: use bytes literals...
r27348 if b'\0' in data:
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661 continue
Gregory Szorc
setup.py: don't rewrite @LIBDIR@ when creating wheels...
r27269 # During local installs, the shebang will be rewritten to the final
# install path. During wheel packaging, the shebang has a special
# value.
if data.startswith(b'#!python'):
log.info('not rewriting @LIBDIR@ in %s because install path '
'not known' % outfile)
continue
Gregory Szorc
setup.py: use bytes literals...
r27348 data = data.replace(b'@LIBDIR@', libdir.encode(libdir_escape))
timeless
setup: switch to with open as...
r28418 with open(outfile, 'wb') as fp:
fp.write(data)
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661
Simon Heimberg
setup: subclass build command
r15460 cmdclass = {'build': hgbuild,
'build_mo': hgbuildmo,
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 'build_ext': hgbuildext,
Dan Villiom Podlaski Christiansen
setup/hg: always load Mercurial from where it was installed....
r12661 'build_py': hgbuildpy,
Gregory Szorc
setup.py: attempt to build and install hg.exe on Windows...
r27268 'build_scripts': hgbuildscripts,
Yuya Nishihara
setup: add command to generate index of extensions...
r14538 'build_hgextindex': buildhgextindex,
Matt Harbison
setup: prevent setuptools from laying an egg...
r32647 'install': hginstall,
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 'install_lib': hginstalllib,
Adrian Buehlmann
setup: compile hg.exe...
r17061 'install_scripts': hginstallscripts,
'build_hgexe': buildhgexe,
}
Thomas Arendsen Hein
Applied coding style to setup.py
r3238
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 packages = ['mercurial',
'mercurial.cext',
Yuya Nishihara
cffi: put compiled modules into mercurial.cffi package...
r32506 'mercurial.cffi',
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 'mercurial.hgweb',
Gregory Szorc
setup: refactor handling of modules with C/Python implementations...
r27222 'mercurial.pure',
Siddharth Agarwal
thirdparty: vendor attrs...
r34398 'mercurial.thirdparty',
'mercurial.thirdparty.attr',
Sean Farley
setup: add missing hgext.fsmonitor...
r28625 'hgext', 'hgext.convert', 'hgext.fsmonitor',
'hgext.fsmonitor.pywatchman', 'hgext.highlight',
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 'hgext.largefiles', 'hgext.lfs', 'hgext.narrow',
'hgext.zeroconf', 'hgext3rd',
Siddharth Agarwal
demandimport: move to separate package...
r32420 'hgdemandimport']
Benoit Boissinot
Do not use osutil.c with python 2.4 and Windows (issue1364)...
r10521
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 common_depends = ['mercurial/bitmanipulation.h',
'mercurial/compat.h',
Yuya Nishihara
cext: move util.h to cext tree...
r32384 'mercurial/cext/util.h']
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 common_include_dirs = ['mercurial']
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724
Jun Wu
setup: test setproctitle before building osutil...
r30408 osutil_cflags = []
Adrian Buehlmann
setup: move osutil_ldflags logic to before extmodules definition
r25073 osutil_ldflags = []
Jun Wu
setup: detect statfs...
r31561 # platform specific macros
Jun Wu
statfs: change Linux feature detection...
r31622 for plat, func in [('bsd', 'setproctitle')]:
Jun Wu
setup: detect statfs...
r31561 if re.search(plat, sys.platform) and hasfunction(new_compiler(), func):
Jun Wu
setup: test setproctitle before building osutil...
r30408 osutil_cflags.append('-DHAVE_%s' % func.upper())
Jun Wu
setup: use a more strict way to test BSD or OSX's statfs...
r31596 for plat, macro, code in [
('bsd|darwin', 'BSD_STATFS', '''
#include <sys/param.h>
#include <sys/mount.h>
int main() { struct statfs s; return sizeof(s.f_fstypename); }
'''),
Jun Wu
statfs: change Linux feature detection...
r31622 ('linux', 'LINUX_STATFS', '''
#include <linux/magic.h>
#include <sys/vfs.h>
int main() { struct statfs s; return sizeof(s.f_type); }
'''),
Jun Wu
setup: use a more strict way to test BSD or OSX's statfs...
r31596 ]:
if re.search(plat, sys.platform) and cancompile(new_compiler(), code):
osutil_cflags.append('-DHAVE_%s' % macro)
Adrian Buehlmann
setup: move osutil_ldflags logic to before extmodules definition
r25073 if sys.platform == 'darwin':
osutil_ldflags += ['-framework', 'ApplicationServices']
Martin Geisler
setup: cleanup coding style
r10000 extmodules = [
Yuya Nishihara
base85: switch to policy importer
r32368 Extension('mercurial.cext.base85', ['mercurial/cext/base85.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 depends=common_depends),
Yuya Nishihara
bdiff: switch to policy importer...
r32369 Extension('mercurial.cext.bdiff', ['mercurial/bdiff.c',
'mercurial/cext/bdiff.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Maciej Fijalkowski
bdiff: split bdiff into cpy-aware and cpy-agnostic part
r29541 depends=common_depends + ['mercurial/bdiff.h']),
Yuya Nishihara
diffhelpers: switch to policy importer...
r32370 Extension('mercurial.cext.diffhelpers', ['mercurial/cext/diffhelpers.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 depends=common_depends),
Yuya Nishihara
mpatch: switch to policy importer
r32371 Extension('mercurial.cext.mpatch', ['mercurial/mpatch.c',
'mercurial/cext/mpatch.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 depends=common_depends),
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 Extension('mercurial.cext.parsers', ['mercurial/cext/charencode.c',
'mercurial/cext/dirs.c',
Yuya Nishihara
parsers: switch to policy importer...
r32372 'mercurial/cext/manifest.c',
'mercurial/cext/parsers.c',
Gregory Szorc
cext: extract revlog/index parsing code to own C file...
r32378 'mercurial/cext/pathencode.c',
'mercurial/cext/revlog.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Yuya Nishihara
cext: factor out header for charencode.c...
r33753 depends=common_depends + ['mercurial/cext/charencode.h']),
Yuya Nishihara
osutil: switch to policy importer...
r32367 Extension('mercurial.cext.osutil', ['mercurial/cext/osutil.c'],
Yuya Nishihara
policy: add "cext" package which will host CPython extension modules...
r32206 include_dirs=common_include_dirs,
Jun Wu
setup: test setproctitle before building osutil...
r30408 extra_compile_args=osutil_cflags,
Adrian Buehlmann
setup: integrate osutil C extension into extmodules initialization
r25074 extra_link_args=osutil_ldflags,
depends=common_depends),
Martijn Pieters
fsmonitor: dependencies for new experimental extension...
r28432 Extension('hgext.fsmonitor.pywatchman.bser',
['hgext/fsmonitor/pywatchman/bser.c']),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ]
Gregory Szorc
setup: compile zstd C extension...
r30436 sys.path.insert(0, 'contrib/python-zstandard')
import setup_zstd
Gregory Szorc
setup: pass named argument to setup_zstd...
r30698 extmodules.append(setup_zstd.get_c_extension(name='mercurial.zstd'))
Gregory Szorc
setup: compile zstd C extension...
r30436
Ludovic Chabant
setup: don't fail when Python doesn't have the cygwinccompiler package...
r23677 try:
from distutils import cygwinccompiler
# the -mno-cygwin option has been deprecated for years
Mike Hommey
setup: fix installing in a mingw environment...
r33780 mingw32compilerclass = cygwinccompiler.Mingw32CCompiler
Bryan O'Sullivan
setup: disable -mno-cygwin if building under mingw32...
r17121
Ludovic Chabant
setup: don't fail when Python doesn't have the cygwinccompiler package...
r23677 class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler):
def __init__(self, *args, **kwargs):
Mike Hommey
setup: fix installing in a mingw environment...
r33780 mingw32compilerclass.__init__(self, *args, **kwargs)
Ludovic Chabant
setup: don't fail when Python doesn't have the cygwinccompiler package...
r23677 for i in 'compiler compiler_so linker_exe linker_so'.split():
try:
getattr(self, i).remove('-mno-cygwin')
except ValueError:
pass
Bryan O'Sullivan
setup: disable -mno-cygwin if building under mingw32...
r17121
Ludovic Chabant
setup: don't fail when Python doesn't have the cygwinccompiler package...
r23677 cygwinccompiler.Mingw32CCompiler = HackedMingw32CCompiler
except ImportError:
# the cygwinccompiler package is not available on some Python
# distributions like the ones from the optware project for Synology
# DiskStation boxes
class HackedMingw32CCompiler(object):
pass
Bryan O'Sullivan
setup: disable -mno-cygwin if building under mingw32...
r17121
Matt Harbison
setup: avoid linker warnings on Windows about multiple export specifications...
r32782 if os.name == 'nt':
# Allow compiler/linker flags to be added to Visual Studio builds. Passing
# extra_link_args to distutils.extensions.Extension() doesn't have any
# effect.
from distutils import msvccompiler
Mike Hommey
setup: fix installing in a mingw environment...
r33780 msvccompilerclass = msvccompiler.MSVCCompiler
Matt Harbison
setup: avoid linker warnings on Windows about multiple export specifications...
r32782
class HackedMSVCCompiler(msvccompiler.MSVCCompiler):
def initialize(self):
Mike Hommey
setup: fix installing in a mingw environment...
r33780 msvccompilerclass.initialize(self)
Matt Harbison
setup: avoid linker warnings on Windows about multiple export specifications...
r32782 # "warning LNK4197: export 'func' specified multiple times"
self.ldflags_shared.append('/ignore:4197')
self.ldflags_shared_debug.append('/ignore:4197')
msvccompiler.MSVCCompiler = HackedMSVCCompiler
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
Mads Kiilerich
ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs...
r22575 'help/*.txt',
Gregory Szorc
setup.py: package internals help files...
r27374 'help/internals/*.txt',
Mads Kiilerich
config: introduce "built-in" default configuration settings in default.d...
r23142 'default.d/*.rc',
Mads Kiilerich
ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs...
r22575 'dummycert.pem']}
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999
def ordinarypath(p):
return p and p[0] != '.' and p[-1] != '~'
Matt Mackall
many, many trivial check-code fixups
r10282 for root in ('templates',):
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
curdir = curdir.split(os.sep, 1)[1]
dirs[:] = filter(ordinarypath, dirs)
for f in filter(ordinarypath, files):
f = os.path.join(curdir, f)
packagedata['mercurial'].append(f)
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 datafiles = []
Gregory Szorc
setup: convert setupversion to unicode...
r31316
# distutils expects version to be str/unicode. Converting it to
# unicode on Python 2 still works because it won't contain any
# non-ascii bytes and will be implicitly converted back to bytes
# when operated on.
assert isinstance(version, bytes)
setupversion = version.decode('ascii')
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 extra = {}
Yuya Nishihara
setup: silence warning of unknown option python_requires on distutils...
r33601 if issetuptools:
extra['python_requires'] = supportedpy
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 if py2exeloaded:
extra['console'] = [
{'script':'hg',
av6
copyright: update to 2018...
r35792 'copyright':'Copyright (C) 2005-2018 Matt Mackall and others',
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 'product_version':version}]
Yuya Nishihara
setup: add command to generate index of extensions...
r14538 # sub command of 'build' because 'py2exe' does not handle sub_commands
build.sub_commands.insert(0, ('build_hgextindex', None))
Steve Borho
wix: move library.zip and all *.pyd into a lib/ folder...
r25409 # put dlls in sub directory so that they won't pollute PATH
extra['zipfile'] = 'lib/library.zip'
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400
if os.name == 'nt':
# Windows binary file versions for exe/dll files must have the
# form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535
setupversion = version.split('+', 1)[0]
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648
Alexander Solovyov
fix compiling of extensions for OS X and XCode 4.0
r13583 if sys.platform == 'darwin' and os.path.exists('/usr/bin/xcodebuild'):
Adam Simpkins
setup: fix runcmd() usage on darwin...
r33119 version = runcmd(['/usr/bin/xcodebuild', '-version'], {})[1].splitlines()
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187 if version:
Brendan Cully
setup.py: don't call splitlines twice on the output of xcodebuild (issue3277)
r16209 version = version[0]
Augie Fackler
setup: decode xcode version number on python3
r25043 if sys.version_info[0] == 3:
version = version.decode('utf-8')
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187 xcode4 = (version.startswith('Xcode') and
StrictVersion(version.split()[1]) >= StrictVersion('4.0'))
Matt Mackall
setup: make Xcode 5.1 check less specific...
r21558 xcode51 = re.match(r'^Xcode\s+5\.1', version) is not None
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187 else:
# xcodebuild returns empty on OS X Lion with XCode 4.3 not
# installed, but instead with only command-line tools. Assume
# that only happens on >= Lion, thus no PPC support.
xcode4 = True
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 xcode51 = False
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 # XCode 4.0 dropped support for ppc architecture, which is hardcoded in
# distutils.sysconfig
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187 if xcode4:
Brendan Cully
Hardcoding ARCHFLAGS breaks the build against fink's python...
r14324 os.environ['ARCHFLAGS'] = ''
Alexander Solovyov
fix compiling of extensions for OS X and XCode 4.0
r13583
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 # XCode 5.1 changes clang such that it now fails to compile if the
# -mno-fused-madd flag is passed, but the version of Python shipped with
# OS X 10.9 Mavericks includes this flag. This causes problems in all
# C extension modules, and a bug has been filed upstream at
# http://bugs.python.org/issue21244. We also need to patch this here
# so Mercurial can continue to compile in the meantime.
if xcode51:
cflags = get_config_var('CFLAGS')
Alex Gaynor
setup: fixed for Pythons which don't have a CFLAGS...
r21839 if cflags and re.search(r'-mno-fused-madd\b', cflags) is not None:
Kent Frazier
setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
r21038 os.environ['CFLAGS'] = (
os.environ.get('CFLAGS', '') + ' -Qunused-arguments')
Thomas Arendsen Hein
Don't forget version at the end of setup.py, write it only if changed....
r1977 setup(name='mercurial',
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 version=setupversion,
Benoit Boissinot
setup.py: add metadata to register package to PyPI...
r18753 author='Matt Mackall and many others',
FUJIWARA Katsunori
misc: replace domain of mercurial ML address by mercurial-scm.org...
r30888 author_email='mercurial@mercurial-scm.org',
Matt Mackall
urls: bulk-change primary website URLs
r26421 url='https://mercurial-scm.org/',
download_url='https://mercurial-scm.org/release/',
Benoit Boissinot
setup.py: add metadata to register package to PyPI...
r18753 description=('Fast scalable distributed SCM (revision control, version '
'control) system'),
long_description=('Mercurial is a distributed SCM tool written in Python.'
' It is used by a number of large projects that require'
' fast, reliable distributed revision control, such as '
'Mozilla.'),
license='GNU GPLv2 or any later version',
classifiers=[
'Development Status :: 6 - Mature',
'Environment :: Console',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Danish',
'Natural Language :: English',
'Natural Language :: German',
'Natural Language :: Italian',
'Natural Language :: Japanese',
'Natural Language :: Portuguese (Brazilian)',
'Operating System :: Microsoft :: Windows',
'Operating System :: OS Independent',
'Operating System :: POSIX',
'Programming Language :: C',
'Programming Language :: Python',
'Topic :: Software Development :: Version Control',
],
Paul Moore
Add a batch file driver for Windows
r6513 scripts=scripts,
Bryan O'Sullivan
Add inotify extension
r6239 packages=packages,
Martin Geisler
setup: cleanup coding style
r10000 ext_modules=extmodules,
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 data_files=datafiles,
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 package_data=packagedata,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 cmdclass=cmdclass,
Simon Heimberg
setup: subclass distribution instead of overwriting original
r15458 distclass=hgdist,
Yuya Nishihara
setup: forcibly include cext/pure packages in py2exe (issue5625)...
r33600 options={'py2exe': {'packages': ['hgdemandimport', 'hgext', 'email',
# implicitly imported per module policy
# (cffi wouldn't be used as a frozen exe)
'mercurial.cext',
#'mercurial.cffi',
'mercurial.pure']},
Mads Kiilerich
osx: create dmg with installer instead of zip...
r22358 'bdist_mpkg': {'zipdist': False,
Augie Fackler
setup.py: move from dict() construction to {} literals...
r20687 'license': 'COPYING',
'readme': 'contrib/macosx/Readme.html',
'welcome': 'contrib/macosx/Welcome.html',
},
},
Matt Mackall
Fix setup.py warning
r3893 **extra)