##// END OF EJS Templates
tests: run svn tests only with svn bindings >1.3
Dirkjan Ochtman -
r7315:408cf9eb default
parent child Browse files
Show More
@@ -1,222 +1,225 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 ret = fh.close()
21 ret = fh.close()
22 return (ignorestatus or ret is None) and r.search(s)
22 return (ignorestatus or ret is None) and r.search(s)
23
23
24 def has_baz():
24 def has_baz():
25 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
25 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
26
26
27 def has_bzr():
27 def has_bzr():
28 try:
28 try:
29 import bzrlib
29 import bzrlib
30 return True
30 return True
31 except ImportError:
31 except ImportError:
32 return False
32 return False
33
33
34 def has_cvs():
34 def has_cvs():
35 re = r'Concurrent Versions System.*?server'
35 re = r'Concurrent Versions System.*?server'
36 return matchoutput('cvs --version 2>&1', re)
36 return matchoutput('cvs --version 2>&1', re)
37
37
38 def has_cvsps():
38 def has_cvsps():
39 return matchoutput('cvsps -h -q 2>&1', r'cvsps version', True)
39 return matchoutput('cvsps -h -q 2>&1', r'cvsps version', True)
40
40
41 def has_darcs():
41 def has_darcs():
42 return matchoutput('darcs', r'darcs version', True)
42 return matchoutput('darcs', r'darcs version', True)
43
43
44 def has_mtn():
44 def has_mtn():
45 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
45 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
46 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
46 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
47
47
48 def has_eol_in_paths():
48 def has_eol_in_paths():
49 try:
49 try:
50 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
50 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
51 os.close(fd)
51 os.close(fd)
52 os.remove(path)
52 os.remove(path)
53 return True
53 return True
54 except:
54 except:
55 return False
55 return False
56
56
57 def has_executablebit():
57 def has_executablebit():
58 fd, path = tempfile.mkstemp(prefix=tempprefix)
58 fd, path = tempfile.mkstemp(prefix=tempprefix)
59 os.close(fd)
59 os.close(fd)
60 try:
60 try:
61 s = os.lstat(path).st_mode
61 s = os.lstat(path).st_mode
62 os.chmod(path, s | 0100)
62 os.chmod(path, s | 0100)
63 return (os.lstat(path).st_mode & 0100 != 0)
63 return (os.lstat(path).st_mode & 0100 != 0)
64 finally:
64 finally:
65 os.remove(path)
65 os.remove(path)
66
66
67 def has_icasefs():
67 def has_icasefs():
68 # Stolen from mercurial.util
68 # Stolen from mercurial.util
69 fd, path = tempfile.mkstemp(prefix=tempprefix)
69 fd, path = tempfile.mkstemp(prefix=tempprefix)
70 os.close(fd)
70 os.close(fd)
71 try:
71 try:
72 s1 = os.stat(path)
72 s1 = os.stat(path)
73 d, b = os.path.split(path)
73 d, b = os.path.split(path)
74 p2 = os.path.join(d, b.upper())
74 p2 = os.path.join(d, b.upper())
75 if path == p2:
75 if path == p2:
76 p2 = os.path.join(d, b.lower())
76 p2 = os.path.join(d, b.lower())
77 try:
77 try:
78 s2 = os.stat(p2)
78 s2 = os.stat(p2)
79 return s2 == s1
79 return s2 == s1
80 except:
80 except:
81 return False
81 return False
82 finally:
82 finally:
83 os.remove(path)
83 os.remove(path)
84
84
85 def has_inotify():
85 def has_inotify():
86 try:
86 try:
87 import hgext.inotify.linux.watcher
87 import hgext.inotify.linux.watcher
88 return True
88 return True
89 except ImportError:
89 except ImportError:
90 return False
90 return False
91
91
92 def has_fifo():
92 def has_fifo():
93 return hasattr(os, "mkfifo")
93 return hasattr(os, "mkfifo")
94
94
95 def has_hotshot():
95 def has_hotshot():
96 try:
96 try:
97 # hotshot.stats tests hotshot and many problematic dependencies
97 # hotshot.stats tests hotshot and many problematic dependencies
98 # like profile.
98 # like profile.
99 import hotshot.stats
99 import hotshot.stats
100 return True
100 return True
101 except ImportError:
101 except ImportError:
102 return False
102 return False
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_git():
111 def has_git():
112 return matchoutput('git --version 2>&1', r'^git version')
112 return matchoutput('git --version 2>&1', r'^git version')
113
113
114 def has_svn():
114 def has_svn():
115 return matchoutput('svn --version 2>&1', r'^svn, version') and \
115 return matchoutput('svn --version 2>&1', r'^svn, version') and \
116 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
116 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
117
117
118 def has_svn_bindings():
118 def has_svn_bindings():
119 try:
119 try:
120 import svn.core
120 import svn.core
121 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
122 if version < (1, 4):
123 return False
121 return True
124 return True
122 except ImportError:
125 except ImportError:
123 return False
126 return False
124
127
125 def has_symlink():
128 def has_symlink():
126 return hasattr(os, "symlink")
129 return hasattr(os, "symlink")
127
130
128 def has_tla():
131 def has_tla():
129 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
132 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
130
133
131 def has_unix_permissions():
134 def has_unix_permissions():
132 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
135 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
133 try:
136 try:
134 fname = os.path.join(d, 'foo')
137 fname = os.path.join(d, 'foo')
135 for umask in (077, 007, 022):
138 for umask in (077, 007, 022):
136 os.umask(umask)
139 os.umask(umask)
137 f = open(fname, 'w')
140 f = open(fname, 'w')
138 f.close()
141 f.close()
139 mode = os.stat(fname).st_mode
142 mode = os.stat(fname).st_mode
140 os.unlink(fname)
143 os.unlink(fname)
141 if mode & 0777 != ~umask & 0666:
144 if mode & 0777 != ~umask & 0666:
142 return False
145 return False
143 return True
146 return True
144 finally:
147 finally:
145 os.rmdir(d)
148 os.rmdir(d)
146
149
147 def has_pygments():
150 def has_pygments():
148 try:
151 try:
149 import pygments
152 import pygments
150 return True
153 return True
151 except ImportError:
154 except ImportError:
152 return False
155 return False
153
156
154 checks = {
157 checks = {
155 "baz": (has_baz, "GNU Arch baz client"),
158 "baz": (has_baz, "GNU Arch baz client"),
156 "bzr": (has_bzr, "Canonical's Bazaar client"),
159 "bzr": (has_bzr, "Canonical's Bazaar client"),
157 "cvs": (has_cvs, "cvs client/server"),
160 "cvs": (has_cvs, "cvs client/server"),
158 "cvsps": (has_cvsps, "cvsps utility"),
161 "cvsps": (has_cvsps, "cvsps utility"),
159 "darcs": (has_darcs, "darcs client"),
162 "darcs": (has_darcs, "darcs client"),
160 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
163 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
161 "execbit": (has_executablebit, "executable bit"),
164 "execbit": (has_executablebit, "executable bit"),
162 "fifo": (has_fifo, "named pipes"),
165 "fifo": (has_fifo, "named pipes"),
163 "git": (has_git, "git command line client"),
166 "git": (has_git, "git command line client"),
164 "hotshot": (has_hotshot, "python hotshot module"),
167 "hotshot": (has_hotshot, "python hotshot module"),
165 "icasefs": (has_icasefs, "case insensitive file system"),
168 "icasefs": (has_icasefs, "case insensitive file system"),
166 "inotify": (has_inotify, "inotify extension support"),
169 "inotify": (has_inotify, "inotify extension support"),
167 "lsprof": (has_lsprof, "python lsprof module"),
170 "lsprof": (has_lsprof, "python lsprof module"),
168 "mtn": (has_mtn, "monotone client (> 0.31)"),
171 "mtn": (has_mtn, "monotone client (> 0.31)"),
169 "pygments": (has_pygments, "Pygments source highlighting library"),
172 "pygments": (has_pygments, "Pygments source highlighting library"),
170 "svn": (has_svn, "subversion client and admin tools"),
173 "svn": (has_svn, "subversion client and admin tools"),
171 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
174 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
172 "symlink": (has_symlink, "symbolic links"),
175 "symlink": (has_symlink, "symbolic links"),
173 "tla": (has_tla, "GNU Arch tla client"),
176 "tla": (has_tla, "GNU Arch tla client"),
174 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
177 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
175 }
178 }
176
179
177 def list_features():
180 def list_features():
178 for name, feature in checks.iteritems():
181 for name, feature in checks.iteritems():
179 desc = feature[1]
182 desc = feature[1]
180 print name + ':', desc
183 print name + ':', desc
181
184
182 parser = optparse.OptionParser("%prog [options] [features]")
185 parser = optparse.OptionParser("%prog [options] [features]")
183 parser.add_option("--list-features", action="store_true",
186 parser.add_option("--list-features", action="store_true",
184 help="list available features")
187 help="list available features")
185 parser.add_option("-q", "--quiet", action="store_true",
188 parser.add_option("-q", "--quiet", action="store_true",
186 help="check features silently")
189 help="check features silently")
187
190
188 if __name__ == '__main__':
191 if __name__ == '__main__':
189 options, args = parser.parse_args()
192 options, args = parser.parse_args()
190 if options.list_features:
193 if options.list_features:
191 list_features()
194 list_features()
192 sys.exit(0)
195 sys.exit(0)
193
196
194 quiet = options.quiet
197 quiet = options.quiet
195
198
196 failures = 0
199 failures = 0
197
200
198 def error(msg):
201 def error(msg):
199 global failures
202 global failures
200 if not quiet:
203 if not quiet:
201 sys.stderr.write(msg + '\n')
204 sys.stderr.write(msg + '\n')
202 failures += 1
205 failures += 1
203
206
204 for feature in args:
207 for feature in args:
205 negate = feature.startswith('no-')
208 negate = feature.startswith('no-')
206 if negate:
209 if negate:
207 feature = feature[3:]
210 feature = feature[3:]
208
211
209 if feature not in checks:
212 if feature not in checks:
210 error('skipped: unknown feature: ' + feature)
213 error('skipped: unknown feature: ' + feature)
211 continue
214 continue
212
215
213 check, desc = checks[feature]
216 check, desc = checks[feature]
214 if not negate and not check():
217 if not negate and not check():
215 error('skipped: missing feature: ' + desc)
218 error('skipped: missing feature: ' + desc)
216 elif negate and check():
219 elif negate and check():
217 error('skipped: system supports %s' % desc)
220 error('skipped: system supports %s' % desc)
218
221
219 if failures != 0:
222 if failures != 0:
220 sys.exit(1)
223 sys.exit(1)
221
224
222
225
General Comments 0
You need to be logged in to leave comments. Login now