##// END OF EJS Templates
tests: update monotone version requirement
Sune Foldager -
r14432:0969d91f default
parent child Browse files
Show More
@@ -1,294 +1,294 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """Test the running system for features availability. Exit with zero
2 """Test the running system for features availability. Exit with zero
3 if all features are there, non-zero otherwise. If a feature name is
3 if all features are there, non-zero otherwise. If a feature name is
4 prefixed with "no-", the absence of feature is tested.
4 prefixed with "no-", the absence of feature is tested.
5 """
5 """
6 import optparse
6 import optparse
7 import os
7 import os
8 import re
8 import re
9 import sys
9 import sys
10 import tempfile
10 import tempfile
11
11
12 tempprefix = 'hg-hghave-'
12 tempprefix = 'hg-hghave-'
13
13
14 def matchoutput(cmd, regexp, ignorestatus=False):
14 def matchoutput(cmd, regexp, ignorestatus=False):
15 """Return True if cmd executes successfully and its output
15 """Return True if cmd executes successfully and its output
16 is matched by the supplied regular expression.
16 is matched by the supplied regular expression.
17 """
17 """
18 r = re.compile(regexp)
18 r = re.compile(regexp)
19 fh = os.popen(cmd)
19 fh = os.popen(cmd)
20 s = fh.read()
20 s = fh.read()
21 try:
21 try:
22 ret = fh.close()
22 ret = fh.close()
23 except IOError:
23 except IOError:
24 # Happen in Windows test environment
24 # Happen in Windows test environment
25 ret = 1
25 ret = 1
26 return (ignorestatus or ret is None) and r.search(s)
26 return (ignorestatus or ret is None) and r.search(s)
27
27
28 def has_baz():
28 def has_baz():
29 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
29 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
30
30
31 def has_bzr():
31 def has_bzr():
32 try:
32 try:
33 import bzrlib
33 import bzrlib
34 return bzrlib.__doc__ != None
34 return bzrlib.__doc__ != None
35 except ImportError:
35 except ImportError:
36 return False
36 return False
37
37
38 def has_bzr114():
38 def has_bzr114():
39 try:
39 try:
40 import bzrlib
40 import bzrlib
41 return (bzrlib.__doc__ != None
41 return (bzrlib.__doc__ != None
42 and bzrlib.version_info[:2] >= (1, 14))
42 and bzrlib.version_info[:2] >= (1, 14))
43 except ImportError:
43 except ImportError:
44 return False
44 return False
45
45
46 def has_cvs():
46 def has_cvs():
47 re = r'Concurrent Versions System.*?server'
47 re = r'Concurrent Versions System.*?server'
48 return matchoutput('cvs --version 2>&1', re)
48 return matchoutput('cvs --version 2>&1', re)
49
49
50 def has_darcs():
50 def has_darcs():
51 return matchoutput('darcs --version', r'2\.[2-9]', True)
51 return matchoutput('darcs --version', r'2\.[2-9]', True)
52
52
53 def has_mtn():
53 def has_mtn():
54 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
54 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
55 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
55 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
56
56
57 def has_eol_in_paths():
57 def has_eol_in_paths():
58 try:
58 try:
59 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
59 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
60 os.close(fd)
60 os.close(fd)
61 os.remove(path)
61 os.remove(path)
62 return True
62 return True
63 except:
63 except:
64 return False
64 return False
65
65
66 def has_executablebit():
66 def has_executablebit():
67 fd, path = tempfile.mkstemp(prefix=tempprefix)
67 fd, path = tempfile.mkstemp(prefix=tempprefix)
68 os.close(fd)
68 os.close(fd)
69 try:
69 try:
70 s = os.lstat(path).st_mode
70 s = os.lstat(path).st_mode
71 os.chmod(path, s | 0100)
71 os.chmod(path, s | 0100)
72 return (os.lstat(path).st_mode & 0100 != 0)
72 return (os.lstat(path).st_mode & 0100 != 0)
73 finally:
73 finally:
74 os.remove(path)
74 os.remove(path)
75
75
76 def has_icasefs():
76 def has_icasefs():
77 # Stolen from mercurial.util
77 # Stolen from mercurial.util
78 fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
78 fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
79 os.close(fd)
79 os.close(fd)
80 try:
80 try:
81 s1 = os.stat(path)
81 s1 = os.stat(path)
82 d, b = os.path.split(path)
82 d, b = os.path.split(path)
83 p2 = os.path.join(d, b.upper())
83 p2 = os.path.join(d, b.upper())
84 if path == p2:
84 if path == p2:
85 p2 = os.path.join(d, b.lower())
85 p2 = os.path.join(d, b.lower())
86 try:
86 try:
87 s2 = os.stat(p2)
87 s2 = os.stat(p2)
88 return s2 == s1
88 return s2 == s1
89 except:
89 except:
90 return False
90 return False
91 finally:
91 finally:
92 os.remove(path)
92 os.remove(path)
93
93
94 def has_inotify():
94 def has_inotify():
95 try:
95 try:
96 import hgext.inotify.linux.watcher
96 import hgext.inotify.linux.watcher
97 return True
97 return True
98 except ImportError:
98 except ImportError:
99 return False
99 return False
100
100
101 def has_fifo():
101 def has_fifo():
102 return hasattr(os, "mkfifo")
102 return hasattr(os, "mkfifo")
103
103
104 def has_lsprof():
104 def has_lsprof():
105 try:
105 try:
106 import _lsprof
106 import _lsprof
107 return True
107 return True
108 except ImportError:
108 except ImportError:
109 return False
109 return False
110
110
111 def has_gettext():
111 def has_gettext():
112 return matchoutput('msgfmt --version', 'GNU gettext-tools')
112 return matchoutput('msgfmt --version', 'GNU gettext-tools')
113
113
114 def has_git():
114 def has_git():
115 return matchoutput('git --version 2>&1', r'^git version')
115 return matchoutput('git --version 2>&1', r'^git version')
116
116
117 def has_docutils():
117 def has_docutils():
118 try:
118 try:
119 from docutils.core import publish_cmdline
119 from docutils.core import publish_cmdline
120 return True
120 return True
121 except ImportError:
121 except ImportError:
122 return False
122 return False
123
123
124 def getsvnversion():
124 def getsvnversion():
125 m = matchoutput('svn --version 2>&1', r'^svn,\s+version\s+(\d+)\.(\d+)')
125 m = matchoutput('svn --version 2>&1', r'^svn,\s+version\s+(\d+)\.(\d+)')
126 if not m:
126 if not m:
127 return (0, 0)
127 return (0, 0)
128 return (int(m.group(1)), int(m.group(2)))
128 return (int(m.group(1)), int(m.group(2)))
129
129
130 def has_svn15():
130 def has_svn15():
131 return getsvnversion() >= (1, 5)
131 return getsvnversion() >= (1, 5)
132
132
133 def has_svn():
133 def has_svn():
134 return matchoutput('svn --version 2>&1', r'^svn, version') and \
134 return matchoutput('svn --version 2>&1', r'^svn, version') and \
135 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
135 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
136
136
137 def has_svn_bindings():
137 def has_svn_bindings():
138 try:
138 try:
139 import svn.core
139 import svn.core
140 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
140 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
141 if version < (1, 4):
141 if version < (1, 4):
142 return False
142 return False
143 return True
143 return True
144 except ImportError:
144 except ImportError:
145 return False
145 return False
146
146
147 def has_p4():
147 def has_p4():
148 return matchoutput('p4 -V', r'Rev\. P4/') and matchoutput('p4d -V', r'Rev\. P4D/')
148 return matchoutput('p4 -V', r'Rev\. P4/') and matchoutput('p4d -V', r'Rev\. P4D/')
149
149
150 def has_symlink():
150 def has_symlink():
151 return hasattr(os, "symlink")
151 return hasattr(os, "symlink")
152
152
153 def has_tla():
153 def has_tla():
154 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
154 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
155
155
156 def has_gpg():
156 def has_gpg():
157 return matchoutput('gpg --version 2>&1', r'GnuPG')
157 return matchoutput('gpg --version 2>&1', r'GnuPG')
158
158
159 def has_unix_permissions():
159 def has_unix_permissions():
160 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
160 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
161 try:
161 try:
162 fname = os.path.join(d, 'foo')
162 fname = os.path.join(d, 'foo')
163 for umask in (077, 007, 022):
163 for umask in (077, 007, 022):
164 os.umask(umask)
164 os.umask(umask)
165 f = open(fname, 'w')
165 f = open(fname, 'w')
166 f.close()
166 f.close()
167 mode = os.stat(fname).st_mode
167 mode = os.stat(fname).st_mode
168 os.unlink(fname)
168 os.unlink(fname)
169 if mode & 0777 != ~umask & 0666:
169 if mode & 0777 != ~umask & 0666:
170 return False
170 return False
171 return True
171 return True
172 finally:
172 finally:
173 os.rmdir(d)
173 os.rmdir(d)
174
174
175 def has_pyflakes():
175 def has_pyflakes():
176 return matchoutput('echo "import re" 2>&1 | pyflakes',
176 return matchoutput('echo "import re" 2>&1 | pyflakes',
177 r"<stdin>:1: 're' imported but unused",
177 r"<stdin>:1: 're' imported but unused",
178 True)
178 True)
179
179
180 def has_pygments():
180 def has_pygments():
181 try:
181 try:
182 import pygments
182 import pygments
183 return True
183 return True
184 except ImportError:
184 except ImportError:
185 return False
185 return False
186
186
187 def has_outer_repo():
187 def has_outer_repo():
188 return matchoutput('hg root 2>&1', r'')
188 return matchoutput('hg root 2>&1', r'')
189
189
190 def has_ssl():
190 def has_ssl():
191 try:
191 try:
192 import ssl
192 import ssl
193 import OpenSSL
193 import OpenSSL
194 OpenSSL.SSL.Context
194 OpenSSL.SSL.Context
195 return True
195 return True
196 except ImportError:
196 except ImportError:
197 return False
197 return False
198
198
199 checks = {
199 checks = {
200 "baz": (has_baz, "GNU Arch baz client"),
200 "baz": (has_baz, "GNU Arch baz client"),
201 "bzr": (has_bzr, "Canonical's Bazaar client"),
201 "bzr": (has_bzr, "Canonical's Bazaar client"),
202 "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
202 "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
203 "cvs": (has_cvs, "cvs client/server"),
203 "cvs": (has_cvs, "cvs client/server"),
204 "darcs": (has_darcs, "darcs client"),
204 "darcs": (has_darcs, "darcs client"),
205 "docutils": (has_docutils, "Docutils text processing library"),
205 "docutils": (has_docutils, "Docutils text processing library"),
206 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
206 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
207 "execbit": (has_executablebit, "executable bit"),
207 "execbit": (has_executablebit, "executable bit"),
208 "fifo": (has_fifo, "named pipes"),
208 "fifo": (has_fifo, "named pipes"),
209 "gettext": (has_gettext, "GNU Gettext (msgfmt)"),
209 "gettext": (has_gettext, "GNU Gettext (msgfmt)"),
210 "git": (has_git, "git command line client"),
210 "git": (has_git, "git command line client"),
211 "gpg": (has_gpg, "gpg client"),
211 "gpg": (has_gpg, "gpg client"),
212 "icasefs": (has_icasefs, "case insensitive file system"),
212 "icasefs": (has_icasefs, "case insensitive file system"),
213 "inotify": (has_inotify, "inotify extension support"),
213 "inotify": (has_inotify, "inotify extension support"),
214 "lsprof": (has_lsprof, "python lsprof module"),
214 "lsprof": (has_lsprof, "python lsprof module"),
215 "mtn": (has_mtn, "monotone client (> 0.31)"),
215 "mtn": (has_mtn, "monotone client (>= 1.0)"),
216 "outer-repo": (has_outer_repo, "outer repo"),
216 "outer-repo": (has_outer_repo, "outer repo"),
217 "p4": (has_p4, "Perforce server and client"),
217 "p4": (has_p4, "Perforce server and client"),
218 "pyflakes": (has_pyflakes, "Pyflakes python linter"),
218 "pyflakes": (has_pyflakes, "Pyflakes python linter"),
219 "pygments": (has_pygments, "Pygments source highlighting library"),
219 "pygments": (has_pygments, "Pygments source highlighting library"),
220 "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
220 "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
221 "svn": (has_svn, "subversion client and admin tools"),
221 "svn": (has_svn, "subversion client and admin tools"),
222 "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
222 "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
223 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
223 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
224 "symlink": (has_symlink, "symbolic links"),
224 "symlink": (has_symlink, "symbolic links"),
225 "tla": (has_tla, "GNU Arch tla client"),
225 "tla": (has_tla, "GNU Arch tla client"),
226 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
226 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
227 }
227 }
228
228
229 def list_features():
229 def list_features():
230 for name, feature in checks.iteritems():
230 for name, feature in checks.iteritems():
231 desc = feature[1]
231 desc = feature[1]
232 print name + ':', desc
232 print name + ':', desc
233
233
234 def test_features():
234 def test_features():
235 failed = 0
235 failed = 0
236 for name, feature in checks.iteritems():
236 for name, feature in checks.iteritems():
237 check, _ = feature
237 check, _ = feature
238 try:
238 try:
239 check()
239 check()
240 except Exception, e:
240 except Exception, e:
241 print "feature %s failed: %s" % (name, e)
241 print "feature %s failed: %s" % (name, e)
242 failed += 1
242 failed += 1
243 return failed
243 return failed
244
244
245 parser = optparse.OptionParser("%prog [options] [features]")
245 parser = optparse.OptionParser("%prog [options] [features]")
246 parser.add_option("--test-features", action="store_true",
246 parser.add_option("--test-features", action="store_true",
247 help="test available features")
247 help="test available features")
248 parser.add_option("--list-features", action="store_true",
248 parser.add_option("--list-features", action="store_true",
249 help="list available features")
249 help="list available features")
250 parser.add_option("-q", "--quiet", action="store_true",
250 parser.add_option("-q", "--quiet", action="store_true",
251 help="check features silently")
251 help="check features silently")
252
252
253 if __name__ == '__main__':
253 if __name__ == '__main__':
254 options, args = parser.parse_args()
254 options, args = parser.parse_args()
255 if options.list_features:
255 if options.list_features:
256 list_features()
256 list_features()
257 sys.exit(0)
257 sys.exit(0)
258
258
259 if options.test_features:
259 if options.test_features:
260 sys.exit(test_features())
260 sys.exit(test_features())
261
261
262 quiet = options.quiet
262 quiet = options.quiet
263
263
264 failures = 0
264 failures = 0
265
265
266 def error(msg):
266 def error(msg):
267 global failures
267 global failures
268 if not quiet:
268 if not quiet:
269 sys.stderr.write(msg + '\n')
269 sys.stderr.write(msg + '\n')
270 failures += 1
270 failures += 1
271
271
272 for feature in args:
272 for feature in args:
273 negate = feature.startswith('no-')
273 negate = feature.startswith('no-')
274 if negate:
274 if negate:
275 feature = feature[3:]
275 feature = feature[3:]
276
276
277 if feature not in checks:
277 if feature not in checks:
278 error('skipped: unknown feature: ' + feature)
278 error('skipped: unknown feature: ' + feature)
279 continue
279 continue
280
280
281 check, desc = checks[feature]
281 check, desc = checks[feature]
282 try:
282 try:
283 available = check()
283 available = check()
284 except Exception, e:
284 except Exception, e:
285 error('hghave check failed: ' + feature)
285 error('hghave check failed: ' + feature)
286 continue
286 continue
287
287
288 if not negate and not available:
288 if not negate and not available:
289 error('skipped: missing feature: ' + desc)
289 error('skipped: missing feature: ' + desc)
290 elif negate and available:
290 elif negate and available:
291 error('skipped: system supports %s' % desc)
291 error('skipped: system supports %s' % desc)
292
292
293 if failures != 0:
293 if failures != 0:
294 sys.exit(1)
294 sys.exit(1)
General Comments 0
You need to be logged in to leave comments. Login now