diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -266,6 +266,9 @@ def annotate(ui, repo, *pats, **opts): 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 @@ def annotate(ui, repo, *pats, **opts): # 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 annotate(ui, repo, *pats, **opts): 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 --git a/tests/test-annotate.t b/tests/test-annotate.t --- a/tests/test-annotate.t +++ b/tests/test-annotate.t @@ -398,6 +398,76 @@ and its ancestor by overriding "repo._fi 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 ..