comparison mercurial/fileset.py @ 44009:e685fac56693

match: resolve filesets against the passed `cwd`, not the current one This allows filesets to be resolved relative to `repo.root`, the same as other patterns are since f02d3c0eed18. The current example in contrib/ wasn't working from the tests directory because of this. Differential Revision: https://phab.mercurial-scm.org/D7570
author Matt Harbison <matt_harbison@yahoo.com>
date Fri, 06 Dec 2019 20:40:02 -0500
parents d783f945a701
children b7808443ed6a
comparison
equal deleted inserted replaced
44008:ac72e17457e5 44009:e685fac56693
518 b'func': func, 518 b'func': func,
519 } 519 }
520 520
521 521
522 class matchctx(object): 522 class matchctx(object):
523 def __init__(self, basectx, ctx, badfn=None): 523 def __init__(self, basectx, ctx, cwd, badfn=None):
524 self._basectx = basectx 524 self._basectx = basectx
525 self.ctx = ctx 525 self.ctx = ctx
526 self._badfn = badfn 526 self._badfn = badfn
527 self._match = None 527 self._match = None
528 self._status = None 528 self._status = None
529 self.cwd = cwd
529 530
530 def narrowed(self, match): 531 def narrowed(self, match):
531 """Create matchctx for a sub-tree narrowed by the given matcher""" 532 """Create matchctx for a sub-tree narrowed by the given matcher"""
532 mctx = matchctx(self._basectx, self.ctx, self._badfn) 533 mctx = matchctx(self._basectx, self.ctx, self.cwd, self._badfn)
533 mctx._match = match 534 mctx._match = match
534 # leave wider status which we don't have to care 535 # leave wider status which we don't have to care
535 mctx._status = self._status 536 mctx._status = self._status
536 return mctx 537 return mctx
537 538
538 def switch(self, basectx, ctx): 539 def switch(self, basectx, ctx):
539 mctx = matchctx(basectx, ctx, self._badfn) 540 mctx = matchctx(basectx, ctx, self.cwd, self._badfn)
540 mctx._match = self._match 541 mctx._match = self._match
541 return mctx 542 return mctx
542 543
543 def withstatus(self, keys): 544 def withstatus(self, keys):
544 """Create matchctx which has precomputed status specified by the keys""" 545 """Create matchctx which has precomputed status specified by the keys"""
545 mctx = matchctx(self._basectx, self.ctx, self._badfn) 546 mctx = matchctx(self._basectx, self.ctx, self.cwd, self._badfn)
546 mctx._match = self._match 547 mctx._match = self._match
547 mctx._buildstatus(keys) 548 mctx._buildstatus(keys)
548 return mctx 549 return mctx
549 550
550 def _buildstatus(self, keys): 551 def _buildstatus(self, keys):
558 559
559 def status(self): 560 def status(self):
560 return self._status 561 return self._status
561 562
562 def matcher(self, patterns): 563 def matcher(self, patterns):
563 return self.ctx.match(patterns, badfn=self._badfn) 564 return self.ctx.match(patterns, badfn=self._badfn, cwd=self.cwd)
564 565
565 def predicate(self, predfn, predrepr=None, cache=False): 566 def predicate(self, predfn, predrepr=None, cache=False):
566 """Create a matcher to select files by predfn(filename)""" 567 """Create a matcher to select files by predfn(filename)"""
567 if cache: 568 if cache:
568 predfn = util.cachefunc(predfn) 569 predfn = util.cachefunc(predfn)
615 def never(self): 616 def never(self):
616 """Create a matcher to select nothing""" 617 """Create a matcher to select nothing"""
617 return matchmod.never(badfn=self._badfn) 618 return matchmod.never(badfn=self._badfn)
618 619
619 620
620 def match(ctx, expr, badfn=None): 621 def match(ctx, cwd, expr, badfn=None):
621 """Create a matcher for a single fileset expression""" 622 """Create a matcher for a single fileset expression"""
622 tree = filesetlang.parse(expr) 623 tree = filesetlang.parse(expr)
623 tree = filesetlang.analyze(tree) 624 tree = filesetlang.analyze(tree)
624 tree = filesetlang.optimize(tree) 625 tree = filesetlang.optimize(tree)
625 mctx = matchctx(ctx.p1(), ctx, badfn=badfn) 626 mctx = matchctx(ctx.p1(), ctx, cwd, badfn=badfn)
626 return getmatch(mctx, tree) 627 return getmatch(mctx, tree)
627 628
628 629
629 def loadpredicate(ui, extname, registrarobj): 630 def loadpredicate(ui, extname, registrarobj):
630 """Load fileset predicates from specified registrarobj 631 """Load fileset predicates from specified registrarobj