4281 ('n', 'line-number', None, _('print matching line numbers')), |
4281 ('n', 'line-number', None, _('print matching line numbers')), |
4282 ('r', 'rev', [], |
4282 ('r', 'rev', [], |
4283 _('only search files changed within revision range'), _('REV')), |
4283 _('only search files changed within revision range'), _('REV')), |
4284 ('u', 'user', None, _('list the author (long with -v)')), |
4284 ('u', 'user', None, _('list the author (long with -v)')), |
4285 ('d', 'date', None, _('list the date (short with -q)')), |
4285 ('d', 'date', None, _('list the date (short with -q)')), |
4286 ] + walkopts, |
4286 ] + formatteropts + walkopts, |
4287 _('[OPTION]... PATTERN [FILE]...'), |
4287 _('[OPTION]... PATTERN [FILE]...'), |
4288 inferrepo=True) |
4288 inferrepo=True) |
4289 def grep(ui, repo, pattern, *pats, **opts): |
4289 def grep(ui, repo, pattern, *pats, **opts): |
4290 """search for a pattern in specified files and revisions |
4290 """search for a pattern in specified files and revisions |
4291 |
4291 |
4378 for i in xrange(alo, ahi): |
4378 for i in xrange(alo, ahi): |
4379 yield ('-', a[i]) |
4379 yield ('-', a[i]) |
4380 for i in xrange(blo, bhi): |
4380 for i in xrange(blo, bhi): |
4381 yield ('+', b[i]) |
4381 yield ('+', b[i]) |
4382 |
4382 |
4383 def display(fn, ctx, pstates, states): |
4383 def display(fm, fn, ctx, pstates, states): |
4384 rev = ctx.rev() |
4384 rev = ctx.rev() |
|
4385 if fm: |
|
4386 formatuser = str |
|
4387 else: |
|
4388 formatuser = ui.shortuser |
4385 if ui.quiet: |
4389 if ui.quiet: |
4386 datefunc = util.shortdate |
4390 datefmt = '%Y-%m-%d' |
4387 else: |
4391 else: |
4388 datefunc = util.datestr |
4392 datefmt = '%a %b %d %H:%M:%S %Y %1%2' |
4389 found = False |
4393 found = False |
4390 @util.cachefunc |
4394 @util.cachefunc |
4391 def binary(): |
4395 def binary(): |
4392 flog = getfile(fn) |
4396 flog = getfile(fn) |
4393 return util.binary(flog.read(ctx.filenode(fn))) |
4397 return util.binary(flog.read(ctx.filenode(fn))) |
4394 |
4398 |
|
4399 fieldnamemap = {'filename': 'file', 'linenumber': 'line_number'} |
4395 if opts.get('all'): |
4400 if opts.get('all'): |
4396 iter = difflinestates(pstates, states) |
4401 iter = difflinestates(pstates, states) |
4397 else: |
4402 else: |
4398 iter = [('', l) for l in states] |
4403 iter = [('', l) for l in states] |
4399 for change, l in iter: |
4404 for change, l in iter: |
|
4405 fm.startitem() |
|
4406 fm.data(node=fm.hexfunc(ctx.node())) |
4400 cols = [ |
4407 cols = [ |
4401 ('filename', fn, True), |
4408 ('filename', fn, True), |
4402 ('rev', str(rev), True), |
4409 ('rev', rev, True), |
4403 ('linenumber', str(l.linenum), opts.get('line_number')), |
4410 ('linenumber', l.linenum, opts.get('line_number')), |
4404 ] |
4411 ] |
4405 if opts.get('all'): |
4412 if opts.get('all'): |
4406 cols.append(('change', change, True)) |
4413 cols.append(('change', change, True)) |
4407 cols.extend([ |
4414 cols.extend([ |
4408 ('user', ui.shortuser(ctx.user()), opts.get('user')), |
4415 ('user', formatuser(ctx.user()), opts.get('user')), |
4409 ('date', datefunc(ctx.date()), opts.get('date')), |
4416 ('date', fm.formatdate(ctx.date(), datefmt), opts.get('date')), |
4410 ]) |
4417 ]) |
4411 lastcol = next(name for name, data, cond in reversed(cols) if cond) |
4418 lastcol = next(name for name, data, cond in reversed(cols) if cond) |
4412 for name, data, cond in cols: |
4419 for name, data, cond in cols: |
4413 if cond: |
4420 field = fieldnamemap.get(name, name) |
4414 ui.write(data, label='grep.%s' % name) |
4421 fm.condwrite(cond, field, '%s', data, label='grep.%s' % name) |
4415 if cond and name != lastcol: |
4422 if cond and name != lastcol: |
4416 ui.write(sep, label='grep.sep') |
4423 fm.plain(sep, label='grep.sep') |
4417 if not opts.get('files_with_matches'): |
4424 if not opts.get('files_with_matches'): |
4418 ui.write(sep, label='grep.sep') |
4425 fm.plain(sep, label='grep.sep') |
4419 if not opts.get('text') and binary(): |
4426 if not opts.get('text') and binary(): |
4420 ui.write(_(" Binary file matches")) |
4427 fm.plain(_(" Binary file matches")) |
4421 else: |
4428 else: |
4422 displaymatches(l) |
4429 displaymatches(fm.nested('texts'), l) |
4423 ui.write(eol) |
4430 fm.plain(eol) |
4424 found = True |
4431 found = True |
4425 if opts.get('files_with_matches'): |
4432 if opts.get('files_with_matches'): |
4426 break |
4433 break |
4427 return found |
4434 return found |
4428 |
4435 |
4429 def displaymatches(l): |
4436 def displaymatches(fm, l): |
4430 p = 0 |
4437 p = 0 |
4431 for s, e in l.findpos(): |
4438 for s, e in l.findpos(): |
4432 ui.write(l.line[p:s]) |
4439 if p < s: |
4433 ui.write(l.line[s:e], label='grep.match') |
4440 fm.startitem() |
|
4441 fm.write('text', '%s', l.line[p:s]) |
|
4442 fm.data(matched=False) |
|
4443 fm.startitem() |
|
4444 fm.write('text', '%s', l.line[s:e], label='grep.match') |
|
4445 fm.data(matched=True) |
4434 p = e |
4446 p = e |
4435 ui.write(l.line[p:]) |
4447 if p < len(l.line): |
|
4448 fm.startitem() |
|
4449 fm.write('text', '%s', l.line[p:]) |
|
4450 fm.data(matched=False) |
|
4451 fm.end() |
4436 |
4452 |
4437 skip = {} |
4453 skip = {} |
4438 revfiles = {} |
4454 revfiles = {} |
4439 matchfn = scmutil.match(repo[None], pats, opts) |
4455 matchfn = scmutil.match(repo[None], pats, opts) |
4440 found = False |
4456 found = False |