Mercurial > hgsubversion
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 |
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 | 119 description = ('hgsubversion is a Mercurial extension for working with ' |
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 ) |