##// END OF EJS Templates
hg: obtain lock when creating share from pooled repo (issue5104)...
hg: obtain lock when creating share from pooled repo (issue5104) There are race conditions between clients performing a shared clone to pooled storage: 1) Clients race to create the new shared repo in the pool directory 2) 1 client is seeding the repo in the pool directory and another goes to share it before it is fully cloned We prevent these race conditions by obtaining a lock in the pool directory that is derived from the name of the repo we will be accessing. To test this, a simple generic "lockdelay" extension has been added. The extension inserts an optional, configurable delay before or after lock acquisition. In the test, we delay 2 seconds after lock acquisition in the first process and 1 second before lock acquisition in the 2nd process. This means the first process has 1s to obtain the lock. There is a race condition here. If we encounter it in the wild, we could change the dummy extension to wait on the lock file to appear instead of relying on timing. But that's more complicated. Let's see what happens first.

File last commit:

r28041:8da94662 stable
r28289:d493d647 3.7.2 stable
Show More
setup.py
707 lines | 25.9 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
Zachary Gramana
setup.py: workaround for missing bz2 module in IronPython...
r14295 import sys, platform
Pierre-Yves David
setup.py: drop compatibility with Python 2.4 and 2.5 (BC)...
r25009 if getattr(sys, 'version_info', (0, 0, 0)) < (2, 6, 0, 'final'):
raise SystemExit("Mercurial requires Python 2.6 or later.")
Thomas Arendsen Hein
Added check for minimal python version to setup.py
r1873
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'
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)
Renato Cunha
setup.py: Adjustments to make setup.py run in py3k....
r11532
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
Kyle Lippincott
setup: set mode 644 or 755 on installed files
r22640 import os, 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
Nathan Goldbaum
setup: import setup from setuptools if FORCE_SETUPTOOLS is set...
r26600 if 'FORCE_SETUPTOOLS' in os.environ:
from setuptools import setup
else:
from distutils.core import setup
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
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
Simon Heimberg
setup: support executing with python3 including 2to3...
r15494 convert2to3 = '--c2to3' in sys.argv
if convert2to3:
try:
from distutils.command.build_py import build_py_2to3 as build_py
from lib2to3.refactor import get_fixers_from_package as getfixers
except ImportError:
if sys.version_info[0] < 3:
raise SystemExit("--c2to3 is only compatible with python3.")
raise
sys.path.append('contrib')
Simon Heimberg
setup: raise when executing with python3 without c2to3 argument
r15500 elif sys.version_info[0] >= 3:
raise SystemExit("setup.py with python3 needs --c2to3 (experimental)")
Simon Heimberg
setup: support executing with python3 including 2to3...
r15494
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
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 # simplified version of distutils.ccompiler.CCompiler.has_function
# that actually removes its temporary files.
Martin Geisler
setup: cleanup coding style
r10000 def hasfunction(cc, funcname):
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:
Matt Mackall
setup: use try/except/finally...
r25089 fname = os.path.join(tmpdir, 'funcname.c')
f = open(fname, 'w')
f.write('int main(void) {\n')
f.write(' %s();\n' % funcname)
f.write('}\n')
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)
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):
Jeff Sickel
plan9: setup check for current python build
r23392 if (sys.platform == 'plan9'
and (sys.version_info[0] == 2 and sys.version_info[1] < 7)):
Steven Stallion
plan9: initial support for plan 9 from bell labs...
r16383 # subprocess kludge to work around issues in half-baked Python
# ports, notably bichued/python:
_, out, err = os.popen3(cmd)
return str(out), str(err)
else:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)
out, err = p.communicate()
return out, err
Jon M. Dugan
setup: fix mac build broken by e42d18538e1d...
r13636
def runhg(cmd, env):
out, err = runcmd(cmd, env)
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 # 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
Steve Borho
setup: ignore 'not importing' warnings during version detection...
r10120 # fine, we don't want to load it anyway. Python may warn about
# a missing __init__.py in mercurial/locale, we also ignore that.
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 err = [e for e in err.splitlines()
Gregory Szorc
setup.py: use bytes literals...
r27348 if not e.startswith(b'not trusting file') \
and not e.startswith(b'warning: Not importing') \
and not e.startswith(b'obsolete feature not enabled')]
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if err:
Augie Fackler
setup: handle more invalid python3 syntax...
r20696 printf("stderr from '%s':" % (' '.join(cmd)), file=sys.stderr)
Gregory Szorc
setup.py: use bytes literals...
r27348 printf(b'\n'.join([b' ' + e for e in err]), file=sys.stderr)
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 return ''
return out
version = ''
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548
Gregory Szorc
mercurial: implement import hook for handling C/Python modules...
r27220 # 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',
Yuya Nishihara
setup: set whole env for running hg even if .hg doesn't exist (issue3073)...
r15388 'HGRCPATH': '',
'LANGUAGE': 'C'}
if 'LD_LIBRARY_PATH' in os.environ:
env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
if 'SystemRoot' in os.environ:
# Copy SystemRoot into the custom environment for Python 2.6
# under Windows. Otherwise, the subprocess will fail with
# error 0xc0150004. See: http://bugs.python.org/issue3440
env['SystemRoot'] = os.environ['SystemRoot']
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'):
Bryan O'Sullivan
setup: calculate version more correctly...
r17709 cmd = [sys.executable, 'hg', 'log', '-r', '.', '--template', '{tags}\n']
numerictags = [t for t in runhg(cmd, env).split() if t[0].isdigit()]
hgid = runhg([sys.executable, 'hg', 'id', '-i'], env).strip()
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
Siddharth Agarwal
setup: use changes since latest tag instead of just distance...
r23647 ltagcmd = [sys.executable, 'hg', 'parents', '--template',
'{latesttag}']
ltag = runhg(ltagcmd, env)
changessincecmd = [sys.executable, 'hg', 'log', '-T', 'x\n', '-r',
"only(.,'%s')" % ltag]
changessince = len(runhg(changessincecmd, env).splitlines())
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:
Alejandro Santos
compat: use open() instead of file() everywhere
r9031 f = open("mercurial/__version__.py", "w")
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548 f.write('# this file is autogenerated by setup.py\n')
f.write('version = "%s"\n' % version)
f.close()
Jeremy Whitlock
Fix how setup.py identifies the Mercurial version....
r8493
try:
from mercurial import __version__
version = __version__.version
except ImportError:
version = 'unknown'
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.
sub_commands = [('build_mo', None),
Brodie Rao
cleanup: eradicate long lines
r16683
# We also need build_ext before build_py. Otherwise, when 2to3 is
# called (in build_py), it will not find osutil & friends,
# thinking that those modules are global and, consequently, making
# a mess, now that all module imports are global.
Simon Heimberg
setup: support executing with python3 including 2to3...
r15494 ('build_ext', build.has_ext_modules),
Simon Heimberg
setup: subclass build command
r15460 ] + build.sub_commands
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):
Joan Massich
setup.py: do not install c extensions on pypy...
r24192 pure = 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"),
Simon Heimberg
setup: support executing with python3 including 2to3...
r15494 ('c2to3', None, "(experimental!) convert "
"code with 2to3"),
Simon Heimberg
setup: subclass distribution instead of overwriting original
r15458 ]
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)
Christian Boos
setup: ignore failures to build optional inotify extension
r11468 class hgbuildext(build_ext):
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):
Simon Heimberg
setup: support executing with python3 including 2to3...
r15494 if convert2to3:
fixer_names = sorted(set(getfixers("lib2to3.fixes") +
getfixers("hgfixes")))
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 = []
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
Gregory Szorc
setup: refactor handling of modules with C/Python implementations...
r27222 def copy_file(self, *args, **kwargs):
dst, copied = build_py.copy_file(self, *args, **kwargs)
if copied and dst.endswith('__init__.py'):
if self.distribution.pure:
modulepolicy = 'py'
Martin Geisler
add --pure flag to setup.py...
r7722 else:
Gregory Szorc
setup: refactor handling of modules with C/Python implementations...
r27222 modulepolicy = 'c'
content = open(dst, 'rb').read()
content = content.replace(b'@MODULELOADPOLICY@',
modulepolicy.encode(libdir_escape))
with open(dst, 'wb') as fh:
fh.write(content)
return dst, copied
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):
Thomas Arendsen Hein
setup.py, make: avoid problems with outdated, existing hgext/__index__.py*...
r21229 f = open(self._indexfilename, 'w')
f.write('# empty\n')
f.close()
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())')
out, err = runcmd([sys.executable, '-c', code], env)
if err:
raise DistutilsExecError(err)
f = open(self._indexfilename, 'w')
f.write('# this file is autogenerated by setup.py\n')
f.write('docs = ')
f.write(out)
f.close()
Adrian Buehlmann
setup: compile hg.exe...
r17061 class buildhgexe(build_ext):
description = 'compile hg.exe from mercurial/exewrapper.c'
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
Adrian Buehlmann
exewrapper: adapt for legacy HackableMercurial...
r17732 hv = sys.hexversion
pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff)
f = open('mercurial/hgpythonlib.h', 'wb')
f.write('/* this file is autogenerated by setup.py */\n')
f.write('#define HGPYTHONLIB "%s"\n' % pythonlib)
f.close()
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'))
target = os.path.join(dir, 'hg')
self.compiler.link_executable(objects, target,
Adrian Buehlmann
exewrapper: adapt for legacy HackableMercurial...
r17732 libraries=[],
Adrian Buehlmann
setup: compile hg.exe...
r17061 output_dir=self.build_temp)
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')
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:
Dan Villiom Podlaski Christiansen
explicitly close files...
r13400 fp = open(outfile, 'rb')
data = fp.read()
fp.close()
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))
Dan Villiom Podlaski Christiansen
explicitly close files...
r13400 fp = open(outfile, 'wb')
fp.write(data)
fp.close()
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,
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
Augie Fackler
httpclient: omit tests for the client since we don't run them anyway
r16775 packages = ['mercurial', 'mercurial.hgweb', 'mercurial.httpclient',
Gregory Szorc
setup: refactor handling of modules with C/Python implementations...
r27222 'mercurial.pure',
Na'Tosha Bard
setup: add largefiles to list of packages
r15215 'hgext', 'hgext.convert', 'hgext.highlight', 'hgext.zeroconf',
'hgext.largefiles']
Benoit Boissinot
Do not use osutil.c with python 2.4 and Windows (issue1364)...
r10521
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 common_depends = ['mercurial/util.h']
Adrian Buehlmann
setup: move osutil_ldflags logic to before extmodules definition
r25073 osutil_ldflags = []
if sys.platform == 'darwin':
osutil_ldflags += ['-framework', 'ApplicationServices']
Martin Geisler
setup: cleanup coding style
r10000 extmodules = [
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 Extension('mercurial.base85', ['mercurial/base85.c'],
depends=common_depends),
Extension('mercurial.bdiff', ['mercurial/bdiff.c'],
depends=common_depends),
Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c'],
depends=common_depends),
Extension('mercurial.mpatch', ['mercurial/mpatch.c'],
depends=common_depends),
Bryan O'Sullivan
scmutil: rewrite dirs in C, use if available...
r18900 Extension('mercurial.parsers', ['mercurial/dirs.c',
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 'mercurial/manifest.c',
Bryan O'Sullivan
scmutil: rewrite dirs in C, use if available...
r18900 'mercurial/parsers.c',
Wei, Elson
setup: check if mercurial/util.h has been modified...
r19724 'mercurial/pathencode.c'],
depends=common_depends),
Adrian Buehlmann
setup: integrate osutil C extension into extmodules initialization
r25074 Extension('mercurial.osutil', ['mercurial/osutil.c'],
extra_link_args=osutil_ldflags,
depends=common_depends),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ]
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
compiler = 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):
compiler.__init__(self, *args, **kwargs)
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
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 = []
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 setupversion = version
extra = {}
if py2exeloaded:
extra['console'] = [
{'script':'hg',
timeless
copyright: update to 2016
r27925 'copyright':'Copyright (C) 2005-2016 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'):
Greg Ward
setup: handle output from Apple's Xcode 4.3 better (issue3277)...
r16187 version = runcmd(['/usr/bin/xcodebuild', '-version'], {})[0].splitlines()
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',
author_email='mercurial@selenic.com',
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,
Augie Fackler
setup.py: move from dict() construction to {} literals...
r20687 options={'py2exe': {'packages': ['hgext', 'email']},
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)