##// END OF EJS Templates
setup: ignore 'not importing' warnings during version detection...
setup: ignore 'not importing' warnings during version detection Python will issue an ImportWarning when seeing 'import locale' if there is a locale/ directory present without a __init__.py file. The warning is silent by default, but it somehow shows up anyway on Windows when setup.py executed hg. The warning causes runcmd to panic since it sees output on stderr. This patch ignores warnings on stderr about not importing a package.

File last commit:

r10120:fb890a54 stable
r10120:fb890a54 stable
Show More
setup.py
285 lines | 9.8 KiB | text/x-python | PythonLexer
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 #!/usr/bin/env python
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
Thomas Arendsen Hein
Added check for minimal python version to setup.py
r1873 import sys
Martin Geisler
setup: require Python 2.4
r8286 if not hasattr(sys, 'version_info') or sys.version_info < (2, 4, 0, 'final'):
raise SystemExit("Mercurial requires Python 2.4 or later.")
Thomas Arendsen Hein
Added check for minimal python version to setup.py
r1873
Matt Mackall
setup: warn about missing standard Python components
r7558 # Solaris Python packaging brain damage
try:
import hashlib
sha = hashlib.sha1()
except:
try:
import sha
except:
raise SystemExit(
"Couldn't import standard hashlib (incomplete Python install).")
try:
import zlib
except:
raise SystemExit(
"Couldn't import standard zlib (incomplete Python install).")
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 import os, subprocess, time
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 import shutil
import tempfile
mpm@selenic.com
Add an O(m + nlog n) patching extension
r72 from distutils.core import setup, Extension
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.dist import Distribution
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157 from distutils.command.install_data import install_data
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.command.build import build
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.command.build_py import build_py
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.spawn import spawn, find_executable
Alexis S. L. Carvalho
setup.py: skip inotify if there's no inotify_add_watch...
r6245 from distutils.ccompiler import new_compiler
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157
Matt Mackall
Fix setup.py warning
r3893 extra = {}
Paul Moore
Add a batch file driver for Windows
r6513 scripts = ['hg']
if os.name == 'nt':
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.
def has_function(cc, funcname):
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:
try:
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
r6373 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())
Bryan O'Sullivan
setup.py: don't pollute the current directory with temporary files
r9124 objects = cc.compile([fname], output_dir=tmpdir)
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
except:
return False
return True
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
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Volker Kleinfeld
py2exe is not able to handle win32com.shell...
r1422 # Help py2exe to find win32com.shell
try:
import modulefinder
import win32com
for p in win32com.__path__[1:]: # Take the path to win32comext
modulefinder.AddPackagePath("win32com", p)
pn = "win32com.shell"
__import__(pn)
m = sys.modules[pn]
for p in m.__path__[1:]:
modulefinder.AddPackagePath(pn, p)
except ImportError:
pass
Matt Mackall
Fix setup.py warning
r3893 extra['console'] = ['hg']
Bryan O'Sullivan
Fix Volker's modifications to setup.py for non-Windows systems.
r1284 except ImportError:
Matt Mackall
Fix demandload bits of setup.py py2exe support
r3890 pass
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):
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)
out, err = p.communicate()
# 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()
Steve Borho
setup: ignore 'not importing' warnings during version detection...
r10120 if not e.startswith('Not trusting file') \
and not e.startswith('warning: Not importing')]
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if err:
return ''
return out
version = ''
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 if os.path.isdir('.hg'):
Martin Geisler
setup: execute hg in C locale
r8629 # Execute hg out of this directory with a custom environment which
# includes the pure Python modules in mercurial/pure. We also take
# care to not use any hgrc files and do no localization.
pypath = ['mercurial', os.path.join('mercurial', 'pure')]
env = {'PYTHONPATH': os.pathsep.join(pypath),
'HGRCPATH': '',
'LANGUAGE': 'C'}
Christian Boos
setup: pass LD_LIBRARY_PATH to subprocess when determining version.
r9856 if 'LD_LIBRARY_PATH' in os.environ:
env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
Garth Roxburgh-Kidd
fixed 0xc0150004 error building Mercurial under Python 2.6 for Windows
r8648 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']
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 cmd = [sys.executable, 'hg', 'id', '-i', '-t']
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 l = runcmd(cmd, env).split()
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
l.pop()
if len(l) > 1: # tag found
version = l[-1]
if l[0].endswith('+'): # propagate the dirty status to the tag
version += '+'
elif len(l) == 1: # no tag found
cmd = [sys.executable, 'hg', 'parents', '--template',
'{latesttag}+{latesttagdistance}-']
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 version = runcmd(cmd, env) + l[0]
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'):
kw = dict([t.strip() for t in l.split(':', 1)]
for l in open('.hg_archival.txt'))
if 'tag' in kw:
version = kw['tag']
elif 'latesttag' in kw:
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
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157 class install_package_data(install_data):
def finalize_options(self):
self.set_undefined_options('install',
('install_lib', 'install_dir'))
install_data.finalize_options(self)
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 class build_mo(build):
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')
Martin Geisler
setup: do not use -c with msgfmt on Solaris (issue1489)
r7720 cmd = ['msgfmt', '-v', '-o', mofile, pofile]
if sys.platform != 'sunos5':
# msgfmt on Solaris does not know about -c
cmd.append('-c')
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 self.mkpath(modir)
Martin Geisler
setup: do not use -c with msgfmt on Solaris (issue1489)
r7720 self.make_file([pofile], mofile, spawn, (cmd,))
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 self.distribution.data_files.append((join('mercurial', modir),
[mofile]))
build.sub_commands.append(('build_mo', None))
Martin Geisler
add --pure flag to setup.py...
r7722 Distribution.pure = 0
Distribution.global_options.append(('pure', None, "use pure (slow) Python "
"code instead of C extensions"))
class hg_build_py(build_py):
def finalize_options(self):
build_py.finalize_options(self)
if self.distribution.pure:
if self.py_modules is None:
self.py_modules = []
for ext in self.distribution.ext_modules:
if ext.name.startswith("mercurial."):
self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
self.distribution.ext_modules = []
def find_modules(self):
modules = build_py.find_modules(self)
for module in modules:
if module[0] == "mercurial.pure":
if module[1] != "__init__":
yield ("mercurial", module[1], module[2])
else:
yield module
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 cmdclass = {'install_data': install_package_data,
Martin Geisler
add --pure flag to setup.py...
r7722 'build_mo': build_mo,
'build_py': hg_build_py}
Thomas Arendsen Hein
Applied coding style to setup.py
r3238
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ext_modules=[
Bryan O'Sullivan
manifest: improve parsing performance by 8x via a new C extension
r6389 Extension('mercurial.base85', ['mercurial/base85.c']),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
Bryan O'Sullivan
manifest: improve parsing performance by 8x via a new C extension
r6389 Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']),
Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
Extension('mercurial.parsers', ['mercurial/parsers.c']),
Martin Geisler
setup: cleanup old left-over code
r8283 Extension('mercurial.osutil', ['mercurial/osutil.c']),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ]
Dirkjan Ochtman
fix double indentation and trailing whitespace
r6948 packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
Augie Fackler
Add hgext.zeroconf to the package list so it gets installed by setup.py.
r7081 'hgext.highlight', 'hgext.zeroconf', ]
Bryan O'Sullivan
Add inotify extension
r6239
Martin Geisler
setup: cleanup old left-over code
r8283 if sys.platform == 'linux2' and os.uname()[2] > '2.6':
# The inotify extension is only usable with Linux 2.6 kernels.
# You also need a reasonably recent C library.
cc = new_compiler()
if has_function(cc, 'inotify_add_watch'):
ext_modules.append(Extension('hgext.inotify.linux._inotify',
['hgext/inotify/linux/_inotify.c']))
packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 datafiles = []
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 for root in ('templates', 'i18n', 'help'):
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 for dir, dirs, files in os.walk(root):
James Abbatiello <abbeyj at gmail.com>
Don't copy hidden files/directories during `setup.py install`...
r9129 dirs[:] = [x for x in dirs if not x.startswith('.')]
files = [x for x in files if not x.startswith('.')]
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 datafiles.append((os.path.join('mercurial', dir),
[os.path.join(dir, file_) for file_ in files]))
Thomas Arendsen Hein
Don't forget version at the end of setup.py, write it only if changed....
r1977 setup(name='mercurial',
Matt Mackall
refactor version code...
r7632 version=version,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 author='Matt Mackall',
author_email='mpm@selenic.com',
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 url='http://mercurial.selenic.com/',
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 description='Scalable distributed SCM',
license='GNU GPL',
Paul Moore
Add a batch file driver for Windows
r6513 scripts=scripts,
Bryan O'Sullivan
Add inotify extension
r6239 packages=packages,
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ext_modules=ext_modules,
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 data_files=datafiles,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 cmdclass=cmdclass,
Paul Moore
Force email package to be loaded in py2exe...
r6789 options=dict(py2exe=dict(packages=['hgext', 'email']),
Lee Cantey
Fix for including hgext in Windows compiled version....
r4628 bdist_mpkg=dict(zipdist=True,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 license='COPYING',
readme='contrib/macosx/Readme.html',
welcome='contrib/macosx/Welcome.html')),
Matt Mackall
Fix setup.py warning
r3893 **extra)