# HG changeset patch # User Yuya Nishihara # Date 1408179055 -32400 # Node ID 77881cade20e19b699a2d87d65c4816913d61a4c # Parent 065b886f61c6255c0ae5f9e4b2ad3945d2d7973f annotate: add option to annotate working-directory files Working revision or node is displayed with "+" suffix in plain output, but null/None in machine-readable format. diff -r 065b886f61c6 -r 77881cade20e mercurial/commands.py --- a/mercurial/commands.py Thu Mar 19 23:31:53 2015 +0900 +++ b/mercurial/commands.py Sat Aug 16 17:50:55 2014 +0900 @@ -266,6 +266,9 @@ anyway, although the results will probably be neither useful nor desirable. + By default, annotate files in the parent of the working directory. + Use -r "wdir()" to annotate the working directory files. + Returns 0 on success. """ if not pats: @@ -276,16 +279,44 @@ # to mimic the behavior of Mercurial before version 1.5 opts['file'] = True + ctx = scmutil.revsingle(repo, opts.get('rev')) + fm = ui.formatter('annotate', opts) if ui.quiet: datefunc = util.shortdate else: datefunc = util.datestr - hexfn = fm.hexfunc + if ctx.rev() is None: + def hexfn(node): + if node is None: + return None + else: + return fm.hexfunc(node) + if opts.get('changeset'): + # omit "+" suffix which is appended to node hex + def formatrev(rev): + if rev is None: + return '%d' % ctx.p1().rev() + else: + return '%d' % rev + else: + def formatrev(rev): + if rev is None: + return '%d+' % ctx.p1().rev() + else: + return '%d ' % rev + def formathex(hex): + if hex is None: + return '%s+' % fm.hexfunc(ctx.p1().node()) + else: + return '%s ' % hex + else: + hexfn = fm.hexfunc + formatrev = formathex = str opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser), - ('number', ' ', lambda x: x[0].rev(), str), - ('changeset', ' ', lambda x: hexfn(x[0].node()), str), + ('number', ' ', lambda x: x[0].rev(), formatrev), + ('changeset', ' ', lambda x: hexfn(x[0].node()), formathex), ('date', ' ', lambda x: x[0].date(), util.cachefunc(datefunc)), ('file', ' ', lambda x: x[0].path(), str), ('line_number', ':', lambda x: x[1], str), @@ -315,7 +346,6 @@ def bad(x, y): raise util.Abort("%s: %s" % (x, y)) - ctx = scmutil.revsingle(repo, opts.get('rev')) m = scmutil.match(ctx, pats, opts) m.bad = bad follow = not opts.get('no_follow') diff -r 065b886f61c6 -r 77881cade20e tests/test-annotate.t --- a/tests/test-annotate.t Thu Mar 19 23:31:53 2015 +0900 +++ b/tests/test-annotate.t Sat Aug 16 17:50:55 2014 +0900 @@ -398,6 +398,76 @@ 20: 4 baz:4 16: 5 +annotate clean file + + $ hg annotate -ncr "wdir()" foo + 11 472b18db256d : foo + +annotate modified file + + $ echo foofoo >> foo + $ hg annotate -r "wdir()" foo + 11 : foo + 20+: foofoo + + $ hg annotate -cr "wdir()" foo + 472b18db256d : foo + b6bedd5477e7+: foofoo + + $ hg annotate -ncr "wdir()" foo + 11 472b18db256d : foo + 20 b6bedd5477e7+: foofoo + + $ hg annotate --debug -ncr "wdir()" foo + 11 472b18db256d1e8282064eab4bfdaf48cbfe83cd : foo + 20 b6bedd5477e797f25e568a6402d4697f3f895a72+: foofoo + + $ hg annotate -udr "wdir()" foo + test Thu Jan 01 00:00:00 1970 +0000: foo + test [A-Za-z0-9:+ ]+: foofoo (re) + + $ hg annotate -ncr "wdir()" -Tjson foo + [ + { + "line": "foo\n", + "node": "472b18db256d1e8282064eab4bfdaf48cbfe83cd", + "rev": 11 + }, + { + "line": "foofoo\n", + "node": null, + "rev": null + } + ] + +annotate added file + + $ echo bar > bar + $ hg add bar + $ hg annotate -ncr "wdir()" bar + 20 b6bedd5477e7+: bar + +annotate renamed file + + $ hg rename foo renamefoo2 + $ hg annotate -ncr "wdir()" renamefoo2 + 11 472b18db256d : foo + 20 b6bedd5477e7+: foofoo + +annotate missing file + + $ rm baz + $ hg annotate -ncr "wdir()" baz + abort: No such file or directory: $TESTTMP/repo/baz + [255] + +annotate removed file + + $ hg rm baz + $ hg annotate -ncr "wdir()" baz + abort: No such file or directory: $TESTTMP/repo/baz + [255] + Test annotate with whitespace options $ cd ..