[PATCH] formatter: make grep command use formatter

Augie Fackler raf at durin42.com
Tue Mar 8 16:49:54 EST 2016


On Tue, Mar 08, 2016 at 09:57:38AM -0800, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1457459179 28800
> #      Tue Mar 08 09:46:19 2016 -0800
> # Node ID 2253a514d6a5ff3695f1a8a0583807c3476f4f61
> # Parent  70c8fc604d568ab6f31f0f325f16bfd8a96355f5
> formatter: make grep command use formatter

Love it! timeless, does the proposed naming convention here line up
with your templating plan?

>
> Apart from a general goal "make output configurable" this
> fix allows a much wanted feature of having `grep` produce
> hashes instead of revision numbers.
>
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -4154,7 +4154,7 @@ def _dograft(ui, repo, *revs, **opts):
>       _('only search files changed within revision range'), _('REV')),
>      ('u', 'user', None, _('list the author (long with -v)')),
>      ('d', 'date', None, _('list the date (short with -q)')),
> -    ] + walkopts,
> +    ] + walkopts + formatteropts,
>      _('[OPTION]... PATTERN [FILE]...'),
>      inferrepo=True)
>  def grep(ui, repo, pattern, *pats, **opts):
> @@ -4254,12 +4254,8 @@ def grep(ui, repo, pattern, *pats, **opt
>                  for i in xrange(blo, bhi):
>                      yield ('+', b[i])
>
> -    def display(fn, ctx, pstates, states):
> +    def display(fn, ctx, pstates, states, fm):
>          rev = ctx.rev()
> -        if ui.quiet:
> -            datefunc = util.shortdate
> -        else:
> -            datefunc = util.datestr
>          found = False
>          @util.cachefunc
>          def binary():
> @@ -4271,28 +4267,17 @@ def grep(ui, repo, pattern, *pats, **opt
>          else:
>              iter = [('', l) for l in states]
>          for change, l in iter:
> -            cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
> -
> -            if opts.get('line_number'):
> -                cols.append((str(l.linenum), 'grep.linenumber'))
> -            if opts.get('all'):
> -                cols.append((change, 'grep.change'))
> -            if opts.get('user'):
> -                cols.append((ui.shortuser(ctx.user()), 'grep.user'))
> -            if opts.get('date'):
> -                cols.append((datefunc(ctx.date()), 'grep.date'))
> -            for col, label in cols[:-1]:
> -                ui.write(col, label=label)
> -                ui.write(sep, label='grep.sep')
> -            ui.write(cols[-1][0], label=cols[-1][1])
> -            if not opts.get('files_with_matches'):
> -                ui.write(sep, label='grep.sep')
> -                if not opts.get('text') and binary():
> -                    ui.write(" Binary file matches")
> -                else:
> -                    for s, label in l:
> -                        ui.write(s, label=label)
> -            ui.write(eol)
> +            fm.startitem()
> +            fm.data(filename=fn)
> +            fm.data(rev=rev)
> +            fm.data(node=ctx.hex())
> +            fm.data(desc=ctx.description())
> +            fm.data(linenum=str(l.linenum))
> +            fm.data(change=change)
> +            fm.data(user=ctx.user())
> +            fm.data(date=ctx.date())
> +            fm.data(binary='true' if binary() else 'false')
> +            fm.data(chunks=[{'text': s, 'lbl': lbl} for s, lbl in l])
>              found = True
>              if opts.get('files_with_matches'):
>                  break
> @@ -4339,6 +4324,32 @@ def grep(ui, repo, pattern, *pats, **opt
>                  except error.LookupError:
>                      pass
>
> +    tmpl = ["{label('grep.filename', filename)}", "{label('grep.rev', rev)}"]
> +    if opts.get('line_number'):
> +        tmpl.append("{label('grep.linenumber', linenum)}")
> +    if opts.get('all'):
> +        tmpl.append("{label('grep.change', change)}")
> +    if opts.get('user'):
> +        tmpl.append("{label('grep.user', emailuser(user))}")
> +    if opts.get('date'):
> +        if ui.quiet:
> +            tmpl.append("{label('grep.date', shortdate(date))}")
> +        else:
> +            tmpl.append("{label('grep.date', date(date))}")
> +
> +    if not opts.get('files_with_matches'):
> +        if opts.get('text'):
> +            tmpl.append("{chunks % '{label(lbl, text)}'}")
> +        else:
> +            tmpl.append("{ifeq(binary, 'true',  ' Binary file matches'," +\
> +                          " chunks % '{label(lbl, text)}')}")
> +    lblsep = "{label('grep.sep', '%s')}" % sep
> +    tmpl = lblsep.join(tmpl) + eol
> +
> +    if not opts.get('template'):
> +        opts['template'] = tmpl
> +
> +    fm = ui.formatter('grep', opts)
>      for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
>          rev = ctx.rev()
>          parent = ctx.p1().rev()
> @@ -4351,7 +4362,7 @@ def grep(ui, repo, pattern, *pats, **opt
>                  continue
>              pstates = matches.get(parent, {}).get(copy or fn, [])
>              if pstates or states:
> -                r = display(fn, ctx, pstates, states)
> +                r = display(fn, ctx, pstates, states, fm)
>                  found = found or r
>                  if r and not opts.get('all'):
>                      skip[fn] = True
> @@ -4360,6 +4371,7 @@ def grep(ui, repo, pattern, *pats, **opt
>          del matches[rev]
>          del revfiles[rev]
>
> +    fm.end()
>      return not found
>
>  @command('heads',
> diff --git a/tests/test-completion.t b/tests/test-completion.t
> --- a/tests/test-completion.t
> +++ b/tests/test-completion.t
> @@ -276,7 +276,7 @@ Show all commands + options
>    debugwireargs: three, four, five, ssh, remotecmd, insecure
>    files: rev, print0, include, exclude, template, subrepos
>    graft: rev, continue, edit, log, force, currentdate, currentuser, date, user, tool, dry-run
> -  grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
> +  grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude, template
>    heads: rev, topo, active, closed, style, template
>    help: extension, command, keyword, system
>    identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list