annotate setup.py @ 607:b5f1b629c629

svn_swig_wrapper: improved handling of missing or outdated bindings. Instead of aborting with a generic message when Subversion bindings are missing, provide a helpful message. Also, the version check is refactored to make it easier to bump our requirements in the future. Finally, error messages are shorten so they fit in 80 columns along with the standard `abort: ' prefix.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Fri, 30 Apr 2010 17:35:36 +0200
parents 09c016174e33
children 2c15e4c50a54
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
1 #!/usr/bin/env python
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
320
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
3 import os
562
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
4 import re
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
5 import subprocess
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
6 import sys
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
7 import time
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
8 if not hasattr(sys, 'version_info') or sys.version_info < (2, 4, 0, 'final'):
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
9 raise SystemExit("Mercurial requires python 2.4 or later.")
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
10
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
11 try:
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
12 from distutils.command.build_py import build_py_2to3 as build_py
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
13 except ImportError:
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
14 from distutils.command.build_py import build_py
353
1ad05cffb20f setup.py: Use setuptools if available.
Augie Fackler <durin42@gmail.com>
parents: 347
diff changeset
15 try:
1ad05cffb20f setup.py: Use setuptools if available.
Augie Fackler <durin42@gmail.com>
parents: 347
diff changeset
16 from setuptools import setup
1ad05cffb20f setup.py: Use setuptools if available.
Augie Fackler <durin42@gmail.com>
parents: 347
diff changeset
17 except ImportError:
1ad05cffb20f setup.py: Use setuptools if available.
Augie Fackler <durin42@gmail.com>
parents: 347
diff changeset
18 from distutils.core import setup
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
19
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
20 def runcmd(cmd, env):
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
21 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
22 stderr=subprocess.PIPE, env=env)
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
23 out, err = p.communicate()
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
24 # If root is executing setup.py, but the repository is owned by
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
25 # another user (as in "sudo python setup.py install") we will get
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
26 # trust warnings since the .hg/hgrc file is untrusted. That is
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
27 # fine, we don't want to load it anyway.
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
28 err = [e for e in err.splitlines()
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
29 if not e.startswith('Not trusting file')]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
30 if err:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
31 return ''
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
32 return out
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
33
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
34
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
35 version = ''
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
36
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
37 if os.path.isdir('.hg'):
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
38 # Execute hg out of this directory with a custom environment which
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
39 # includes the pure Python modules in mercurial/pure. We also take
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
40 # care to not use any hgrc files and do no localization.
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
41 env = {'HGRCPATH': '',
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
42 'LANGUAGE': 'C'}
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
43 for copyenv in ('LD_LIBRARY_PATH', 'PYTHONPATH', 'PATH'):
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
44 if copyenv in os.environ:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
45 env[copyenv] = os.environ[copyenv]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
46 if 'SystemRoot' in os.environ:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
47 # Copy SystemRoot into the custom environment for Python 2.6
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
48 # under Windows. Otherwise, the subprocess will fail with
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
49 # error 0xc0150004. See: http://bugs.python.org/issue3440
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
50 env['SystemRoot'] = os.environ['SystemRoot']
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
51 cmd = ['hg', 'id', '-i', '-t']
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
52 l = runcmd(cmd, env).split()
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
53 while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
54 l.pop()
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
55 if len(l) > 1: # tag found
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
56 version = l[-1]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
57 if l[0].endswith('+'): # propagate the dirty status to the tag
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
58 version += '+'
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
59 elif len(l) == 1: # no tag found
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
60 cmd = ['hg', 'parents', '--template',
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
61 '{latesttag}+{latesttagdistance}-']
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
62 version = runcmd(cmd, env) + l[0]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
63 if not version:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
64 version = runcmd(['hg', 'parents', '--template' '{node|short}\n'],
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
65 env)
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
66 if version:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
67 version = version.split()[0]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
68 if version.endswith('+'):
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
69 version += time.strftime('%Y%m%d')
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
70 elif os.path.exists('.hg_archival.txt'):
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
71 kw = dict([t.strip() for t in l.split(':', 1)]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
72 for l in open('.hg_archival.txt'))
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
73 if 'tag' in kw:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
74 version = kw['tag']
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
75 elif 'latesttag' in kw:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
76 version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
77 else:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
78 version = kw.get('node', '')[:12]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
79
562
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
80 verfile = os.path.join("hgsubversion", "__version__.py")
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
81 if version:
562
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
82 f = open(verfile, "w")
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
83 f.write('# this file is autogenerated by setup.py\n')
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
84 f.write('version = "%s"\n' % version)
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
85 f.close()
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
86
562
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
87 if os.path.exists(verfile):
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
88 # scrape the version out with a regex because setuptools
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
89 # needlessly swaps out file() for some non-object thing
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
90 # and breaks importing hgsubversion entirely
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
91 mat = re.findall('.*"(.*)"', open(verfile).read())
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
92 version = mat[0]
c538229d02ca setup: work around easy_install by getting version with a regex
Augie Fackler <durin42@gmail.com>
parents: 553
diff changeset
93 if not version:
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
94 version = 'unknown'
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
95
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
96 try:
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
97 from svn import core
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
98 assert core.SVN_VER_MAJOR == 1
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
99 assert core.SVN_VER_MINOR >= 5
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
100 except ImportError:
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
101 raise Exception('You need to install the SWIG'
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
102 ' bindings for Subversion to use this package.')
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
103 except AssertionError:
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
104 raise Exception('You need at least Subversion 1.5 to use this package.')
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
105
563
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
106 requires = []
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
107 try:
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
108 import mercurial
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
109 except ImportError:
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
110 requires.append('mercurial')
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
111
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
112 setup(
320
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
113 name = 'hgsubversion',
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
114 version = version,
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
115 url = 'http://bitbucket.org/durin42/hgsubversion',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
116 license = 'GNU GPL',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
117 author = 'Augie Fackler, others',
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
118 author_email = 'durin42@gmail.com',
318
0291afdd7555 Style nit in setup.py
Augie Fackler <durin42@gmail.com>
parents: 308
diff changeset
119 description = ('hgsubversion is a Mercurial extension for working with '
0291afdd7555 Style nit in setup.py
Augie Fackler <durin42@gmail.com>
parents: 308
diff changeset
120 'Subversion repositories.'),
320
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
121 long_description = open(os.path.join(os.path.dirname(__file__),
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
122 'README')).read(),
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
123 keywords = 'mercurial',
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 337
diff changeset
124 packages = ('hgsubversion', 'hgsubversion.svnwrap'),
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
125 platforms = 'any',
563
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
126 install_requires=requires,
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
127 classifiers = [
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
128 'License :: OSI Approved :: GNU General Public License (GPL)',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
129 'Intended Audience :: Developers',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
130 'Topic :: Software Development :: Version Control',
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
131 'Development Status :: 4 - Beta',
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
132 'Programming Language :: Python',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
133 'Operating System :: OS Independent',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
134 ],
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
135 cmdclass = {'build_py': build_py},
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
136 )