699 def getnode(rev): |
699 def getnode(rev): |
700 return short(repo.changelog.node(rev)) |
700 return short(repo.changelog.node(rev)) |
701 |
701 |
702 ucache = {} |
702 ucache = {} |
703 def getname(rev): |
703 def getname(rev): |
704 cl = repo.changelog.read(repo.changelog.node(rev)) |
704 try: |
705 return trimuser(ui, cl[1], rev, ucache) |
705 return ucache[rev] |
|
706 except: |
|
707 u = trimuser(ui, repo.changectx(rev).user(), rev, ucache) |
|
708 ucache[rev] = u |
|
709 return u |
706 |
710 |
707 dcache = {} |
711 dcache = {} |
708 def getdate(rev): |
712 def getdate(rev): |
709 datestr = dcache.get(rev) |
713 datestr = dcache.get(rev) |
710 if datestr is None: |
714 if datestr is None: |
711 cl = repo.changelog.read(repo.changelog.node(rev)) |
715 datestr = dcache[rev] = util.datestr(repo.changectx(rev).date()) |
712 datestr = dcache[rev] = util.datestr(cl[2]) |
|
713 return datestr |
716 return datestr |
714 |
717 |
715 if not pats: |
718 if not pats: |
716 raise util.Abort(_('at least one file name or pattern required')) |
719 raise util.Abort(_('at least one file name or pattern required')) |
717 |
720 |
718 opmap = [['user', getname], ['number', str], ['changeset', getnode], |
721 opmap = [['user', getname], ['number', str], ['changeset', getnode], |
719 ['date', getdate]] |
722 ['date', getdate]] |
720 if not opts['user'] and not opts['changeset'] and not opts['date']: |
723 if not opts['user'] and not opts['changeset'] and not opts['date']: |
721 opts['number'] = 1 |
724 opts['number'] = 1 |
722 |
725 |
723 if opts['rev']: |
726 ctx = repo.changectx(opts['rev'] or repo.dirstate.parents()[0]) |
724 node = repo.changelog.lookup(opts['rev']) |
|
725 else: |
|
726 node = repo.dirstate.parents()[0] |
|
727 change = repo.changelog.read(node) |
|
728 mmap = repo.manifest.read(change[0]) |
|
729 |
727 |
730 for src, abs, rel, exact in walk(repo, pats, opts, node=node): |
728 for src, abs, rel, exact in walk(repo, pats, opts, node=node): |
731 f = repo.file(abs) |
729 fctx = ctx.filectx(abs) |
732 if not opts['text'] and util.binary(f.read(mmap[abs])): |
730 if not opts['text'] and util.binary(fctx.data()): |
733 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) |
731 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) |
734 continue |
732 continue |
735 |
733 |
736 lines = f.annotate(mmap[abs]) |
734 lines = fctx.annotate() |
737 pieces = [] |
735 pieces = [] |
738 |
736 |
739 for o, f in opmap: |
737 for o, f in opmap: |
740 if opts[o]: |
738 if opts[o]: |
741 l = [f(n) for n, dummy in lines] |
739 l = [f(n) for n, dummy in lines] |