diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2391,6 +2391,8 @@ @command('grep', [('0', 'print0', None, _('end fields with NUL')), ('', 'all', None, _('print all revisions that match')), + ('', 'diff', None, _('print all revisions when the term was introduced ' + 'or removed')), ('a', 'text', None, _('treat all files as text')), ('f', 'follow', None, _('follow changeset history,' @@ -2419,7 +2421,7 @@ file in which it finds a match. To get it to print every revision that contains a change in match status ("-" for a match that becomes a non-match, or "+" for a non-match that becomes a match), use the - --all flag. + --diff/--all flag. PATTERN can be any Python (roughly Perl-compatible) regular expression. @@ -2431,6 +2433,7 @@ Returns 0 if a match is found, 1 otherwise. """ opts = pycompat.byteskwargs(opts) + diff = opts.get('all') or opts.get('diff') reflags = re.M if opts.get('ignore_case'): reflags |= re.I @@ -2527,7 +2530,7 @@ return ctx[fn].isbinary() fieldnamemap = {'filename': 'file', 'linenumber': 'line_number'} - if opts.get('all'): + if diff: iter = difflinestates(pstates, states) else: iter = [('', l) for l in states] @@ -2540,7 +2543,7 @@ ('rev', rev, True), ('linenumber', l.linenum, opts.get('line_number')), ] - if opts.get('all'): + if diff: cols.append(('change', change, True)) cols.extend([ ('user', formatuser(ctx.user()), opts.get('user')), @@ -2644,7 +2647,7 @@ if pstates or states: r = display(fm, fn, ctx, pstates, states) found = found or r - if r and not opts.get('all'): + if r and not diff: skip[fn] = True if copy: skip[copy] = True diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -313,7 +313,7 @@ debugwireproto: localssh, peer, noreadstderr, nologhandshake, ssh, remotecmd, insecure files: rev, print0, include, exclude, template, subrepos graft: rev, continue, stop, edit, log, force, currentdate, currentuser, date, user, tool, dry-run - grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, allfiles, user, date, template, include, exclude + grep: print0, all, diff, text, follow, ignore-case, files-with-matches, line-number, rev, allfiles, user, date, template, include, exclude heads: rev, topo, active, closed, style, template help: extension, command, keyword, system identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure, template diff --git a/tests/test-grep.t b/tests/test-grep.t --- a/tests/test-grep.t +++ b/tests/test-grep.t @@ -281,6 +281,11 @@ color:2:-:orange color:1:+:orange + $ hg grep --diff orange + color:3:+:orange + color:2:-:orange + color:1:+:orange + test substring match: '^' should only match at the beginning $ hg grep '^.' --config extensions.color= --color debug @@ -349,6 +354,10 @@ color:3:-:red color:1:+:red + $ hg grep --diff red + color:3:-:red + color:1:+:red + Issue3885: test that changing revision order does not alter the revisions printed, just their order. @@ -360,6 +369,14 @@ color:3:-:red color:1:+:red + $ hg grep --diff red -r "all()" + color:1:+:red + color:3:-:red + + $ hg grep --diff red -r "reverse(all())" + color:3:-:red + color:1:+:red + $ cd .. $ hg init a @@ -370,6 +387,9 @@ $ hg grep "MaCam" --all binfile.bin:0:+: Binary file matches + $ hg grep "MaCam" --diff + binfile.bin:0:+: Binary file matches + $ cd .. Test for showing working of allfiles flag