mercurial/revset.py
changeset 30754 26209cb7184e
parent 30753 c3a3896a9fa8
child 30772 b1012cb1bec3
equal deleted inserted replaced
30753:c3a3896a9fa8 30754:26209cb7184e
  1076     consistent with file size. If rev is not specified, working directory's
  1076     consistent with file size. If rev is not specified, working directory's
  1077     parent is used.
  1077     parent is used.
  1078     """
  1078     """
  1079     from . import context  # avoid circular import issues
  1079     from . import context  # avoid circular import issues
  1080 
  1080 
  1081     args = getargs(x, 3, 4, _("followlines takes at least three arguments"))
  1081     args = getargsdict(x, 'followlines', 'file *lines rev')
       
  1082     if len(args['lines']) != 2:
       
  1083         raise error.ParseError(_("followlines takes at least three arguments"))
  1082 
  1084 
  1083     rev = '.'
  1085     rev = '.'
  1084     if len(args) == 4:
  1086     if 'rev' in args:
  1085         revarg = getargsdict(args[3], 'followlines', 'rev')
  1087         revs = getset(repo, fullreposet(repo), args['rev'])
  1086         if 'rev' in revarg:
  1088         if len(revs) != 1:
  1087             revs = getset(repo, fullreposet(repo), revarg['rev'])
  1089             raise error.ParseError(
  1088             if len(revs) != 1:
  1090                 _("followlines expects exactly one revision"))
  1089                 raise error.ParseError(
  1091         rev = revs.last()
  1090                     _("followlines expects exactly one revision"))
  1092 
  1091             rev = revs.last()
  1093     pat = getstring(args['file'], _("followlines requires a pattern"))
  1092 
       
  1093     pat = getstring(args[0], _("followlines requires a pattern"))
       
  1094     if not matchmod.patkind(pat):
  1094     if not matchmod.patkind(pat):
  1095         fname = pathutil.canonpath(repo.root, repo.getcwd(), pat)
  1095         fname = pathutil.canonpath(repo.root, repo.getcwd(), pat)
  1096     else:
  1096     else:
  1097         m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=repo[rev])
  1097         m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=repo[rev])
  1098         files = [f for f in repo[rev] if m(f)]
  1098         files = [f for f in repo[rev] if m(f)]
  1099         if len(files) != 1:
  1099         if len(files) != 1:
  1100             raise error.ParseError(_("followlines expects exactly one file"))
  1100             raise error.ParseError(_("followlines expects exactly one file"))
  1101         fname = files[0]
  1101         fname = files[0]
  1102 
  1102 
  1103     try:
  1103     try:
  1104         fromline, toline = [int(getsymbol(a)) for a in args[1:3]]
  1104         fromline, toline = [int(getsymbol(a)) for a in args['lines']]
  1105     except ValueError:
  1105     except ValueError:
  1106         raise error.ParseError(_("line range bounds must be integers"))
  1106         raise error.ParseError(_("line range bounds must be integers"))
  1107     if toline - fromline < 0:
  1107     if toline - fromline < 0:
  1108         raise error.ParseError(_("line range must be positive"))
  1108         raise error.ParseError(_("line range must be positive"))
  1109     if fromline < 1:
  1109     if fromline < 1: