##// END OF EJS Templates
revset: fix sorting key of wdir revision...
revset: fix sorting key of wdir revision It would go wrong on Python 2, and would crash on Python 3.

File last commit:

r45376:2870f5d5 default
r46293:b90d7e7f default
Show More
fileset.py
638 lines | 18.7 KiB | text/x-python | PythonLexer
Matt Mackall
filesets: introduce basic fileset expression parser
r14511 # fileset.py - file set queries for mercurial
#
# Copyright 2010 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Gregory Szorc
fileset: use absolute_import
r25938 from __future__ import absolute_import
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 import errno
Augie Fackler
cleanup: move stdlib imports to their own import statement...
r20034 import re
Gregory Szorc
fileset: use absolute_import
r25938
from .i18n import _
Gregory Szorc
py3: manually import getattr where it is needed...
r43359 from .pycompat import getattr
Gregory Szorc
fileset: use absolute_import
r25938 from . import (
error,
Yuya Nishihara
fileset: extract language processing part to new module (API)...
r38841 filesetlang,
Yuya Nishihara
fileset: move import of match module to top...
r35757 match as matchmod,
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 mergestate as mergestatemod,
Pulkit Goyal
py3: use pycompat.bytestr so that we don't get ascii values...
r32523 pycompat,
FUJIWARA Katsunori
fileset: replace predicate by filesetpredicate of registrar (API)...
r28448 registrar,
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 scmutil,
Gregory Szorc
fileset: use absolute_import
r25938 util,
)
Augie Fackler
formatting: blacken the codebase...
r43346 from .utils import stringutil
Matt Mackall
filesets: introduce basic fileset expression parser
r14511
Yuya Nishihara
fileset: introduce weight constants for readability...
r38899 # common weight constants
_WEIGHT_CHECK_FILENAME = filesetlang.WEIGHT_CHECK_FILENAME
_WEIGHT_READ_CONTENTS = filesetlang.WEIGHT_READ_CONTENTS
_WEIGHT_STATUS = filesetlang.WEIGHT_STATUS
_WEIGHT_STATUS_THOROUGH = filesetlang.WEIGHT_STATUS_THOROUGH
Yuya Nishihara
fileset: extract language processing part to new module (API)...
r38841 # helpers for processing parsed tree
getsymbol = filesetlang.getsymbol
getstring = filesetlang.getstring
_getkindpat = filesetlang.getkindpat
getpattern = filesetlang.getpattern
getargs = filesetlang.getargs
Yuya Nishihara
fileset: move helper functions to top
r38617
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def getmatch(mctx, x):
Matt Mackall
fileset: basic pattern and boolean support...
r14551 if not x:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"missing argument"))
Matt Mackall
fileset: basic pattern and boolean support...
r14551 return methods[x[0]](mctx, *x[1:])
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: insert hints where status should be computed...
r38915 def getmatchwithstatus(mctx, x, hint):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 keys = set(getstring(hint, b'status hint must be a string').split())
Yuya Nishihara
fileset: build status according to 'withstatus' hint...
r38916 return getmatch(mctx.withstatus(keys), x)
Yuya Nishihara
fileset: insert hints where status should be computed...
r38915
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def stringmatch(mctx, x):
return mctx.matcher([x])
Matt Mackall
fileset: basic pattern and boolean support...
r14551
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def kindpatmatch(mctx, x, y):
Augie Fackler
formatting: blacken the codebase...
r43346 return stringmatch(
mctx,
_getkindpat(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 x, y, matchmod.allpatternkinds, _(b"pattern must be a string")
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
Yuya Nishihara
fileset: add kind:pat operator...
r35759
Yuya Nishihara
fileset: combine union of basic patterns into single matcher...
r38901 def patternsmatch(mctx, *xs):
allkinds = matchmod.allpatternkinds
Augie Fackler
formatting: blacken the codebase...
r43346 patterns = [
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getpattern(x, allkinds, _(b"pattern must be a string")) for x in xs
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Yuya Nishihara
fileset: combine union of basic patterns into single matcher...
r38901 return mctx.matcher(patterns)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def andmatch(mctx, x, y):
xm = getmatch(mctx, x)
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 ym = getmatch(mctx.narrowed(xm), y)
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return matchmod.intersectmatchers(xm, ym)
Matt Mackall
fileset: basic pattern and boolean support...
r14551
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: flatten 'or' nodes to unnest unionmatchers...
r38840 def ormatch(mctx, *xs):
ms = [getmatch(mctx, x) for x in xs]
return matchmod.unionmatcher(ms)
Matt Mackall
fileset: basic pattern and boolean support...
r14551
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def notmatch(mctx, x):
m = getmatch(mctx, x)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(lambda f: not m(f), predrepr=(b'<not %r>', m))
Matt Mackall
fileset: basic pattern and boolean support...
r14551
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def minusmatch(mctx, x, y):
xm = getmatch(mctx, x)
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 ym = getmatch(mctx.narrowed(xm), y)
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return matchmod.differencematcher(xm, ym)
Patrick Mezard
fileset: actually implement 'minusset'...
r17363
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: flatten arguments list...
r38839 def listmatch(mctx, *xs):
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"can't use a list in this context"),
hint=_(b'see \'hg help "filesets.x or y"\''),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
fileset: basic pattern and boolean support...
r14551
Yuya Nishihara
fileset: move helper functions to top
r38617 def func(mctx, a, b):
funcname = getsymbol(a)
if funcname in symbols:
Yuya Nishihara
fileset: remove callexisting flag and mctx.existing() (API)...
r38712 return symbols[funcname](mctx, b)
Yuya Nishihara
fileset: move helper functions to top
r38617
keep = lambda fn: getattr(fn, '__doc__', None) is not None
syms = [s for (s, fn) in symbols.items() if keep(fn)]
raise error.UnknownIdentifier(funcname, syms)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 # symbols are callable like:
# fun(mctx, x)
# with:
# mctx - current matchctx instance
# x - argument in tree form
Yuya Nishihara
fileset: extract language processing part to new module (API)...
r38841 symbols = filesetlang.symbols
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460
Yuya Nishihara
fileset: load core predicates directly to symbols dict...
r38963 predicate = registrar.filesetpredicate(symbols)
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'modified()', callstatus=True, weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add support for file status predicates...
r14677 def modified(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is modified according to :hg:`status`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "modified" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"modified takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().modified)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'modified')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'added()', callstatus=True, weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add support for file status predicates...
r14677 def added(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is added according to :hg:`status`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "added" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"added takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().added)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'added')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'removed()', callstatus=True, weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add support for file status predicates...
r14677 def removed(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is removed according to :hg:`status`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "removed" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"removed takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().removed)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'removed')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'deleted()', callstatus=True, weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add support for file status predicates...
r14677 def deleted(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """Alias for ``missing()``.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "deleted" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"deleted takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().deleted)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'deleted')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'missing()', callstatus=True, weight=_WEIGHT_STATUS)
liscju
fileset: add missing() predicate (issue4925)...
r27024 def missing(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is missing according to :hg:`status`.
liscju
fileset: add missing() predicate (issue4925)...
r27024 """
# i18n: "missing" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"missing takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().deleted)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'deleted')
liscju
fileset: add missing() predicate (issue4925)...
r27024
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'unknown()', callstatus=True, weight=_WEIGHT_STATUS_THOROUGH)
Matt Mackall
fileset: add support for file status predicates...
r14677 def unknown(mctx, x):
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 """File that is unknown according to :hg:`status`."""
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "unknown" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"unknown takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().unknown)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'unknown')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'ignored()', callstatus=True, weight=_WEIGHT_STATUS_THOROUGH)
Matt Mackall
fileset: add support for file status predicates...
r14677 def ignored(mctx, x):
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 """File that is ignored according to :hg:`status`."""
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "ignored" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"ignored takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().ignored)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'ignored')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'clean()', callstatus=True, weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add support for file status predicates...
r14677 def clean(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is clean according to :hg:`status`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "clean" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"clean takes no arguments"))
Gregory Szorc
fileset: perform membership test against set for status queries...
r31697 s = set(mctx.status().clean)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(s.__contains__, predrepr=b'clean')
Matt Mackall
fileset: add support for file status predicates...
r14677
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'tracked()')
Yuya Nishihara
fileset: add "tracked()" to explicitly select files in the revision...
r38708 def tracked(mctx, x):
"""File that is under Mercurial control."""
# i18n: "tracked" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"tracked takes no arguments"))
return mctx.predicate(mctx.ctx.__contains__, predrepr=b'tracked')
Yuya Nishihara
fileset: add "tracked()" to explicitly select files in the revision...
r38708
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'binary()', weight=_WEIGHT_READ_CONTENTS)
Matt Mackall
fileset: add some basic predicates
r14676 def binary(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that appears to be binary (contains NUL bytes).
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "binary" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"binary takes no arguments"))
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.fpredicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda fctx: fctx.isbinary(), predrepr=b'binary', cache=True
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
fileset: add some basic predicates
r14676
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'exec()')
Matt Mackall
fileset: add some basic predicates
r14676 def exec_(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is marked as executable.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "exec" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"exec takes no arguments"))
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 ctx = mctx.ctx
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(lambda f: ctx.flags(f) == b'x', predrepr=b'exec')
Matt Mackall
fileset: add some basic predicates
r14676
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'symlink()')
Matt Mackall
fileset: add some basic predicates
r14676 def symlink(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is marked as a symlink.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "symlink" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"symlink takes no arguments"))
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 ctx = mctx.ctx
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(lambda f: ctx.flags(f) == b'l', predrepr=b'symlink')
Matt Mackall
fileset: add some basic predicates
r14676
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'resolved()', weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add resolved and unresolved predicates
r14679 def resolved(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is marked resolved according to :hg:`resolve -l`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "resolved" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"resolved takes no arguments"))
Matt Mackall
fileset: add resolved and unresolved predicates
r14679 if mctx.ctx.rev() is not None:
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return mctx.never()
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 ms = mergestatemod.mergestate.read(mctx.ctx.repo())
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda f: f in ms and ms[f] == b'r', predrepr=b'resolved'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
fileset: add resolved and unresolved predicates
r14679
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'unresolved()', weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add resolved and unresolved predicates
r14679 def unresolved(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is marked unresolved according to :hg:`resolve -l`.
Matt Mackall
fileset: add some function help text
r14681 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "unresolved" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"unresolved takes no arguments"))
Matt Mackall
fileset: add resolved and unresolved predicates
r14679 if mctx.ctx.rev() is not None:
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return mctx.never()
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 ms = mergestatemod.mergestate.read(mctx.ctx.repo())
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda f: f in ms and ms[f] == b'u', predrepr=b'unresolved'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
fileset: add resolved and unresolved predicates
r14679
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'hgignore()', weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add hgignore
r14680 def hgignore(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that matches the active .hgignore pattern.
Matt Mackall
fileset: add some function help text
r14681 """
FUJIWARA Katsunori
i18n: add i18n comment to error messages of filesets predicates
r23113 # i18n: "hgignore" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"hgignore takes no arguments"))
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return mctx.ctx.repo().dirstate._ignore
Matt Mackall
fileset: add hgignore
r14680
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'portable()', weight=_WEIGHT_CHECK_FILENAME)
Siddharth Agarwal
fileset: add a fileset for portable filenames...
r24408 def portable(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that has a portable name. (This doesn't include filenames with case
Siddharth Agarwal
fileset: add a fileset for portable filenames...
r24408 collisions.)
"""
# i18n: "portable" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"portable takes no arguments"))
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda f: util.checkwinfilename(f) is None, predrepr=b'portable'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Siddharth Agarwal
fileset: add a fileset for portable filenames...
r24408
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'grep(regex)', weight=_WEIGHT_READ_CONTENTS)
Matt Mackall
fileset: add grep predicate
r14682 def grep(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File contains the given regular expression.
Matt Mackall
fileset: add grep predicate
r14682 """
Patrick Mezard
fileset: do not traceback on invalid grep pattern
r17368 try:
# i18n: "grep" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 r = re.compile(getstring(x, _(b"grep requires a pattern")))
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except re.error as e:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'invalid match pattern: %s') % stringutil.forcebytestr(e)
Augie Fackler
formatting: blacken the codebase...
r43346 )
return mctx.fpredicate(
lambda fctx: r.search(fctx.data()),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 predrepr=(b'grep(%r)', r.pattern),
Augie Fackler
formatting: blacken the codebase...
r43346 cache=True,
)
Matt Mackall
fileset: add grep predicate
r14682
Matt Mackall
fileset: add size() predicate
r14683 def _sizetomax(s):
try:
av6
filesets: ignore unit case in size() predicate for single value...
r25925 s = s.strip().lower()
Bryan O'Sullivan
util: migrate fileset._sizetoint to util.sizetoint...
r19194 for k, v in util._sizeunits:
Matt Mackall
fileset: add size() predicate
r14683 if s.endswith(k):
# max(4k) = 5k - 1, max(4.5k) = 4.6k - 1
Augie Fackler
formatting: blacken the codebase...
r43346 n = s[: -len(k)]
Matt Mackall
fileset: add size() predicate
r14683 inc = 1.0
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b"." in n:
inc /= 10 ** len(n.split(b".")[1])
Matt Mackall
fileset: add size() predicate
r14683 return int((float(n) + inc) * v) - 1
# no extension, this is a precise value
return int(s)
except ValueError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"couldn't parse size: %s") % s)
Matt Mackall
fileset: add size() predicate
r14683
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: parse argument of size() by predicate function...
r38709 def sizematcher(expr):
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 """Return a function(size) -> bool from the ``size()`` expression"""
Yuya Nishihara
fileset: parse argument of size() by predicate function...
r38709 expr = expr.strip()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'-' in expr: # do we have a range?
a, b = expr.split(b'-', 1)
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(a)
b = util.sizetoint(b)
return lambda x: x >= a and x <= b
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif expr.startswith(b"<="):
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(expr[2:])
return lambda x: x <= a
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif expr.startswith(b"<"):
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(expr[1:])
return lambda x: x < a
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif expr.startswith(b">="):
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(expr[2:])
return lambda x: x >= a
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif expr.startswith(b">"):
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(expr[1:])
return lambda x: x > a
Yuya Nishihara
fileset: drop bad "elif:" trying to check invalid size expression...
r36523 else:
Matt Harbison
fileset: split the logic for matching a size expression to a separate method...
r35633 a = util.sizetoint(expr)
b = _sizetomax(expr)
return lambda x: x >= a and x <= b
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'size(expression)', weight=_WEIGHT_STATUS)
Matt Mackall
fileset: add size() predicate
r14683 def size(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File size matches the given expression. Examples:
Matt Mackall
fileset: add size() predicate
r14683
timeless
help: clarify quotes are needed for filesets.size expressions
r29987 - size('1k') - files from 1024 to 2047 bytes
- size('< 20k') - files less than 20480 bytes
- size('>= .5MB') - files at least 524288 bytes
- size('4k - 1MB') - files from 4096 bytes to 1048576 bytes
Matt Mackall
fileset: add size() predicate
r14683 """
Yuya Nishihara
fileset: parse argument of size() by predicate function...
r38709 # i18n: "size" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 expr = getstring(x, _(b"size requires an expression"))
Yuya Nishihara
fileset: parse argument of size() by predicate function...
r38709 m = sizematcher(expr)
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.fpredicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda fctx: m(fctx.size()), predrepr=(b'size(%r)', expr), cache=True
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
fileset: add size() predicate
r14683
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'encoding(name)', weight=_WEIGHT_READ_CONTENTS)
Matt Mackall
fileset: add encoding() predicate
r14684 def encoding(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File can be successfully decoded with the given character
Matt Mackall
fileset: add encoding() predicate
r14684 encoding. May not be useful for encodings other than ASCII and
UTF-8.
"""
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "encoding" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 enc = getstring(x, _(b"encoding requires an encoding name"))
Matt Mackall
fileset: add encoding() predicate
r14684
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def encp(fctx):
d = fctx.data()
Matt Mackall
fileset: add encoding() predicate
r14684 try:
Yuya Nishihara
py3: cast bytes encoding name to str in fileset.py
r38347 d.decode(pycompat.sysstr(enc))
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return True
Matt Mackall
fileset: add encoding() predicate
r14684 except LookupError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"unknown encoding '%s'") % enc)
Matt Mackall
fileset: add encoding() predicate
r14684 except UnicodeDecodeError:
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return False
Matt Mackall
fileset: add encoding() predicate
r14684
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.fpredicate(encp, predrepr=(b'encoding(%r)', enc), cache=True)
Matt Mackall
fileset: add encoding() predicate
r14684
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'eol(style)', weight=_WEIGHT_READ_CONTENTS)
Matt Mackall
filesets: add eol predicate
r18842 def eol(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File contains newlines of the given style (dos, unix, mac). Binary
Matt Mackall
filesets: add eol predicate
r18842 files are excluded, files with mixed line endings match multiple
styles.
"""
Matt Harbison
fileset: fix copy/paste in eol() error message
r28056 # i18n: "eol" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 enc = getstring(x, _(b"eol requires a style name"))
Matt Mackall
filesets: add eol predicate
r18842
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def eolp(fctx):
Matt Harbison
fileset: use filectx.isbinary() to filter out binaries in eol()...
r38433 if fctx.isbinary():
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return False
Matt Harbison
fileset: use filectx.isbinary() to filter out binaries in eol()...
r38433 d = fctx.data()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if (enc == b'dos' or enc == b'win') and b'\r\n' in d:
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return True
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif enc == b'unix' and re.search(b'(?<!\r)\n', d):
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return True
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif enc == b'mac' and re.search(b'\r(?!\n)', d):
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return True
return False
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.fpredicate(eolp, predrepr=(b'eol(%r)', enc), cache=True)
Matt Mackall
filesets: add eol predicate
r18842
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'copied()')
Matt Mackall
fileset: add copied predicate
r14685 def copied(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """File that is recorded as being copied.
Matt Mackall
fileset: add copied predicate
r14685 """
Wagner Bruna
fileset: add i18n hints for keywords
r14785 # i18n: "copied" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"copied takes no arguments"))
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 def copiedp(fctx):
p = fctx.parents()
return p and p[0].path() != fctx.path()
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.fpredicate(copiedp, predrepr=b'copied', cache=True)
Matt Mackall
fileset: add copied predicate
r14685
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'revs(revs, pattern)', weight=_WEIGHT_STATUS)
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 def revs(mctx, x):
Yuya Nishihara
fileset: drop false function signatures from revs() and status() docs...
r31254 """Evaluate set in the specified revisions. If the revset match multiple
revs, this will return file matching pattern in any of the revision.
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 """
# i18n: "revs" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 r, x = getargs(x, 2, 2, _(b"revs takes two arguments"))
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 # i18n: "revs" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 revspec = getstring(r, _(b"first argument to revs must be a revision"))
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 repo = mctx.ctx.repo()
revs = scmutil.revrange(repo, [revspec])
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 matchers = []
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193 for r in revs:
ctx = repo[r]
Yuya Nishihara
fileset: move buildstatus() to matchctx method...
r38914 mc = mctx.switch(ctx.p1(), ctx)
Yuya Nishihara
fileset: pass in basectx to _buildstatus()...
r38912 matchers.append(getmatch(mc, x))
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 if not matchers:
return mctx.never()
if len(matchers) == 1:
return matchers[0]
return matchmod.unionmatcher(matchers)
Pierre-Yves David
fileset: add revs(revs, fileset) to evaluate set in working directory...
r31193
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'status(base, rev, pattern)', weight=_WEIGHT_STATUS)
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195 def status(mctx, x):
Yuya Nishihara
fileset: drop false function signatures from revs() and status() docs...
r31254 """Evaluate predicate using status change between ``base`` and
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195 ``rev``. Examples:
- ``status(3, 7, added())`` - matches files added from "3" to "7"
"""
repo = mctx.ctx.repo()
# i18n: "status" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b, r, x = getargs(x, 3, 3, _(b"status takes three arguments"))
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195 # i18n: "status" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 baseerr = _(b"first argument to status must be a revision")
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195 baserevspec = getstring(b, baseerr)
if not baserevspec:
raise error.ParseError(baseerr)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 reverr = _(b"second argument to status must be a revision")
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195 revspec = getstring(r, reverr)
if not revspec:
raise error.ParseError(reverr)
Martin von Zweigbergk
fileset: use context-returning revpair()...
r37274 basectx, ctx = scmutil.revpair(repo, [baserevspec, revspec])
Yuya Nishihara
fileset: move buildstatus() to matchctx method...
r38914 mc = mctx.switch(basectx, ctx)
Yuya Nishihara
fileset: pass in basectx to _buildstatus()...
r38912 return getmatch(mc, x)
Pierre-Yves David
fileset: add a 'status(...)' predicate to control evaluation context...
r31195
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'subrepo([pattern])')
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 def subrepo(mctx, x):
FUJIWARA Katsunori
fileset: use decorator to mark a function as fileset predicate...
r27460 """Subrepositories whose paths match the given pattern.
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 """
# i18n: "subrepo" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 1, _(b"subrepo takes at most one argument"))
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 ctx = mctx.ctx
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 sstate = ctx.substate
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 if x:
Augie Fackler
formatting: blacken the codebase...
r43346 pat = getpattern(
x,
matchmod.allpatternkinds,
# i18n: "subrepo" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"subrepo requires a pattern or no arguments"),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 fast = not matchmod.patkind(pat)
if fast:
Augie Fackler
formatting: blacken the codebase...
r43346
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 def m(s):
Augie Fackler
formatting: blacken the codebase...
r43346 return s == pat
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 m = matchmod.match(ctx.repo().root, b'', [pat], ctx=ctx)
Augie Fackler
formatting: blacken the codebase...
r43346 return mctx.predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda f: f in sstate and m(f), predrepr=(b'subrepo(%r)', pat)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return mctx.predicate(sstate.__contains__, predrepr=b'subrepo')
Angel Ezquerra
fileset: add "subrepo" fileset symbol...
r16443
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
fileset: basic pattern and boolean support...
r14551 methods = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'withstatus': getmatchwithstatus,
b'string': stringmatch,
b'symbol': stringmatch,
b'kindpat': kindpatmatch,
b'patterns': patternsmatch,
b'and': andmatch,
b'or': ormatch,
b'minus': minusmatch,
b'list': listmatch,
b'not': notmatch,
b'func': func,
Matt Mackall
fileset: basic pattern and boolean support...
r14551 }
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
fileset: basic pattern and boolean support...
r14551 class matchctx(object):
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 def __init__(self, basectx, ctx, cwd, badfn=None):
Yuya Nishihara
fileset: keep basectx by matchctx
r38913 self._basectx = basectx
Matt Mackall
fileset: basic pattern and boolean support...
r14551 self.ctx = ctx
Yuya Nishihara
fileset: pass in badfn to inner matchers...
r38632 self._badfn = badfn
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 self._match = None
Yuya Nishihara
fileset: move buildstatus() to matchctx method...
r38914 self._status = None
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 self.cwd = cwd
Yuya Nishihara
fileset: move buildstatus() to matchctx method...
r38914
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 def narrowed(self, match):
"""Create matchctx for a sub-tree narrowed by the given matcher"""
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 mctx = matchctx(self._basectx, self.ctx, self.cwd, self._badfn)
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 mctx._match = match
# leave wider status which we don't have to care
mctx._status = self._status
return mctx
Yuya Nishihara
fileset: move copy constructor of matchctx near __init__
r38917 def switch(self, basectx, ctx):
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 mctx = matchctx(basectx, ctx, self.cwd, self._badfn)
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 mctx._match = self._match
return mctx
Yuya Nishihara
fileset: move copy constructor of matchctx near __init__
r38917
Yuya Nishihara
fileset: build status according to 'withstatus' hint...
r38916 def withstatus(self, keys):
"""Create matchctx which has precomputed status specified by the keys"""
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 mctx = matchctx(self._basectx, self.ctx, self.cwd, self._badfn)
Yuya Nishihara
fileset: narrow status computation by left-hand-side of 'and' node...
r38918 mctx._match = self._match
Yuya Nishihara
fileset: build status according to 'withstatus' hint...
r38916 mctx._buildstatus(keys)
return mctx
def _buildstatus(self, keys):
Augie Fackler
formatting: blacken the codebase...
r43346 self._status = self._basectx.status(
self.ctx,
self._match,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 listignored=b'ignored' in keys,
listclean=b'clean' in keys,
listunknown=b'unknown' in keys,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
fileset: remove callexisting flag and mctx.existing() (API)...
r38712
Matt Mackall
fileset: add support for file status predicates...
r14677 def status(self):
return self._status
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706
Matt Mackall
fileset: drop matchfn...
r14673 def matcher(self, patterns):
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 return self.ctx.match(patterns, badfn=self._badfn, cwd=self.cwd)
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706
def predicate(self, predfn, predrepr=None, cache=False):
"""Create a matcher to select files by predfn(filename)"""
if cache:
predfn = util.cachefunc(predfn)
Augie Fackler
formatting: blacken the codebase...
r43346 return matchmod.predicatematcher(
predfn, predrepr=predrepr, badfn=self._badfn
)
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706
def fpredicate(self, predfn, predrepr=None, cache=False):
"""Create a matcher to select files by predfn(fctx) at the current
revision
Missing files are ignored.
"""
ctx = self.ctx
if ctx.rev() is None:
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 def fctxpredfn(f):
try:
fctx = ctx[f]
except error.LookupError:
return False
try:
fctx.audit()
except error.Abort:
return False
try:
return predfn(fctx)
except (IOError, OSError) as e:
Yuya Nishihara
fileset: suppress EACCES while reading arbitrary paths via filectx API...
r38781 # open()-ing a directory fails with EACCES on Windows
Augie Fackler
formatting: blacken the codebase...
r43346 if e.errno in (
errno.ENOENT,
errno.EACCES,
errno.ENOTDIR,
errno.EISDIR,
):
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 return False
raise
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 else:
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 def fctxpredfn(f):
try:
fctx = ctx[f]
except error.LookupError:
return False
return predfn(fctx)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706 return self.predicate(fctxpredfn, predrepr=predrepr, cache=cache)
def never(self):
"""Create a matcher to select nothing"""
Martin von Zweigbergk
match: delete unused root and cwd arguments from {always,never,exact}() (API)...
r41825 return matchmod.never(badfn=self._badfn)
Yuya Nishihara
fileset: add helpers to make predicatematcher and nevermatcher...
r38706
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 def match(ctx, cwd, expr, badfn=None):
Yuya Nishihara
fileset: restrict getfileset() to not return a computed set (API)...
r38631 """Create a matcher for a single fileset expression"""
Yuya Nishihara
fileset: extract language processing part to new module (API)...
r38841 tree = filesetlang.parse(expr)
Yuya Nishihara
fileset: add phase to transform parsed tree...
r38862 tree = filesetlang.analyze(tree)
Yuya Nishihara
fileset: add stub for weight-based optimization...
r38865 tree = filesetlang.optimize(tree)
Matt Harbison
match: resolve filesets against the passed `cwd`, not the current one...
r44461 mctx = matchctx(ctx.p1(), ctx, cwd, badfn=badfn)
Yuya Nishihara
fileset: rewrite predicates to return matcher not closed to subset (API) (BC)...
r38711 return getmatch(mctx, tree)
Matt Mackall
fileset: prescan parse tree to optimize status usage...
r14678
Matt Mackall
fileset: add some function help text
r14681
FUJIWARA Katsunori
registrar: add filesetpredicate to mark a function as fileset predicate...
r28447 def loadpredicate(ui, extname, registrarobj):
"""Load fileset predicates from specified registrarobj
"""
Gregory Szorc
py3: finish porting iteritems() to pycompat and remove source transformer...
r43376 for name, func in pycompat.iteritems(registrarobj._table):
FUJIWARA Katsunori
registrar: add filesetpredicate to mark a function as fileset predicate...
r28447 symbols[name] = func
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
fileset: add some function help text
r14681 # tell hggettext to extract docstrings from these functions:
i18nfunctions = symbols.values()