annotate setup.py @ 634:a400f3bf5611

replay/stupid: fix tagging on a branch renamed using a branch map Previously, both convert_rev() functions used parentctx.extra() to determine the branch to pass to meta.movetag(). This assumed that the branch name stored in the changeset matches the internal branch. The introduction of branch maps made this assumption unsafe, however: Now, the Mercurial branch can be completely unrelated to the origin of the changeset. It turns out, however, that movetag() already has sufficient knowledge to determine the branch. Given the hash of the new changeset to be tagged, we walk its ancestors until we find an open changeset, which we then know to be the originating branch. This assumes that there were `few' commits made to the tag; an assumption I would consider reasonable.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Sun, 11 Jul 2010 11:46:19 +0200
parents 2c15e4c50a54
children 55d6697b975a
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
563
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
96 requires = []
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
97 try:
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
98 import mercurial
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
99 except ImportError:
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
100 requires.append('mercurial')
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
101
612
2c15e4c50a54 setup: check for Subversion by importing the `svnwrap' module.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 563
diff changeset
102 # Ensure that the Subversion bindings are present
2c15e4c50a54 setup: check for Subversion by importing the `svnwrap' module.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 563
diff changeset
103 sys.path.insert(0, 'hgsubversion')
2c15e4c50a54 setup: check for Subversion by importing the `svnwrap' module.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 563
diff changeset
104 import svnwrap
2c15e4c50a54 setup: check for Subversion by importing the `svnwrap' module.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 563
diff changeset
105
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
106 setup(
320
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
107 name = 'hgsubversion',
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 353
diff changeset
108 version = version,
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
109 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
110 license = 'GNU GPL',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
111 author = 'Augie Fackler, others',
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
112 author_email = 'durin42@gmail.com',
318
0291afdd7555 Style nit in setup.py
Augie Fackler <durin42@gmail.com>
parents: 308
diff changeset
113 description = ('hgsubversion is a Mercurial extension for working with '
0291afdd7555 Style nit in setup.py
Augie Fackler <durin42@gmail.com>
parents: 308
diff changeset
114 'Subversion repositories.'),
320
1ba8ed29148e Fix package name, use README for long_description
Augie Fackler <durin42@gmail.com>
parents: 318
diff changeset
115 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
116 'README')).read(),
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
117 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
118 packages = ('hgsubversion', 'hgsubversion.svnwrap'),
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
119 platforms = 'any',
563
09c016174e33 setup: work around easy_intall overzealously installing mercurial
Augie Fackler <durin42@gmail.com>
parents: 562
diff changeset
120 install_requires=requires,
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
121 classifiers = [
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
122 '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
123 'Intended Audience :: Developers',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
124 'Topic :: Software Development :: Version Control',
553
97f2079e3778 setup: updates for release
Augie Fackler <durin42@gmail.com>
parents: 526
diff changeset
125 'Development Status :: 4 - Beta',
308
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
126 'Programming Language :: Python',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
127 'Operating System :: OS Independent',
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
128 ],
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
129 cmdclass = {'build_py': build_py},
41aa4c3f789e A quick stab at a distutils installation script.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff changeset
130 )