diff -r 5d9e46d93c1d -r dff638170c48 mercurial/commands.py --- a/mercurial/commands.py Tue Sep 16 23:40:24 2014 +0900 +++ b/mercurial/commands.py Wed Sep 17 23:21:20 2014 +0900 @@ -247,7 +247,7 @@ ('n', 'number', None, _('list the revision number (default)')), ('c', 'changeset', None, _('list the changeset')), ('l', 'line-number', None, _('show line number at the first appearance')) - ] + diffwsopts + walkopts, + ] + diffwsopts + walkopts + formatteropts, _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'), inferrepo=True) def annotate(ui, repo, *pats, **opts): @@ -274,8 +274,12 @@ # to mimic the behavior of Mercurial before version 1.5 opts['file'] = True + fm = ui.formatter('annotate', opts) datefunc = ui.quiet and util.shortdate or util.datestr - hexfn = ui.debugflag and hex or short + if fm or ui.debugflag: + hexfn = hex + else: + hexfn = short opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser), ('number', ' ', lambda x: x[0].rev(), str), @@ -284,6 +288,7 @@ ('file', ' ', lambda x: x[0].path(), str), ('line_number', ':', lambda x: x[1], str), ] + fieldnamemap = {'number': 'rev', 'changeset': 'node'} if (not opts.get('user') and not opts.get('changeset') and not opts.get('date') and not opts.get('file')): @@ -293,11 +298,17 @@ if linenumber and (not opts.get('changeset')) and (not opts.get('number')): raise util.Abort(_('at least one of -n/-c is required for -l')) - def makefunc(get, fmt): - return lambda x: fmt(get(x)) + if fm: + def makefunc(get, fmt): + return get + else: + def makefunc(get, fmt): + return lambda x: fmt(get(x)) funcmap = [(makefunc(get, fmt), sep) for op, sep, get, fmt in opmap if opts.get(op)] funcmap[0] = (funcmap[0][0], '') # no separator in front of first column + fields = ' '.join(fieldnamemap.get(op, op) for op, sep, get, fmt in opmap + if opts.get(op)) def bad(x, y): raise util.Abort("%s: %s" % (x, y)) @@ -310,7 +321,7 @@ for abs in ctx.walk(m): fctx = ctx[abs] if not opts.get('text') and util.binary(fctx.data()): - ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs)) + fm.plain(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs)) continue lines = fctx.annotate(follow=follow, linenumber=linenumber, @@ -321,17 +332,23 @@ for f, sep in funcmap: l = [f(n) for n, dummy in lines] if l: - sizes = [encoding.colwidth(x) for x in l] - ml = max(sizes) - formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes]) + if fm: + formats.append(['%s' for x in l]) + else: + sizes = [encoding.colwidth(x) for x in l] + ml = max(sizes) + formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes]) pieces.append(l) for f, p, l in zip(zip(*formats), zip(*pieces), lines): - ui.write("".join(f) % p) - ui.write(": %s" % l[1]) + fm.startitem() + fm.write(fields, "".join(f), *p) + fm.write('line', ": %s", l[1]) if lines and not lines[-1][1].endswith('\n'): - ui.write('\n') + fm.plain('\n') + + fm.end() @command('archive', [('', 'no-decode', None, _('do not pass files through decoders')),