##// END OF EJS Templates
Update util.py docstrings, fix walk test
mpm@selenic.com -
r1082:ce96e316 default
parent child Browse files
Show More
@@ -1,290 +1,327
1 # util.py - utility functions and platform specfic implementations
1 """
2 #
2 util.py - Mercurial utility functions and platform specfic implementations
3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com>
3
4 #
4 Copyright 2005 K. Thananchayan <thananck@yahoo.com>
5 # This software may be used and distributed according to the terms
5
6 # of the GNU General Public License, incorporated herein by reference.
6 This software may be used and distributed according to the terms
7 of the GNU General Public License, incorporated herein by reference.
8
9 This contains helper routines that are independent of the SCM core and hide
10 platform-specific details from the core.
11 """
7
12
8 import os, errno
13 import os, errno
9 from demandload import *
14 from demandload import *
10 demandload(globals(), "re")
15 demandload(globals(), "re")
11
16
12 def binary(s):
17 def binary(s):
18 """return true if a string is binary data using diff's heuristic"""
13 if s and '\0' in s[:4096]:
19 if s and '\0' in s[:4096]:
14 return True
20 return True
15 return False
21 return False
16
22
17 def unique(g):
23 def unique(g):
24 """return the uniq elements of iterable g"""
18 seen = {}
25 seen = {}
19 for f in g:
26 for f in g:
20 if f not in seen:
27 if f not in seen:
21 seen[f] = 1
28 seen[f] = 1
22 yield f
29 yield f
23
30
24 class Abort(Exception):
31 class Abort(Exception):
25 """Raised if a command needs to print an error and exit."""
32 """Raised if a command needs to print an error and exit."""
26
33
27 def always(fn): return True
34 def always(fn): return True
28 def never(fn): return False
35 def never(fn): return False
29
36
30 def globre(pat, head='^', tail='$'):
37 def globre(pat, head='^', tail='$'):
31 "convert a glob pattern into a regexp"
38 "convert a glob pattern into a regexp"
32 i, n = 0, len(pat)
39 i, n = 0, len(pat)
33 res = ''
40 res = ''
34 group = False
41 group = False
35 def peek(): return i < n and pat[i]
42 def peek(): return i < n and pat[i]
36 while i < n:
43 while i < n:
37 c = pat[i]
44 c = pat[i]
38 i = i+1
45 i = i+1
39 if c == '*':
46 if c == '*':
40 if peek() == '*':
47 if peek() == '*':
41 i += 1
48 i += 1
42 res += '.*'
49 res += '.*'
43 else:
50 else:
44 res += '[^/]*'
51 res += '[^/]*'
45 elif c == '?':
52 elif c == '?':
46 res += '.'
53 res += '.'
47 elif c == '[':
54 elif c == '[':
48 j = i
55 j = i
49 if j < n and pat[j] in '!]':
56 if j < n and pat[j] in '!]':
50 j += 1
57 j += 1
51 while j < n and pat[j] != ']':
58 while j < n and pat[j] != ']':
52 j += 1
59 j += 1
53 if j >= n:
60 if j >= n:
54 res += '\\['
61 res += '\\['
55 else:
62 else:
56 stuff = pat[i:j].replace('\\','\\\\')
63 stuff = pat[i:j].replace('\\','\\\\')
57 i = j + 1
64 i = j + 1
58 if stuff[0] == '!':
65 if stuff[0] == '!':
59 stuff = '^' + stuff[1:]
66 stuff = '^' + stuff[1:]
60 elif stuff[0] == '^':
67 elif stuff[0] == '^':
61 stuff = '\\' + stuff
68 stuff = '\\' + stuff
62 res = '%s[%s]' % (res, stuff)
69 res = '%s[%s]' % (res, stuff)
63 elif c == '{':
70 elif c == '{':
64 group = True
71 group = True
65 res += '(?:'
72 res += '(?:'
66 elif c == '}' and group:
73 elif c == '}' and group:
67 res += ')'
74 res += ')'
68 group = False
75 group = False
69 elif c == ',' and group:
76 elif c == ',' and group:
70 res += '|'
77 res += '|'
71 else:
78 else:
72 res += re.escape(c)
79 res += re.escape(c)
73 return head + res + tail
80 return head + res + tail
74
81
75 _globchars = {'[': 1, '{': 1, '*': 1, '?': 1}
82 _globchars = {'[': 1, '{': 1, '*': 1, '?': 1}
76
83
77 def pathto(n1, n2):
84 def pathto(n1, n2):
78 '''return the relative path from one place to another.
85 '''return the relative path from one place to another.
79 this returns a path in the form used by the local filesystem, not hg.'''
86 this returns a path in the form used by the local filesystem, not hg.'''
80 if not n1: return localpath(n2)
87 if not n1: return localpath(n2)
81 a, b = n1.split('/'), n2.split('/')
88 a, b = n1.split('/'), n2.split('/')
82 a.reverse(), b.reverse()
89 a.reverse(), b.reverse()
83 while a and b and a[-1] == b[-1]:
90 while a and b and a[-1] == b[-1]:
84 a.pop(), b.pop()
91 a.pop(), b.pop()
85 b.reverse()
92 b.reverse()
86 return os.sep.join((['..'] * len(a)) + b)
93 return os.sep.join((['..'] * len(a)) + b)
87
94
88 def canonpath(root, cwd, myname):
95 def canonpath(root, cwd, myname):
96 """return the canonical path of myname, given cwd and root"""
89 rootsep = root + os.sep
97 rootsep = root + os.sep
90 name = myname
98 name = myname
91 if not name.startswith(os.sep):
99 if not name.startswith(os.sep):
92 name = os.path.join(root, cwd, name)
100 name = os.path.join(root, cwd, name)
93 name = os.path.normpath(name)
101 name = os.path.normpath(name)
94 if name.startswith(rootsep):
102 if name.startswith(rootsep):
95 return pconvert(name[len(rootsep):])
103 return pconvert(name[len(rootsep):])
96 elif name == root:
104 elif name == root:
97 return ''
105 return ''
98 else:
106 else:
99 raise Abort('%s not under root' % myname)
107 raise Abort('%s not under root' % myname)
100
108
101 def matcher(canonroot, cwd, names, inc, exc, head=''):
109 def matcher(canonroot, cwd, names, inc, exc, head=''):
110 """build a function to match a set of file patterns
111
112 arguments:
113 canonroot - the canonical root of the tree you're matching against
114 cwd - the current working directory, if relevant
115 names - patterns to find
116 inc - patterns to include
117 exc - patterns to exclude
118 head - a regex to prepend to patterns to control whether a match is rooted
119
120 a pattern is one of:
121 're:<regex>'
122 'glob:<shellglob>'
123 'path:<explicit path>'
124 'relpath:<relative path>'
125 '<relative path>'
126
127 returns:
128 a 3-tuple containing
129 - list of explicit non-pattern names passed in
130 - a bool match(filename) function
131 - a bool indicating if any patterns were passed in
132
133 todo:
134 make head regex a rooted bool
135 """
136
102 def patkind(name):
137 def patkind(name):
103 for prefix in 're:', 'glob:', 'path:', 'relpath:':
138 for prefix in 're:', 'glob:', 'path:', 'relpath:':
104 if name.startswith(prefix): return name.split(':', 1)
139 if name.startswith(prefix): return name.split(':', 1)
105 for c in name:
140 for c in name:
106 if c in _globchars: return 'glob', name
141 if c in _globchars: return 'glob', name
107 return 'relpath', name
142 return 'relpath', name
108
143
109 def regex(kind, name, tail):
144 def regex(kind, name, tail):
110 '''convert a pattern into a regular expression'''
145 '''convert a pattern into a regular expression'''
111 if kind == 're':
146 if kind == 're':
112 return name
147 return name
113 elif kind == 'path':
148 elif kind == 'path':
114 return '^' + re.escape(name) + '(?:/|$)'
149 return '^' + re.escape(name) + '(?:/|$)'
115 elif kind == 'relpath':
150 elif kind == 'relpath':
116 return head + re.escape(name) + tail
151 return head + re.escape(name) + tail
117 return head + globre(name, '', tail)
152 return head + globre(name, '', tail)
118
153
119 def matchfn(pats, tail):
154 def matchfn(pats, tail):
120 """build a matching function from a set of patterns"""
155 """build a matching function from a set of patterns"""
121 if pats:
156 if pats:
122 pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
157 pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
123 return re.compile(pat).match
158 return re.compile(pat).match
124
159
125 def globprefix(pat):
160 def globprefix(pat):
126 '''return the non-glob prefix of a path, e.g. foo/* -> foo'''
161 '''return the non-glob prefix of a path, e.g. foo/* -> foo'''
127 root = []
162 root = []
128 for p in pat.split(os.sep):
163 for p in pat.split(os.sep):
129 if patkind(p)[0] == 'glob': break
164 if patkind(p)[0] == 'glob': break
130 root.append(p)
165 root.append(p)
131 return '/'.join(root)
166 return '/'.join(root)
132
167
133 pats = []
168 pats = []
134 files = []
169 files = []
135 roots = []
170 roots = []
136 for kind, name in map(patkind, names):
171 for kind, name in map(patkind, names):
137 if kind in ('glob', 'relpath'):
172 if kind in ('glob', 'relpath'):
138 name = canonpath(canonroot, cwd, name)
173 name = canonpath(canonroot, cwd, name)
139 if name == '':
174 if name == '':
140 kind, name = 'glob', '**'
175 kind, name = 'glob', '**'
141 if kind in ('glob', 'path', 're'):
176 if kind in ('glob', 'path', 're'):
142 pats.append((kind, name))
177 pats.append((kind, name))
143 if kind == 'glob':
178 if kind == 'glob':
144 root = globprefix(name)
179 root = globprefix(name)
145 if root: roots.append(root)
180 if root: roots.append(root)
146 elif kind == 'relpath':
181 elif kind == 'relpath':
147 files.append((kind, name))
182 files.append((kind, name))
148 roots.append(name)
183 roots.append(name)
149
184
150 patmatch = matchfn(pats, '$') or always
185 patmatch = matchfn(pats, '$') or always
151 filematch = matchfn(files, '(?:/|$)') or always
186 filematch = matchfn(files, '(?:/|$)') or always
152 incmatch = always
187 incmatch = always
153 if inc:
188 if inc:
154 incmatch = matchfn(map(patkind, inc), '(?:/|$)')
189 incmatch = matchfn(map(patkind, inc), '(?:/|$)')
155 excmatch = lambda fn: False
190 excmatch = lambda fn: False
156 if exc:
191 if exc:
157 excmatch = matchfn(map(patkind, exc), '(?:/|$)')
192 excmatch = matchfn(map(patkind, exc), '(?:/|$)')
158
193
159 return (roots,
194 return (roots,
160 lambda fn: (incmatch(fn) and not excmatch(fn) and
195 lambda fn: (incmatch(fn) and not excmatch(fn) and
161 (fn.endswith('/') or
196 (fn.endswith('/') or
162 (not pats and not files) or
197 (not pats and not files) or
163 (pats and patmatch(fn)) or
198 (pats and patmatch(fn)) or
164 (files and filematch(fn)))),
199 (files and filematch(fn)))),
165 (inc or exc or (pats and pats != [('glob', '**')])) and True)
200 (inc or exc or (pats and pats != [('glob', '**')])) and True)
166
201
167 def system(cmd, errprefix=None):
202 def system(cmd, errprefix=None):
168 """execute a shell command that must succeed"""
203 """execute a shell command that must succeed"""
169 rc = os.system(cmd)
204 rc = os.system(cmd)
170 if rc:
205 if rc:
171 errmsg = "%s %s" % (os.path.basename(cmd.split(None, 1)[0]),
206 errmsg = "%s %s" % (os.path.basename(cmd.split(None, 1)[0]),
172 explain_exit(rc)[0])
207 explain_exit(rc)[0])
173 if errprefix:
208 if errprefix:
174 errmsg = "%s: %s" % (errprefix, errmsg)
209 errmsg = "%s: %s" % (errprefix, errmsg)
175 raise Abort(errmsg)
210 raise Abort(errmsg)
176
211
177 def rename(src, dst):
212 def rename(src, dst):
213 """forcibly rename a file"""
178 try:
214 try:
179 os.rename(src, dst)
215 os.rename(src, dst)
180 except:
216 except:
181 os.unlink(dst)
217 os.unlink(dst)
182 os.rename(src, dst)
218 os.rename(src, dst)
183
219
184 def copytree(src, dst, copyfile):
220 def copytree(src, dst, copyfile):
185 """Copy a directory tree, files are copied using 'copyfile'."""
221 """Copy a directory tree, files are copied using 'copyfile'."""
186 names = os.listdir(src)
222 names = os.listdir(src)
187 os.mkdir(dst)
223 os.mkdir(dst)
188
224
189 for name in names:
225 for name in names:
190 srcname = os.path.join(src, name)
226 srcname = os.path.join(src, name)
191 dstname = os.path.join(dst, name)
227 dstname = os.path.join(dst, name)
192 if os.path.isdir(srcname):
228 if os.path.isdir(srcname):
193 copytree(srcname, dstname, copyfile)
229 copytree(srcname, dstname, copyfile)
194 elif os.path.isfile(srcname):
230 elif os.path.isfile(srcname):
195 copyfile(srcname, dstname)
231 copyfile(srcname, dstname)
196 else:
232 else:
197 pass
233 pass
198
234
199 def _makelock_file(info, pathname):
235 def _makelock_file(info, pathname):
200 ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
236 ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
201 os.write(ld, info)
237 os.write(ld, info)
202 os.close(ld)
238 os.close(ld)
203
239
204 def _readlock_file(pathname):
240 def _readlock_file(pathname):
205 return file(pathname).read()
241 return file(pathname).read()
206
242
207 # Platfor specific varients
243 # Platform specific variants
208 if os.name == 'nt':
244 if os.name == 'nt':
209 nulldev = 'NUL:'
245 nulldev = 'NUL:'
210
246
211 def is_exec(f, last):
247 def is_exec(f, last):
212 return last
248 return last
213
249
214 def set_exec(f, mode):
250 def set_exec(f, mode):
215 pass
251 pass
216
252
217 def pconvert(path):
253 def pconvert(path):
218 return path.replace("\\", "/")
254 return path.replace("\\", "/")
219
255
220 def localpath(path):
256 def localpath(path):
221 return path.replace('/', '\\')
257 return path.replace('/', '\\')
222
258
223 def normpath(path):
259 def normpath(path):
224 return pconvert(os.path.normpath(path))
260 return pconvert(os.path.normpath(path))
225
261
226 makelock = _makelock_file
262 makelock = _makelock_file
227 readlock = _readlock_file
263 readlock = _readlock_file
228
264
229 def explain_exit(code):
265 def explain_exit(code):
230 return "exited with status %d" % code, code
266 return "exited with status %d" % code, code
231
267
232 else:
268 else:
233 nulldev = '/dev/null'
269 nulldev = '/dev/null'
234
270
235 def is_exec(f, last):
271 def is_exec(f, last):
272 """check whether a file is executable"""
236 return (os.stat(f).st_mode & 0100 != 0)
273 return (os.stat(f).st_mode & 0100 != 0)
237
274
238 def set_exec(f, mode):
275 def set_exec(f, mode):
239 s = os.stat(f).st_mode
276 s = os.stat(f).st_mode
240 if (s & 0100 != 0) == mode:
277 if (s & 0100 != 0) == mode:
241 return
278 return
242 if mode:
279 if mode:
243 # Turn on +x for every +r bit when making a file executable
280 # Turn on +x for every +r bit when making a file executable
244 # and obey umask.
281 # and obey umask.
245 umask = os.umask(0)
282 umask = os.umask(0)
246 os.umask(umask)
283 os.umask(umask)
247 os.chmod(f, s | (s & 0444) >> 2 & ~umask)
284 os.chmod(f, s | (s & 0444) >> 2 & ~umask)
248 else:
285 else:
249 os.chmod(f, s & 0666)
286 os.chmod(f, s & 0666)
250
287
251 def pconvert(path):
288 def pconvert(path):
252 return path
289 return path
253
290
254 def localpath(path):
291 def localpath(path):
255 return path
292 return path
256
293
257 normpath = os.path.normpath
294 normpath = os.path.normpath
258
295
259 def makelock(info, pathname):
296 def makelock(info, pathname):
260 try:
297 try:
261 os.symlink(info, pathname)
298 os.symlink(info, pathname)
262 except OSError, why:
299 except OSError, why:
263 if why.errno == errno.EEXIST:
300 if why.errno == errno.EEXIST:
264 raise
301 raise
265 else:
302 else:
266 _makelock_file(info, pathname)
303 _makelock_file(info, pathname)
267
304
268 def readlock(pathname):
305 def readlock(pathname):
269 try:
306 try:
270 return os.readlink(pathname)
307 return os.readlink(pathname)
271 except OSError, why:
308 except OSError, why:
272 if why.errno == errno.EINVAL:
309 if why.errno == errno.EINVAL:
273 return _readlock_file(pathname)
310 return _readlock_file(pathname)
274 else:
311 else:
275 raise
312 raise
276
313
277 def explain_exit(code):
314 def explain_exit(code):
278 """return a 2-tuple (desc, code) describing a process's status"""
315 """return a 2-tuple (desc, code) describing a process's status"""
279 if os.name == 'nt': # os.WIFxx is not supported on windows
316 if os.name == 'nt': # os.WIFxx is not supported on windows
280 return "aborted with error." , -1
317 return "aborted with error." , -1
281 if os.WIFEXITED(code):
318 if os.WIFEXITED(code):
282 val = os.WEXITSTATUS(code)
319 val = os.WEXITSTATUS(code)
283 return "exited with status %d" % val, val
320 return "exited with status %d" % val, val
284 elif os.WIFSIGNALED(code):
321 elif os.WIFSIGNALED(code):
285 val = os.WTERMSIG(code)
322 val = os.WTERMSIG(code)
286 return "killed by signal %d" % val, val
323 return "killed by signal %d" % val, val
287 elif os.WIFSTOPPED(code):
324 elif os.WIFSTOPPED(code):
288 val = os.WSTOPSIG(code)
325 val = os.WSTOPSIG(code)
289 return "stopped by signal %d" % val, val
326 return "stopped by signal %d" % val, val
290 raise ValueError("invalid exit code")
327 raise ValueError("invalid exit code")
@@ -1,87 +1,87
1 adding fennel
1 adding fennel
2 adding fenugreek
2 adding fenugreek
3 adding fiddlehead
3 adding fiddlehead
4 adding glob:glob
4 adding glob:glob
5 adding beans/black
5 adding beans/black
6 adding beans/borlotti
6 adding beans/borlotti
7 adding beans/kidney
7 adding beans/kidney
8 adding beans/navy
8 adding beans/navy
9 adding beans/pinto
9 adding beans/pinto
10 adding beans/turtle
10 adding beans/turtle
11 adding mammals/skunk
11 adding mammals/skunk
12 adding mammals/Procyonidae/cacomistle
12 adding mammals/Procyonidae/cacomistle
13 adding mammals/Procyonidae/coatimundi
13 adding mammals/Procyonidae/coatimundi
14 adding mammals/Procyonidae/raccoon
14 adding mammals/Procyonidae/raccoon
15 f fennel fennel
15 f fennel fennel
16 f fenugreek fenugreek
16 f fenugreek fenugreek
17 f fiddlehead fiddlehead
17 f fiddlehead fiddlehead
18 f glob:glob glob:glob
18 f glob:glob glob:glob
19 f beans/black beans/black
19 f beans/black beans/black
20 f beans/borlotti beans/borlotti
20 f beans/borlotti beans/borlotti
21 f beans/kidney beans/kidney
21 f beans/kidney beans/kidney
22 f beans/navy beans/navy
22 f beans/navy beans/navy
23 f beans/pinto beans/pinto
23 f beans/pinto beans/pinto
24 f beans/turtle beans/turtle
24 f beans/turtle beans/turtle
25 f mammals/skunk mammals/skunk
25 f mammals/skunk mammals/skunk
26 f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
26 f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
27 f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
27 f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
28 f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
28 f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
29 f mammals/skunk skunk
29 f mammals/skunk skunk
30 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
30 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
31 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
31 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
32 f mammals/Procyonidae/raccoon Procyonidae/raccoon
32 f mammals/Procyonidae/raccoon Procyonidae/raccoon
33 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
33 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
34 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
34 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
35 f mammals/Procyonidae/raccoon Procyonidae/raccoon
35 f mammals/Procyonidae/raccoon Procyonidae/raccoon
36 f mammals/Procyonidae/cacomistle cacomistle
36 f mammals/Procyonidae/cacomistle cacomistle
37 f mammals/Procyonidae/coatimundi coatimundi
37 f mammals/Procyonidae/coatimundi coatimundi
38 f mammals/Procyonidae/raccoon raccoon
38 f mammals/Procyonidae/raccoon raccoon
39 f mammals/skunk ../skunk
39 f mammals/skunk ../skunk
40 f mammals/Procyonidae/cacomistle cacomistle
40 f mammals/Procyonidae/cacomistle cacomistle
41 f mammals/Procyonidae/coatimundi coatimundi
41 f mammals/Procyonidae/coatimundi coatimundi
42 f mammals/Procyonidae/raccoon raccoon
42 f mammals/Procyonidae/raccoon raccoon
43 f beans/black ../beans/black
43 f beans/black ../beans/black
44 f beans/borlotti ../beans/borlotti
44 f beans/borlotti ../beans/borlotti
45 f beans/kidney ../beans/kidney
45 f beans/kidney ../beans/kidney
46 f beans/navy ../beans/navy
46 f beans/navy ../beans/navy
47 f beans/pinto ../beans/pinto
47 f beans/pinto ../beans/pinto
48 f beans/turtle ../beans/turtle
48 f beans/turtle ../beans/turtle
49 f mammals/skunk skunk
49 f mammals/skunk skunk
50 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
50 f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
51 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
51 f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
52 f mammals/Procyonidae/raccoon Procyonidae/raccoon
52 f mammals/Procyonidae/raccoon Procyonidae/raccoon
53 f beans/black beans/black
53 f beans/black beans/black
54 f beans/borlotti beans/borlotti
54 f beans/borlotti beans/borlotti
55 f beans/kidney beans/kidney
55 f beans/kidney beans/kidney
56 f beans/navy beans/navy
56 f beans/navy beans/navy
57 f beans/pinto beans/pinto
57 f beans/pinto beans/pinto
58 f beans/turtle beans/turtle
58 f beans/turtle beans/turtle
59 f beans/black beans/black
59 f beans/black beans/black
60 f beans/borlotti beans/borlotti
60 f beans/borlotti beans/borlotti
61 f mammals/skunk mammals/skunk
61 f mammals/skunk mammals/skunk
62 f mammals/skunk mammals/skunk
62 f mammals/skunk mammals/skunk
63 f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
63 f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
64 f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
64 f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
65 f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
65 f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
66 abort: .. not under repository root
66 abort: .. not under root
67 abort: beans/../.. not under repository root
67 abort: beans/../.. not under root
68 f fennel fennel
68 f fennel fennel
69 f fenugreek fenugreek
69 f fenugreek fenugreek
70 f fiddlehead fiddlehead
70 f fiddlehead fiddlehead
71 f glob:glob glob:glob
71 f glob:glob glob:glob
72 f fenugreek fenugreek
72 f fenugreek fenugreek
73 f glob:glob glob:glob
73 f glob:glob glob:glob
74 f beans/black beans/black
74 f beans/black beans/black
75 f mammals/skunk mammals/skunk
75 f mammals/skunk mammals/skunk
76 f beans/black beans/black
76 f beans/black beans/black
77 f beans/black beans/black
77 f beans/black beans/black
78 f beans/borlotti beans/borlotti
78 f beans/borlotti beans/borlotti
79 f beans/kidney beans/kidney
79 f beans/kidney beans/kidney
80 f beans/navy beans/navy
80 f beans/navy beans/navy
81 f beans/pinto beans/pinto
81 f beans/pinto beans/pinto
82 f beans/turtle beans/turtle
82 f beans/turtle beans/turtle
83 NOEXIST: No such file or directory
83 NOEXIST: No such file or directory
84 fifo: unsupported file type (type is fifo)
84 fifo: unsupported file type (type is fifo)
85 m fenugreek fenugreek exact
85 m fenugreek fenugreek exact
86 m fenugreek fenugreek exact
86 m fenugreek fenugreek exact
87 f new new exact
87 f new new exact
General Comments 0
You need to be logged in to leave comments. Login now