Mercurial > hg-stable
comparison mercurial/dirstate.py @ 1392:32d8068b3e36
add a check for filetype when walking
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Sat, 15 Oct 2005 15:43:40 -0700 |
parents | 25e5b1086624 |
children | b20b683e8d95 |
comparison
equal
deleted
inserted
replaced
1391:9395c2f94130 | 1392:32d8068b3e36 |
---|---|
266 # | 266 # |
267 # dc is an optional arg for the current dirstate. dc is not modified | 267 # dc is an optional arg for the current dirstate. dc is not modified |
268 # directly by this function, but might be modified by your statmatch call. | 268 # directly by this function, but might be modified by your statmatch call. |
269 # | 269 # |
270 def walkhelper(self, files, statmatch, dc): | 270 def walkhelper(self, files, statmatch, dc): |
271 def supported_type(f, st): | |
272 if stat.S_ISREG(st.st_mode): | |
273 return True | |
274 else: | |
275 kind = 'unknown' | |
276 if stat.S_ISCHR(st.st_mode): kind = 'character device' | |
277 elif stat.S_ISBLK(st.st_mode): kind = 'block device' | |
278 elif stat.S_ISFIFO(st.st_mode): kind = 'fifo' | |
279 elif stat.S_ISLNK(st.st_mode): kind = 'symbolic link' | |
280 elif stat.S_ISSOCK(st.st_mode): kind = 'socket' | |
281 elif stat.S_ISDIR(st.st_mode): kind = 'directory' | |
282 self.ui.warn('%s: unsupported file type (type is %s)\n' % ( | |
283 util.pathto(self.getcwd(), f), | |
284 kind)) | |
285 return False | |
286 | |
271 # recursion free walker, faster than os.walk. | 287 # recursion free walker, faster than os.walk. |
272 def findfiles(s): | 288 def findfiles(s): |
273 retfiles = [] | 289 retfiles = [] |
274 work = [s] | 290 work = [s] |
275 while work: | 291 while work: |
288 st = os.lstat(p) | 304 st = os.lstat(p) |
289 if stat.S_ISDIR(st.st_mode): | 305 if stat.S_ISDIR(st.st_mode): |
290 ds = os.path.join(nd, f +'/') | 306 ds = os.path.join(nd, f +'/') |
291 if statmatch(ds, st): | 307 if statmatch(ds, st): |
292 work.append(p) | 308 work.append(p) |
293 else: | 309 elif supported_type(np, st): |
294 if statmatch(np, st): | 310 if statmatch(np, st): |
295 yield util.pconvert(np) | 311 yield util.pconvert(np) |
312 | |
296 | 313 |
297 known = {'.hg': 1} | 314 known = {'.hg': 1} |
298 def seen(fn): | 315 def seen(fn): |
299 if fn in known: return True | 316 if fn in known: return True |
300 known[fn] = 1 | 317 known[fn] = 1 |
313 if stat.S_ISDIR(st.st_mode): | 330 if stat.S_ISDIR(st.st_mode): |
314 sorted = [ x for x in findfiles(f) ] | 331 sorted = [ x for x in findfiles(f) ] |
315 sorted.sort() | 332 sorted.sort() |
316 for fl in sorted: | 333 for fl in sorted: |
317 yield 'f', fl | 334 yield 'f', fl |
318 elif stat.S_ISREG(st.st_mode): | 335 else: |
319 ff = util.normpath(ff) | 336 ff = util.normpath(ff) |
320 if seen(ff): | 337 if seen(ff): |
321 continue | 338 continue |
322 found = False | 339 found = False |
323 self.blockignore = True | 340 self.blockignore = True |
324 if statmatch(ff, st): | 341 if supported_type(ff, st) and statmatch(ff, st): |
325 found = True | 342 found = True |
326 self.blockignore = False | 343 self.blockignore = False |
327 if found: | 344 if found: |
328 yield 'f', ff | 345 yield 'f', ff |
329 else: | |
330 kind = 'unknown' | |
331 if stat.S_ISCHR(st.st_mode): kind = 'character device' | |
332 elif stat.S_ISBLK(st.st_mode): kind = 'block device' | |
333 elif stat.S_ISFIFO(st.st_mode): kind = 'fifo' | |
334 elif stat.S_ISLNK(st.st_mode): kind = 'symbolic link' | |
335 elif stat.S_ISSOCK(st.st_mode): kind = 'socket' | |
336 self.ui.warn('%s: unsupported file type (type is %s)\n' % ( | |
337 util.pathto(self.getcwd(), ff), | |
338 kind)) | |
339 | 346 |
340 # step two run through anything left in the dc hash and yield | 347 # step two run through anything left in the dc hash and yield |
341 # if we haven't already seen it | 348 # if we haven't already seen it |
342 ks = dc.keys() | 349 ks = dc.keys() |
343 ks.sort() | 350 ks.sort() |
366 | 373 |
367 if not s or stat.S_ISDIR(s.st_mode): | 374 if not s or stat.S_ISDIR(s.st_mode): |
368 if self.ignore(fn): return False | 375 if self.ignore(fn): return False |
369 return match(fn) | 376 return match(fn) |
370 | 377 |
371 if not stat.S_ISREG(s.st_mode): | |
372 return False | |
373 c = dc.pop(fn, None) | 378 c = dc.pop(fn, None) |
374 if c: | 379 if c: |
375 type, mode, size, time = c | 380 type, mode, size, time = c |
376 # check the common case first | 381 # check the common case first |
377 if type == 'n': | 382 if type == 'n': |