mharbison72 created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers.
REVISION SUMMARY This allows filesets to be resolved relative to `repo.root`, the same as other patterns are since f02d3c0eed18 <https://phab.mercurial-scm.org/rHGf02d3c0eed18be9a7a0790405e5de284d0727713>. The current example in contrib/ wasn't working from the tests directory because of this. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D7570 AFFECTED FILES mercurial/context.py mercurial/fileset.py mercurial/match.py mercurial/subrepo.py tests/test-fix.t CHANGE DETAILS diff --git a/tests/test-fix.t b/tests/test-fix.t --- a/tests/test-fix.t +++ b/tests/test-fix.t @@ -1333,24 +1333,20 @@ Apparently fixing p1() and its descendants doesn't include wdir() unless explicitly stated. -BROKEN: fileset matches aren't relative to repo.root for commits - $ hg fix -r '.::' $ hg cat -r . ../quux quux $ hg cat -r tip ../quux - quux + fs: $TESTTMP/subprocesscwd $ cat ../quux quux Clean files are not fixed unless explicitly named $ echo 'dirty' > ../quux -BROKEN: fileset matches aren't relative to repo.root for wdir - $ hg fix --working-dir $ cat ../quux - dirty + fs: $TESTTMP/subprocesscwd $ cd ../.. diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -355,7 +355,7 @@ """return file flags""" return b'' - def matchfileset(self, expr, badfn=None): + def matchfileset(self, expr, badfn=None, cwd=None): """Resolve the fileset expression for this repo""" return matchmod.never(badfn=badfn) @@ -894,20 +894,20 @@ return cmdutil.files(ui, ctx, m, uipathfn, fm, fmt, subrepos) @annotatesubrepoerror - def matchfileset(self, expr, badfn=None): + def matchfileset(self, expr, badfn=None, cwd=None): if self._ctx.rev() is None: ctx = self._repo[None] else: rev = self._state[1] ctx = self._repo[rev] - matchers = [ctx.matchfileset(expr, badfn=badfn)] + matchers = [ctx.matchfileset(expr, badfn=badfn, cwd=cwd)] for subpath in ctx.substate: sub = ctx.sub(subpath) try: - sm = sub.matchfileset(expr, badfn=badfn) + sm = sub.matchfileset(expr, badfn=badfn, cwd=cwd) pm = matchmod.prefixdirmatcher(subpath, sm, badfn=badfn) matchers.append(pm) except error.LookupError: diff --git a/mercurial/match.py b/mercurial/match.py --- a/mercurial/match.py +++ b/mercurial/match.py @@ -57,7 +57,7 @@ return m.match -def _expandsets(kindpats, ctx=None, listsubrepos=False, badfn=None): +def _expandsets(kindpats, ctx=None, listsubrepos=False, badfn=None, cwd=None): '''Returns the kindpats list with the 'set' patterns expanded to matchers''' matchers = [] other = [] @@ -68,11 +68,13 @@ raise error.ProgrammingError( b"fileset expression with no context" ) - matchers.append(ctx.matchfileset(pat, badfn=badfn)) + matchers.append(ctx.matchfileset(pat, badfn=badfn, cwd=cwd)) if listsubrepos: for subpath in ctx.substate: - sm = ctx.sub(subpath).matchfileset(pat, badfn=badfn) + sm = ctx.sub(subpath).matchfileset( + pat, badfn=badfn, cwd=cwd + ) pm = prefixdirmatcher(subpath, sm, badfn=badfn) matchers.append(pm) @@ -117,11 +119,17 @@ def _buildkindpatsmatcher( - matchercls, root, kindpats, ctx=None, listsubrepos=False, badfn=None + matchercls, + root, + kindpats, + ctx=None, + listsubrepos=False, + badfn=None, + cwd=None, ): matchers = [] fms, kindpats = _expandsets( - kindpats, ctx=ctx, listsubrepos=listsubrepos, badfn=badfn + kindpats, ctx=ctx, listsubrepos=listsubrepos, badfn=badfn, cwd=cwd, ) if kindpats: m = matchercls(root, kindpats, badfn=badfn) @@ -260,6 +268,7 @@ ctx=ctx, listsubrepos=listsubrepos, badfn=badfn, + cwd=cwd, ) else: # It's a little strange that no patterns means to match everything. @@ -275,6 +284,7 @@ ctx=ctx, listsubrepos=listsubrepos, badfn=None, + cwd=cwd, ) m = intersectmatchers(m, im) if exclude: @@ -286,6 +296,7 @@ ctx=ctx, listsubrepos=listsubrepos, badfn=None, + cwd=cwd, ) m = differencematcher(m, em) return m diff --git a/mercurial/fileset.py b/mercurial/fileset.py --- a/mercurial/fileset.py +++ b/mercurial/fileset.py @@ -520,12 +520,13 @@ class matchctx(object): - def __init__(self, basectx, ctx, badfn=None): + def __init__(self, basectx, ctx, badfn=None, cwd=None): self._basectx = basectx self.ctx = ctx self._badfn = badfn self._match = None self._status = None + self.cwd = cwd def narrowed(self, match): """Create matchctx for a sub-tree narrowed by the given matcher""" @@ -560,7 +561,7 @@ return self._status def matcher(self, patterns): - return self.ctx.match(patterns, badfn=self._badfn) + return self.ctx.match(patterns, badfn=self._badfn, cwd=self.cwd) def predicate(self, predfn, predrepr=None, cache=False): """Create a matcher to select files by predfn(filename)""" @@ -617,12 +618,12 @@ return matchmod.never(badfn=self._badfn) -def match(ctx, expr, badfn=None): +def match(ctx, expr, badfn=None, cwd=None): """Create a matcher for a single fileset expression""" tree = filesetlang.parse(expr) tree = filesetlang.analyze(tree) tree = filesetlang.optimize(tree) - mctx = matchctx(ctx.p1(), ctx, badfn=badfn) + mctx = matchctx(ctx.p1(), ctx, badfn=badfn, cwd=cwd) return getmatch(mctx, tree) diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -200,8 +200,8 @@ def mutable(self): return self.phase() > phases.public - def matchfileset(self, expr, badfn=None): - return fileset.match(self, expr, badfn=badfn) + def matchfileset(self, expr, badfn=None, cwd=None): + return fileset.match(self, expr, badfn=badfn, cwd=cwd) def obsolete(self): """True if the changeset is obsolete""" @@ -328,11 +328,14 @@ default=b'glob', listsubrepos=False, badfn=None, + cwd=None, ): r = self._repo + if not cwd: + cwd = r.getcwd() return matchmod.match( r.root, - r.getcwd(), + cwd, pats, include, exclude, @@ -1694,15 +1697,18 @@ default=b'glob', listsubrepos=False, badfn=None, + cwd=None, ): r = self._repo + if not cwd: + cwd = r.getcwd() # Only a case insensitive filesystem needs magic to translate user input # to actual case in the filesystem. icasefs = not util.fscasesensitive(r.root) return matchmod.match( r.root, - r.getcwd(), + cwd, pats, include, exclude, To: mharbison72, #hg-reviewers Cc: mercurial-devel _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel