comparison mercurial/commands.py @ 733:1966c553f652

Convert annotate over to walk interface. Add emptyok parameter to walk and matchpats, for commands that require at least one name.
author Bryan O'Sullivan <bos@serpentine.com>
date Wed, 20 Jul 2005 03:23:12 -0800
parents ba0b6d17a6de
children 1e84f1014f33
comparison
equal deleted inserted replaced
732:ba0b6d17a6de 733:1966c553f652
37 if cwd: 37 if cwd:
38 return [util.pconvert(os.path.normpath(os.path.join(cwd, x))) 38 return [util.pconvert(os.path.normpath(os.path.join(cwd, x)))
39 for x in args] 39 for x in args]
40 return args 40 return args
41 41
42 def matchpats(ui, cwd, pats = [], opts = {}): 42 def matchpats(ui, cwd, pats = [], opts = {}, emptyok = True):
43 if not pats and not emptyok:
44 raise Abort('at least one file name or pattern required')
43 head = '' 45 head = ''
44 if opts.get('rootless'): head = '(?:.*/|)' 46 if opts.get('rootless'): head = '(?:.*/|)'
45 def reify(name, tail): 47 def reify(name, tail):
46 if name.startswith('re:'): 48 if name.startswith('re:'):
47 return name[3:] 49 return name[3:]
63 incmatch = matchfn(opts.get('include'), '(?:/|$)', under) 65 incmatch = matchfn(opts.get('include'), '(?:/|$)', under)
64 excmatch = matchfn(opts.get('exclude'), '(?:/|$)', util.never) 66 excmatch = matchfn(opts.get('exclude'), '(?:/|$)', util.never)
65 return lambda fn: (incmatch(fn) and not excmatch(fn) and 67 return lambda fn: (incmatch(fn) and not excmatch(fn) and
66 (fn.endswith('/') or patmatch(fn))) 68 (fn.endswith('/') or patmatch(fn)))
67 69
68 def walk(repo, pats, opts): 70 def walk(repo, pats, opts, emptyok = True):
69 cwd = repo.getcwd() 71 cwd = repo.getcwd()
70 if cwd: c = len(cwd) + 1 72 if cwd: c = len(cwd) + 1
71 for src, fn in repo.walk(match = matchpats(repo.ui, cwd, pats, opts)): 73 for src, fn in repo.walk(match = matchpats(repo.ui, cwd, pats, opts, emptyok)):
72 if cwd: yield src, fn, fn[c:] 74 if cwd: yield src, fn, fn[c:]
73 else: yield src, fn, fn 75 else: yield src, fn, fn
74 76
75 revrangesep = ':' 77 revrangesep = ':'
76 78
359 else: 361 else:
360 (c, a, d, u) = repo.changes() 362 (c, a, d, u) = repo.changes()
361 repo.add(u) 363 repo.add(u)
362 repo.remove(d) 364 repo.remove(d)
363 365
364 def annotate(ui, repo, file1, *files, **opts): 366 def annotate(ui, repo, *pats, **opts):
365 """show changeset information per file line""" 367 """show changeset information per file line"""
366 def getnode(rev): 368 def getnode(rev):
367 return hg.short(repo.changelog.node(rev)) 369 return hg.short(repo.changelog.node(rev))
368 370
369 def getname(rev): 371 def getname(rev):
390 node = repo.changelog.lookup(opts['rev']) 392 node = repo.changelog.lookup(opts['rev'])
391 else: 393 else:
392 node = repo.dirstate.parents()[0] 394 node = repo.dirstate.parents()[0]
393 change = repo.changelog.read(node) 395 change = repo.changelog.read(node)
394 mmap = repo.manifest.read(change[0]) 396 mmap = repo.manifest.read(change[0])
395 for f in relpath(repo, (file1,) + files): 397 for src, abs, rel in walk(repo, pats, opts, emptyok = False):
396 lines = repo.file(f).annotate(mmap[f]) 398 lines = repo.file(abs).annotate(mmap[abs])
397 pieces = [] 399 pieces = []
398 400
399 for o, f in opmap: 401 for o, f in opmap:
400 if opts[o]: 402 if opts[o]:
401 l = [f(n) for n, dummy in lines] 403 l = [f(n) for n, dummy in lines]