comparison mercurial/cmdutil.py @ 21876:584bbfd1b50d stable

log: make --patch --follow work inside a subdirectory Previously, the 'patch' code for hg log --patch --follow would try to resolve patterns relative to the repository root rather than the current working directory. Fix that by using match.files instead of pats, as done elsewhere nearby.
author Siddharth Agarwal <sid0@fb.com>
date Sat, 12 Jul 2014 02:23:17 -0700
parents 3666331164bb
children dbbae63865a6
comparison
equal deleted inserted replaced
21868:3420346174b1 21876:584bbfd1b50d
1455 if stopiteration: 1455 if stopiteration:
1456 break 1456 break
1457 1457
1458 return iterate() 1458 return iterate()
1459 1459
1460 def _makelogfilematcher(repo, pats, followfirst): 1460 def _makelogfilematcher(repo, files, followfirst):
1461 # When displaying a revision with --patch --follow FILE, we have 1461 # When displaying a revision with --patch --follow FILE, we have
1462 # to know which file of the revision must be diffed. With 1462 # to know which file of the revision must be diffed. With
1463 # --follow, we want the names of the ancestors of FILE in the 1463 # --follow, we want the names of the ancestors of FILE in the
1464 # revision, stored in "fcache". "fcache" is populated by 1464 # revision, stored in "fcache". "fcache" is populated by
1465 # reproducing the graph traversal already done by --follow revset 1465 # reproducing the graph traversal already done by --follow revset
1469 fcacheready = [False] 1469 fcacheready = [False]
1470 pctx = repo['.'] 1470 pctx = repo['.']
1471 wctx = repo[None] 1471 wctx = repo[None]
1472 1472
1473 def populate(): 1473 def populate():
1474 for fn in pats: 1474 for fn in files:
1475 for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)): 1475 for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)):
1476 for c in i: 1476 for c in i:
1477 fcache.setdefault(c.linkrev(), set()).add(c.path()) 1477 fcache.setdefault(c.linkrev(), set()).add(c.path())
1478 1478
1479 def filematcher(rev): 1479 def filematcher(rev):
1594 opts['_patslog'] = list(pats) 1594 opts['_patslog'] = list(pats)
1595 1595
1596 filematcher = None 1596 filematcher = None
1597 if opts.get('patch') or opts.get('stat'): 1597 if opts.get('patch') or opts.get('stat'):
1598 if follow: 1598 if follow:
1599 filematcher = _makelogfilematcher(repo, pats, followfirst) 1599 # _makelogfilematcher expects its files argument to be relative to
1600 # the repo root, so use match.files(), not pats.
1601 filematcher = _makelogfilematcher(repo, match.files(), followfirst)
1600 else: 1602 else:
1601 filematcher = lambda rev: match 1603 filematcher = lambda rev: match
1602 1604
1603 expr = [] 1605 expr = []
1604 for op, val in opts.iteritems(): 1606 for op, val in opts.iteritems():