##// END OF EJS Templates
heptapod-ci: make Windows jobs manual again...
heptapod-ci: make Windows jobs manual again The dance continues, we make the Windows tests optional once again since we don't have Windows runners available anymore. We're working on getting new ones in a more stable fashion, hopefully soon. Differential Revision: https://phab.mercurial-scm.org/D11957

File last commit:

r48230:7a430116 default
r49354:b52cf506 stable
Show More
revset.py
2817 lines | 87.3 KiB | text/x-python | PythonLexer
Matt Mackall
revset: introduce revset core
r11275 # revset.py - revision set queries for mercurial
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2010 Olivia Mackall <olivia@selenic.com>
Matt Mackall
revset: introduce revset core
r11275 #
# 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
revset: use absolute_import
r25971 from __future__ import absolute_import
import re
from .i18n import _
Gregory Szorc
py3: manually import getattr where it is needed...
r43359 from .pycompat import getattr
Joerg Sonnenberger
node: import symbols explicitly...
r46729 from .node import (
bin,
nullrev,
wdirrev,
)
Gregory Szorc
revset: use absolute_import
r25971 from . import (
Yuya Nishihara
dagop: split module hosting DAG-related algorithms from revset...
r32903 dagop,
Pierre-Yves David
revset: reintroduce and experimental revset for update destination...
r26713 destutil,
Yuya Nishihara
diffutil: move the module out of utils package...
r38607 diffutil,
Gregory Szorc
revset: use absolute_import
r25971 encoding,
error,
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317 grep as grepmod,
Gregory Szorc
revset: use absolute_import
r25971 hbisect,
match as matchmod,
obsolete as obsmod,
Jun Wu
revset: define successors revset...
r33377 obsutil,
Gregory Szorc
revset: use absolute_import
r25971 pathutil,
phases,
Pulkit Goyal
py3: handle keyword arguments correctly in revset.py...
r35368 pycompat,
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 registrar,
Gregory Szorc
revset: use absolute_import
r25971 repoview,
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 revsetlang,
Yuya Nishihara
revset: add support for integer and hex wdir identifiers...
r32659 scmutil,
Yuya Nishihara
smartset: move set classes and related functions from revset module (API)...
r30881 smartset,
Boris Feld
stack: follow-up on the stack revset...
r37407 stack as stackmod,
Gregory Szorc
revset: use absolute_import
r25971 util,
)
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 from .utils import (
dateutil,
stringutil,
urlutil: extract `parseurl` from `hg` into the new module...
r47670 urlutil,
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 )
Matt Mackall
revset: introduce revset core
r11275
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 # helpers for processing parsed tree
getsymbol = revsetlang.getsymbol
getstring = revsetlang.getstring
getinteger = revsetlang.getinteger
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 getboolean = revsetlang.getboolean
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 getlist = revsetlang.getlist
Yuya Nishihara
revset: extract a helper to parse integer range...
r41702 getintrange = revsetlang.getintrange
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 getargs = revsetlang.getargs
getargsdict = revsetlang.getargsdict
Yuya Nishihara
smartset: move set classes and related functions from revset module (API)...
r30881 baseset = smartset.baseset
generatorset = smartset.generatorset
spanset = smartset.spanset
fullreposet = smartset.fullreposet
Yuya Nishihara
revset: extract private constant of {nullrev, wdirrev} set...
r42448 # revisions not included in all(), but populated if specified
Joerg Sonnenberger
node: import symbols explicitly...
r46729 _virtualrevs = (nullrev, wdirrev)
Yuya Nishihara
revset: extract private constant of {nullrev, wdirrev} set...
r42448
Yuya Nishihara
revset: move order constants from revsetlang...
r34018 # Constants for ordering requirement, used in getset():
#
# If 'define', any nested functions and operations MAY change the ordering of
# the entries in the set (but if changes the ordering, it MUST ALWAYS change
# it). If 'follow', any nested functions and operations MUST take the ordering
# specified by the first operand to the '&' operator.
#
# For instance,
#
# X & (Y | Z)
# ^ ^^^^^^^
# | follow
# define
#
# will be evaluated as 'or(y(x()), z(x()))', where 'x()' can change the order
# of the entries in the set, but 'y()', 'z()' and 'or()' shouldn't.
#
# 'any' means the order doesn't matter. For instance,
#
Yuya Nishihara
revset: fix example describing how ordering is determined...
r34019 # (X & !Y) | ancestors(Z)
# ^ ^
# any any
Yuya Nishihara
revset: move order constants from revsetlang...
r34018 #
Yuya Nishihara
revset: fix example describing how ordering is determined...
r34019 # For 'X & !Y', 'X' decides the order and 'Y' is subtracted from 'X', so the
# order of 'Y' does not matter. For 'ancestors(Z)', Z's order does not matter
# since 'ancestors' does not care about the order of its argument.
Yuya Nishihara
revset: move order constants from revsetlang...
r34018 #
# Currently, most revsets do not care about the order, so 'define' is
# equivalent to 'follow' for them, and the resulting order is based on the
# 'subset' parameter passed down to them:
#
Yuya Nishihara
revset: move order argument to run-time match function...
r34020 # m = revset.match(...)
# m(repo, subset, order=defineorder)
Yuya Nishihara
revset: move order constants from revsetlang...
r34018 # ^^^^^^
# For most revsets, 'define' means using the order this subset provides
#
# There are a few revsets that always redefine the order if 'define' is
# specified: 'sort(X)', 'reverse(X)', 'x:y'.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 anyorder = b'any' # don't care the order, could be even random-shuffled
defineorder = b'define' # ALWAYS redefine, or ALWAYS follow the current order
followorder = b'follow' # MUST follow the current order
Yuya Nishihara
revset: move order constants from revsetlang...
r34018
Matt Mackall
revset: introduce revset core
r11275 # helpers
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: remove order information from tree (API)...
r34013 def getset(repo, subset, x, order=defineorder):
Matt Mackall
revset: introduce revset core
r11275 if not x:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"missing argument"))
Jun Wu
revset: remove order information from tree (API)...
r34013 return methods[x[0]](repo, subset, *x[1:], order=order)
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
revset: add a utility for obtaining the source of a given rev...
r17003 def _getrevsource(repo, r):
extra = repo[r].extra()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for label in (b'source', b'transplant_source', b'rebase_source'):
Matt Harbison
revset: add a utility for obtaining the source of a given rev...
r17003 if label in extra:
try:
return repo[extra[label]].rev()
except error.RepoLookupError:
pass
return None
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
py3: drop b'' from repr() of smartset...
r35922 def _sortedb(xs):
Yuya Nishihara
pycompat: move rapply() from util...
r38594 return sorted(pycompat.rapply(pycompat.maybebytestr, xs))
Yuya Nishihara
py3: drop b'' from repr() of smartset...
r35922
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
revset: introduce revset core
r11275 # operator methods
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: remove order information from tree (API)...
r34013 def stringset(repo, subset, x, order):
Martin von Zweigbergk
revset: drop support for '' as alias for '.'...
r37281 if not x:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"empty string is not a valid revision"))
Martin von Zweigbergk
scmutil: add method for looking up a context given a revision symbol...
r37289 x = scmutil.intrev(scmutil.revsymbol(repo, x))
Yuya Nishihara
revset: populate wdir() by its hash or revision number...
r42449 if x in subset or x in _virtualrevs and isinstance(subset, fullreposet):
Lucas Moscovicz
revset: added baseset class (still empty) to improve revset performance...
r20364 return baseset([x])
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Boris Feld
revset: introduce an API that avoids `formatspec` input serialization...
r41258 def rawsmartset(repo, subset, x, order):
"""argument is already a smartset, use that directly"""
if order == followorder:
return subset & x
else:
return x & subset
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def rangeset(repo, subset, x, y, order):
Pierre-Yves David
revset-rangeset: call 'getset' on a 'fullreposet'...
r23162 m = getset(repo, fullreposet(repo), x)
n = getset(repo, fullreposet(repo), y)
Matt Mackall
revset: deal with empty sets in range endpoints...
r11456
if not m or not n:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Yuya Nishihara
revset: extract function that creates range set from computed revisions...
r30043 return _makerangeset(repo, subset, m.first(), n.last(), order)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: do not transform range* operators in parsed tree...
r30803 def rangeall(repo, subset, x, order):
assert x is None
Boris Feld
revset: use 'tiprev' when appropriate...
r35691 return _makerangeset(repo, subset, 0, repo.changelog.tiprev(), order)
Yuya Nishihara
revset: do not transform range* operators in parsed tree...
r30803
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: do not rewrite ':y' to '0:y' (issue5385)...
r30044 def rangepre(repo, subset, y, order):
# ':y' can't be rewritten to '0:y' since '0' may be hidden
n = getset(repo, fullreposet(repo), y)
if not n:
return baseset()
return _makerangeset(repo, subset, 0, n.last(), order)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: do not transform range* operators in parsed tree...
r30803 def rangepost(repo, subset, x, order):
m = getset(repo, fullreposet(repo), x)
if not m:
return baseset()
Augie Fackler
formatting: blacken the codebase...
r43346 return _makerangeset(
repo, subset, m.first(), repo.changelog.tiprev(), order
)
Yuya Nishihara
revset: do not transform range* operators in parsed tree...
r30803
Yuya Nishihara
revset: extract function that creates range set from computed revisions...
r30043 def _makerangeset(repo, subset, m, n, order):
Yuya Nishihara
revset: work around x:y range where x or y is wdir()...
r25766 if m == n:
r = baseset([m])
Joerg Sonnenberger
node: import symbols explicitly...
r46729 elif n == wdirrev:
Yuya Nishihara
revset: work around x:y range where x or y is wdir()...
r25766 r = spanset(repo, m, len(repo)) + baseset([n])
Joerg Sonnenberger
node: import symbols explicitly...
r46729 elif m == wdirrev:
Boris Feld
revset: use 'tiprev' when appropriate...
r35691 r = baseset([m]) + spanset(repo, repo.changelog.tiprev(), n - 1)
Yuya Nishihara
revset: work around x:y range where x or y is wdir()...
r25766 elif m < n:
Lucas Moscovicz
revset: changed revsets to use spanset...
r20526 r = spanset(repo, m, n + 1)
Matt Mackall
revset: deal with empty sets in range endpoints...
r11456 else:
Lucas Moscovicz
revset: changed revsets to use spanset...
r20526 r = spanset(repo, m, n - 1)
Yuya Nishihara
revset: fix order of nested 'range' expression (BC)...
r29944
if order == defineorder:
return r & subset
else:
# carrying the sorting over when possible would be more efficient
return subset & r
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def dagrange(repo, subset, x, y, order):
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 r = fullreposet(repo)
Augie Fackler
formatting: blacken the codebase...
r43346 xs = dagop.reachableroots(
repo, getset(repo, r, x), getset(repo, r, y), includepath=True
)
Yuya Nishihara
revset: make dagrange preserve order of input set...
r29139 return subset & xs
Bryan O'Sullivan
revset: turn dagrange into a function
r16860
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def andset(repo, subset, x, y, order):
Jun Wu
revset: remove order information from tree (API)...
r34013 if order == anyorder:
yorder = anyorder
else:
yorder = followorder
return getset(repo, getset(repo, subset, x, order), y, yorder)
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: do not flip "and" arguments when optimizing...
r34022 def andsmallyset(repo, subset, x, y, order):
# 'andsmally(x, y)' is equivalent to 'and(x, y)', but faster when y is small
Jun Wu
revset: remove order information from tree (API)...
r34013 if order == anyorder:
yorder = anyorder
else:
yorder = followorder
return getset(repo, getset(repo, subset, y, yorder), x, order)
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def differenceset(repo, subset, x, y, order):
Jun Wu
revset: remove order information from tree (API)...
r34013 return getset(repo, subset, x, order) - getset(repo, subset, y, anyorder)
Durham Goode
revset: use smartset minus operator...
r28217
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: remove order information from tree (API)...
r34013 def _orsetlist(repo, subset, xs, order):
Yuya Nishihara
revset: make balanced addsets by orset() without using _combinesets()...
r25929 assert xs
if len(xs) == 1:
Jun Wu
revset: remove order information from tree (API)...
r34013 return getset(repo, subset, xs[0], order)
Yuya Nishihara
revset: make balanced addsets by orset() without using _combinesets()...
r25929 p = len(xs) // 2
Jun Wu
revset: remove order information from tree (API)...
r34013 a = _orsetlist(repo, subset, xs[:p], order)
b = _orsetlist(repo, subset, xs[p:], order)
Yuya Nishihara
revset: make balanced addsets by orset() without using _combinesets()...
r25929 return a + b
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def orset(repo, subset, x, order):
Yuya Nishihara
revset: fix order of nested 'or' expression (BC)...
r29934 xs = getlist(x)
Yuya Nishihara
revset: leverage orset() to flatten ancestor() arguments...
r38508 if not xs:
return baseset()
Yuya Nishihara
revset: fix order of nested 'or' expression (BC)...
r29934 if order == followorder:
# slow path to take the subset order
Jun Wu
revset: remove order information from tree (API)...
r34013 return subset & _orsetlist(repo, fullreposet(repo), xs, anyorder)
Yuya Nishihara
revset: fix order of nested 'or' expression (BC)...
r29934 else:
Jun Wu
revset: remove order information from tree (API)...
r34013 return _orsetlist(repo, subset, xs, order)
Yuya Nishihara
revset: wrap arguments of 'or' by 'list' node...
r29929
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def notset(repo, subset, x, order):
Jun Wu
revset: remove order information from tree (API)...
r34013 return subset - getset(repo, subset, x, anyorder)
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416 def relationset(repo, subset, x, y, order):
av6
revset: implement a simple 'foo#generations' expression...
r45204 # this is pretty basic implementation of 'x#y' operator, still
# experimental so undocumented. see the wiki for further ideas.
# https://www.mercurial-scm.org/wiki/RevsetOperatorPlan
rel = getsymbol(y)
if rel in relations:
return relations[rel](repo, subset, x, rel, order)
relnames = [r for r in relations.keys() if len(r) > 1]
raise error.UnknownIdentifier(rel, relnames)
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416
Augie Fackler
formatting: blacken the codebase...
r43346
av6
revset: support ranges in #generations relation
r41395 def _splitrange(a, b):
"""Split range with bounds a and b into two ranges at 0 and return two
tuples of numbers for use as startdepth and stopdepth arguments of
revancestors and revdescendants.
>>> _splitrange(-10, -5) # [-10:-5]
((5, 11), (None, None))
>>> _splitrange(5, 10) # [5:10]
((None, None), (5, 11))
>>> _splitrange(-10, 10) # [-10:10]
((0, 11), (0, 11))
>>> _splitrange(-10, 0) # [-10:0]
((0, 11), (None, None))
>>> _splitrange(0, 10) # [0:10]
((None, None), (0, 11))
>>> _splitrange(0, 0) # [0:0]
((0, 1), (None, None))
>>> _splitrange(1, -1) # [1:-1]
((None, None), (None, None))
"""
ancdepths = (None, None)
descdepths = (None, None)
if a == b == 0:
ancdepths = (0, 1)
if a < 0:
ancdepths = (-min(b, 0), -a + 1)
if b > 0:
descdepths = (max(a, 0), b + 1)
return ancdepths, descdepths
Augie Fackler
formatting: blacken the codebase...
r43346
av6
revset: implement a simple 'foo#generations' expression...
r45204 def generationsrel(repo, subset, x, rel, order):
z = (b'rangeall', None)
return generationssubrel(repo, subset, x, rel, z, order)
av6
revset: rename generationsrel() to generationssubrel()...
r45203 def generationssubrel(repo, subset, x, rel, z, order):
av6
revset: support ranges in #generations relation
r41395 # TODO: rewrite tests, and drop startdepth argument from ancestors() and
# descendants() predicates
Augie Fackler
formatting: blacken the codebase...
r43346 a, b = getintrange(
z,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'relation subscript must be an integer or a range'),
_(b'relation subscript bounds must be integers'),
Augie Fackler
formatting: blacken the codebase...
r43346 deffirst=-(dagop.maxlogdepth - 1),
deflast=+(dagop.maxlogdepth - 1),
)
av6
revset: support ranges in #generations relation
r41395 (ancstart, ancstop), (descstart, descstop) = _splitrange(a, b)
if ancstart is None and descstart is None:
return baseset()
revs = getset(repo, fullreposet(repo), x)
if not revs:
return baseset()
if ancstart is not None and descstart is not None:
s = dagop.revancestors(repo, revs, False, ancstart, ancstop)
s += dagop.revdescendants(repo, revs, False, descstart, descstop)
elif ancstart is not None:
s = dagop.revancestors(repo, revs, False, ancstart, ancstop)
elif descstart is not None:
s = dagop.revdescendants(repo, revs, False, descstart, descstop)
return subset & s
av6
revset: move subscript relation functions to its own dict...
r40967
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416 def relsubscriptset(repo, subset, x, y, z, order):
Yuya Nishihara
revset: add experimental ancestors/descendants relation subscript...
r33417 # this is pretty basic implementation of 'x#y[z]' operator, still
# experimental so undocumented. see the wiki for further ideas.
# https://www.mercurial-scm.org/wiki/RevsetOperatorPlan
rel = getsymbol(y)
av6
revset: move subscript relation functions to its own dict...
r40967 if rel in subscriptrelations:
Yuya Nishihara
revset: leverage getintrange() helper in relation-subscript operation (API)...
r41704 return subscriptrelations[rel](repo, subset, x, rel, z, order)
Yuya Nishihara
revset: add experimental ancestors/descendants relation subscript...
r33417
av6
revset: move subscript relation functions to its own dict...
r40967 relnames = [r for r in subscriptrelations.keys() if len(r) > 1]
raise error.UnknownIdentifier(rel, relnames)
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416 def subscriptset(repo, subset, x, y, order):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"can't use a subscript in this context"))
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: remove order information from tree (API)...
r34013 def listset(repo, subset, *xs, **opts):
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 "revsets.x or y"\''),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Mackall
revset: introduce revset core
r11275
Jun Wu
revset: remove order information from tree (API)...
r34013 def keyvaluepair(repo, subset, k, v, order):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"can't use a key-value pair in this context"))
Yuya Nishihara
revset: add parsing rule for key=value pair...
r25704
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def func(repo, subset, a, b, order):
Yuya Nishihara
revset: check invalid function syntax "func-name"() explicitly...
r29441 f = getsymbol(a)
if f in symbols:
Augie Fackler
revset: avoid shadowing a variable with a list comprehension
r30392 func = symbols[f]
if getattr(func, '_takeorder', False):
return func(repo, subset, b, order)
return func(repo, subset, b)
Matt Harbison
revset: don't suggest private or undocumented queries...
r25632
keep = lambda fn: getattr(fn, '__doc__', None) is not None
syms = [s for (s, fn) in symbols.items() if keep(fn)]
Yuya Nishihara
revset: check invalid function syntax "func-name"() explicitly...
r29441 raise error.UnknownIdentifier(f, syms)
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
revset: introduce revset core
r11275 # functions
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 # symbols are callables like:
# fn(repo, subset, x)
# with:
# repo - current repository instance
# subset - of revisions to be examined
# x - argument in tree form
Jun Wu
revset: move weight information to predicate...
r34274 symbols = revsetlang.symbols
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584
FUJIWARA Katsunori
revset: use decorator to mark a predicate as safe...
r27587 # symbols which can't be used for a DoS attack for any given input
# (e.g. those which accept regexes as plain strings shouldn't be included)
# functions that just return a lot of changesets (like all) don't count here
safesymbols = set()
FUJIWARA Katsunori
revset: replace predicate by revsetpredicate of registrar...
r28395 predicate = registrar.revsetpredicate()
FUJIWARA Katsunori
revset: use decorator to mark a predicate as safe...
r27587
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_destupdate')
Pierre-Yves David
revset: reintroduce and experimental revset for update destination...
r26713 def _destupdate(repo, subset, x):
# experimental revset for update destination
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'limit', b'clean')
Augie Fackler
formatting: blacken the codebase...
r43346 return subset & baseset(
[destutil.destupdate(repo, **pycompat.strkwargs(args))[0]]
)
Pierre-Yves David
revset: reintroduce and experimental revset for update destination...
r26713
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_destmerge')
Pierre-Yves David
revset: rename and test '_destmerge'...
r26716 def _destmerge(repo, subset, x):
# experimental revset for merge destination
Pierre-Yves David
destutil: allow to specify an explicit source for the merge...
r28139 sourceset = None
if x is not None:
sourceset = getset(repo, fullreposet(repo), x)
return subset & baseset([destutil.destmerge(repo, sourceset=sourceset)])
Pierre-Yves David
merge: move default destination computation in a revset...
r26303
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'adds(pattern)', safe=True, weight=30)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def adds(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets that add a file matching pattern.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
The pattern without explicit kind like ``glob:`` is expected to be
relative to the current directory and match against a file or a
directory.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "adds" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"adds requires a pattern"))
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 return checkstatus(repo, subset, pat, 'added')
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'ancestor(*changeset)', safe=True, weight=0.5)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def ancestor(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """A greatest common ancestor of the changesets.
Paul Cavallaro
revset: change ancestor to accept 0 or more arguments (issue3750)...
r18536
Accepts 0 or more changesets.
Will return empty list when passed no args.
Greatest common ancestor of a single changeset is that changeset.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
Yuya Nishihara
revset: move lookup of first ancestor() candidate out of the loop
r38509 reviter = iter(orset(repo, fullreposet(repo), x, order=anyorder))
try:
anc = repo[next(reviter)]
except StopIteration:
return baseset()
for r in reviter:
anc = anc.ancestor(repo[r])
Mads Kiilerich
revlog: use context ancestor instead of changelog ancestor...
r20991
Yuya Nishihara
revset: add partial support for ancestor(wdir())...
r38541 r = scmutil.intrev(anc)
if r in subset:
return baseset([r])
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
def _ancestors(
repo, subset, x, followfirst=False, startdepth=None, stopdepth=None
):
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 heads = getset(repo, fullreposet(repo), x)
Mads Kiilerich
revset: better naming of variables containing the value of a single argument...
r22944 if not heads:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Yuya Nishihara
revset: add startdepth limit to ancestors() as internal option...
r33003 s = dagop.revancestors(repo, heads, followfirst, startdepth, stopdepth)
Pierre-Yves David
revset-_ancestor: use & instead of filter...
r23003 return subset & s
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'ancestors(set[, depth])', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def ancestors(repo, subset, x):
Yuya Nishihara
help: clarify ancestors() and descendants() include given set (issue5594)...
r32905 """Changesets that are ancestors of changesets in set, including the
given changesets themselves.
Yuya Nishihara
revset: add depth limit to ancestors()...
r33002
If depth is specified, the result only includes changesets up to
the specified generation.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
Yuya Nishihara
revset: add startdepth limit to ancestors() as internal option...
r33003 # startdepth is for internal use only until we can decide the UI
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'ancestors', b'set depth startdepth')
if b'set' not in args:
Yuya Nishihara
revset: add support of keyword arguments to ancestors() and descendants()...
r32914 # i18n: "ancestors" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'ancestors takes at least 1 argument'))
Yuya Nishihara
revset: add startdepth limit to ancestors() as internal option...
r33003 startdepth = stopdepth = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'startdepth' in args:
Augie Fackler
formatting: blacken the codebase...
r43346 n = getinteger(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'startdepth'], b"ancestors expects an integer startdepth"
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: add startdepth limit to ancestors() as internal option...
r33003 if n < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(b"negative startdepth")
Yuya Nishihara
revset: add startdepth limit to ancestors() as internal option...
r33003 startdepth = n
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'depth' in args:
Yuya Nishihara
revset: add depth limit to ancestors()...
r33002 # i18n: "ancestors" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 n = getinteger(args[b'depth'], _(b"ancestors expects an integer depth"))
Yuya Nishihara
revset: add depth limit to ancestors()...
r33002 if n < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"negative depth"))
Yuya Nishihara
revset: add depth limit to ancestors()...
r33002 stopdepth = n + 1
Augie Fackler
formatting: blacken the codebase...
r43346 return _ancestors(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo, subset, args[b'set'], startdepth=startdepth, stopdepth=stopdepth
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_firstancestors', safe=True)
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409 def _firstancestors(repo, subset, x):
# ``_firstancestors(set)``
# Like ``ancestors(set)`` but follows only the first parents.
return _ancestors(repo, subset, x, followfirst=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
David Soria Parra
revset: lookup descendents for negative arguments to ancestor operator...
r32699 def _childrenspec(repo, subset, x, n, order):
"""Changesets that are the Nth child of a changeset
in set.
"""
cs = set()
for r in getset(repo, fullreposet(repo), x):
for i in range(n):
c = repo[r].children()
if len(c) == 0:
break
if len(c) > 1:
raise error.RepoLookupError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"revision in set has more than one child")
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: fix negative ancestor spec to not return changectx objects...
r32885 r = c[0].rev()
David Soria Parra
revset: lookup descendents for negative arguments to ancestor operator...
r32699 else:
cs.add(r)
return subset & cs
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def ancestorspec(repo, subset, x, n, order):
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 """``set~n``
Brodie Rao
cleanup: eradicate long lines
r16683 Changesets that are the Nth ancestor (first parents only) of a changeset
in set.
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 n = getinteger(n, _(b"~ expects a number"))
David Soria Parra
revset: lookup descendents for negative arguments to ancestor operator...
r32699 if n < 0:
# children lookup
return _childrenspec(repo, subset, x, -n, order)
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 ps = set()
cl = repo.changelog
Pierre-Yves David
revset-ancestorspec: call 'getset' on a 'fullreposet'...
r23163 for r in getset(repo, fullreposet(repo), x):
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 for i in range(n):
Pulkit Goyal
revset: add support for using ~ operator on wdir() predicate...
r32441 try:
r = cl.parentrevs(r)[0]
except error.WdirUnsupported:
Martin von Zweigbergk
cleanup: use p1() and p2() instead of parents()[0] and parents()[1]...
r41442 r = repo[r].p1().rev()
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 ps.add(r)
Pierre-Yves David
revset: use `subset &` in `ancestorspec`...
r22531 return subset & ps
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'author(string)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def author(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Alias for ``user(string)``."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "author" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 n = getstring(x, _(b"author requires a string"))
Matt Harbison
revset: stop lowercasing the regex pattern for 'author'...
r30782 kind, pattern, matcher = _substringmatcher(n, casesensitive=False)
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda x: matcher(repo[x].user()), condrepr=(b'<user %r>', n)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'bisect(string)', safe=True)
"Yann E. MORIN"
revset: rename bisected() to bisect()...
r15134 def bisect(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets marked in the specified bisect status:
"Yann E. MORIN"
revset.bisect: add new 'range' set to the bisect keyword...
r15136
"Yann E. MORIN"
hbisect: add two new revset descriptions: 'goods' and 'bads'...
r15153 - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
Mads Kiilerich
fix trivial spelling errors
r17424 - ``goods``, ``bads`` : csets topologically good/bad
"Yann E. MORIN"
hbisect: add two new revset descriptions: 'goods' and 'bads'...
r15153 - ``range`` : csets taking part in the bisection
- ``pruned`` : csets that are goods, bads or skipped
- ``untested`` : csets whose fate is yet unknown
- ``ignored`` : csets ignored due to DAG topology
Bryan O'Sullivan
bisect: track the current changeset (issue3382)...
r16647 - ``current`` : the cset currently being bisected
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "bisect" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 status = getstring(x, _(b"bisect requires a string")).lower()
Bryan O'Sullivan
revset: fix O(n**2) behaviour of bisect() (issue3381)
r16467 state = set(hbisect.get(repo, status))
Pierre-Yves David
revset: use `subset &` in `bisect`...
r22532 return subset & state
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
"Yann E. MORIN"
revset: rename bisected() to bisect()...
r15134 # Backward-compatibility
# - no help entry so that we do not advertise it any more
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'bisected', safe=True)
"Yann E. MORIN"
revset: rename bisected() to bisect()...
r15134 def bisected(repo, subset, x):
return bisect(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'bookmark([name])', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def bookmark(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """The named bookmark or all bookmarks.
Simon King
revset: add pattern matching to 'bookmarks' revset expression
r16822
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 Pattern matching is supported for `name`. See :hg:`help revisions.patterns`.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "bookmark" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 0, 1, _(b'bookmark takes one or no arguments'))
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 if args:
Augie Fackler
formatting: blacken the codebase...
r43346 bm = getstring(
args[0],
# i18n: "bookmark" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'the argument to bookmark must be a string'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, pattern, matcher = stringutil.stringmatcher(bm)
Pierre-Yves David
revset: unify code flow in `bookmark`...
r22499 bms = set()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'literal':
Yuya Nishihara
revset: expand bookmark(.) to the active bookmark...
r39339 if bm == pattern:
pattern = repo._bookmarks.expandname(pattern)
Michael O'Connor
revset: bookmark revset interprets 'literal:' prefix correctly (issue4329)
r22105 bmrev = repo._bookmarks.get(pattern, None)
Simon King
revset: add pattern matching to 'bookmarks' revset expression
r16822 if not bmrev:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.RepoLookupError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"bookmark '%s' does not exist") % pattern
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
revset: unify code flow in `bookmark`...
r22499 bms.add(repo[bmrev].rev())
Simon King
revset: add pattern matching to 'bookmarks' revset expression
r16822 else:
matchrevs = set()
Gregory Szorc
py3: finish porting iteritems() to pycompat and remove source transformer...
r43376 for name, bmrev in pycompat.iteritems(repo._bookmarks):
Simon King
revset: add pattern matching to 'bookmarks' revset expression
r16822 if matcher(name):
matchrevs.add(bmrev)
for bmrev in matchrevs:
Pierre-Yves David
revset: unify code flow in `bookmark`...
r22499 bms.add(repo[bmrev].rev())
else:
Martin von Zweigbergk
cleanup: use set literals...
r32291 bms = {repo[r].rev() for r in repo._bookmarks.values()}
Joerg Sonnenberger
node: import symbols explicitly...
r46729 bms -= {nullrev}
Pierre-Yves David
revset: use `subset &` in `bookmark`...
r22530 return subset & bms
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'branch(string or set)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def branch(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 All changesets belonging to the given branch or the branches of the given
changesets.
Simon King
revset: add pattern matching to 'branch' revset expression
r16821
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `string`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
Durham Goode
revbranchcache: store repo on the object...
r24374 getbi = repo.revbranchcache().branchinfo
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add support for branch(wdir()) and wdir() & branch()
r32683 def getbranch(r):
try:
return getbi(r)[0]
except error.WdirUnsupported:
return repo[r].branch()
Mads Kiilerich
revset: use localrepo revbranchcache for branch name filtering...
r23787
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 try:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b = getstring(x, b'')
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 except error.ParseError:
# not a string, but another revspec, e.g. tip()
pass
Simon King
revset: add pattern matching to 'branch' revset expression
r16821 else:
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, pattern, matcher = stringutil.stringmatcher(b)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'literal':
Simon King
revset: add pattern matching to 'branch' revset expression
r16821 # note: falls through to the revspec case if no branch with
Yuya Nishihara
revset: do not fall through to revspec for literal: branch (issue4838)...
r26537 # this name exists and pattern kind is not specified explicitly
Pulkit Goyal
branchcache: introduce hasbranch()...
r42171 if repo.branchmap().hasbranch(pattern):
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: matcher(getbranch(r)),
condrepr=(b'<branch %r>', b),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b.startswith(b'literal:'):
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.RepoLookupError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"branch '%s' does not exist") % pattern
Augie Fackler
formatting: blacken the codebase...
r43346 )
Simon King
revset: add pattern matching to 'branch' revset expression
r16821 else:
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: matcher(getbranch(r)), condrepr=(b'<branch %r>', b)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 s = getset(repo, fullreposet(repo), x)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 b = set()
for r in s:
Yuya Nishihara
revset: add support for branch(wdir()) and wdir() & branch()
r32683 b.add(getbranch(r))
Pierre-Yves David
revset-branch: remove usage of `set()`...
r22867 c = s.__contains__
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
lambda r: c(r) or getbranch(r) in b,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 condrepr=lambda: b'<branch %r>' % _sortedb(b),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'phasedivergent()', safe=True)
Boris Feld
revset: rename bumped into phasedivergent...
r33771 def phasedivergent(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Mutable changesets marked as successors of public changesets.
Pierre-Yves David
revset: add a bumped revset...
r17829
Boris Feld
revset: rename bumped into phasedivergent...
r33771 Only non-public and non-obsolete changesets can be `phasedivergent`.
Boris Feld
revset: mark evolution-related revsets as experimental...
r33855 (EXPERIMENTAL)
Pierre-Yves David
revset: add a bumped revset...
r17829 """
Boris Feld
revset: rename bumped into phasedivergent...
r33771 # i18n: "phasedivergent" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"phasedivergent takes no arguments"))
phasedivergent = obsmod.getrevs(repo, b'phasedivergent')
Boris Feld
obsolete: rename bumped volatile set into phasedivergent volatile set...
r33774 return subset & phasedivergent
Pierre-Yves David
revset: add a bumped revset...
r17829
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'bundle()', safe=True)
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913 def bundle(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets in the bundle.
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913
Bundle must be specified by the -R option."""
try:
Mads Kiilerich
bundlerepo: improve performance for bundle() revset expression...
r18411 bundlerevs = repo.changelog.bundlerevs
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913 except AttributeError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"no bundle provided - specify with -R"))
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & bundlerevs
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def checkstatus(repo, subset, pat, field):
Jordi Gutiérrez Hermoso
revset: short docstring for checkstatus...
r42273 """Helper for status-related revsets (adds, removes, modifies).
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 The field parameter says which kind is desired.
Jordi Gutiérrez Hermoso
revset: short docstring for checkstatus...
r42273 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hasset = matchmod.patkind(pat) == b'set'
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457
Martin von Zweigbergk
revset: don't recreate matcher for every revision...
r23115 mcache = [None]
Augie Fackler
formatting: blacken the codebase...
r43346
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457 def matches(x):
c = repo[x]
Martin von Zweigbergk
revset: don't recreate matcher for every revision...
r23115 if not mcache[0] or hasset:
mcache[0] = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
m = mcache[0]
fname = None
Matt Harbison
revset: add an assertion to help pytype...
r44119
assert m is not None # help pytype
Martin von Zweigbergk
revset: don't recreate matcher for every revision...
r23115 if not m.anypats() and len(m.files()) == 1:
fname = m.files()[0]
Patrick Mezard
revset: fix adds/modifies/removes and patterns (issue3403)...
r16521 if fname is not None:
if fname not in c.files():
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457 return False
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 else:
Martin von Zweigbergk
revset: simplify checkstatus() by using any()...
r43989 if not any(m(f) for f in c.files()):
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457 return False
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 files = getattr(repo.status(c.p1().node(), c.node()), field)
Patrick Mezard
revset: fix adds/modifies/removes and patterns (issue3403)...
r16521 if fname is not None:
if fname in files:
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457 return True
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 else:
Martin von Zweigbergk
revset: simplify checkstatus() by using any()...
r43989 if any(m(f) for f in files):
return True
Lucas Moscovicz
revset: added lazyset implementation to checkstatus...
r20457
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 return subset.filter(
matches, condrepr=(b'<status.%s %r>', pycompat.sysbytes(field), pat)
)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
revsets: passing a set to baseset() is not wrong...
r29406 def _children(repo, subset, parentset):
Pierre-Yves David
revset: gratuitous code move in '_children'...
r25550 if not parentset:
return baseset()
Matt Mackall
revset: optimize roots and children
r15899 cs = set()
pr = repo.changelog.parentrevs
Pierre-Yves David
revset: use parentsets.min in _children...
r25567 minrev = parentset.min()
Martin von Zweigbergk
revsets: passing a set to baseset() is not wrong...
r29406 for r in subset:
Siddharth Agarwal
revset.children: ignore rev numbers that are too low...
r18063 if r <= minrev:
continue
Yuya Nishihara
revset: make children() not look at p2 if null (issue5439)...
r30699 p1, p2 = pr(r)
if p1 in parentset:
cs.add(r)
if p2 != nullrev and p2 in parentset:
cs.add(r)
Matt Mackall
revsets: backout d04aac468bf4 due to performance regressions
r20709 return baseset(cs)
Matt Mackall
revset: optimize roots and children
r15899
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'children(set)', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def children(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Child changesets of changesets in set."""
Pierre-Yves David
revset-children: call 'getset' on a 'fullreposet'...
r23164 s = getset(repo, fullreposet(repo), x)
Matt Mackall
revset: optimize roots and children
r15899 cs = _children(repo, subset, s)
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & cs
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'closed()', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def closed(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changeset is closed."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "closed" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"closed takes no arguments"))
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: repo[r].closesbranch(), condrepr=b'<branch closed>'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Sean Farley
revset: add optimization for heads(commonancestors())...
r38644 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_commonancestorheads(set)', safe=True)
Sean Farley
revset: add optimization for heads(commonancestors())...
r38644 def _commonancestorheads(repo, subset, x):
# This is an internal method is for quickly calculating "heads(::x and
# ::y)"
Valentin Gatien-Baron
revset: make heads(commonancestors(x + x^)) be x^, not x...
r39863 # These greatest common ancestors are the same ones that the consensus bid
Sean Farley
revset: add optimization for heads(commonancestors())...
r38644 # merge will find.
Valentin Gatien-Baron
revset: make heads(commonancestors(x + x^)) be x^, not x...
r39863 startrevs = getset(repo, fullreposet(repo), x, order=anyorder)
Sean Farley
revset: add optimization for heads(commonancestors())...
r38644
Valentin Gatien-Baron
revset: make heads(commonancestors(x + x^)) be x^, not x...
r39863 ancs = repo.changelog._commonancestorsheads(*list(startrevs))
Sean Farley
revset: add optimization for heads(commonancestors())...
r38644 return subset & baseset(ancs)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'commonancestors(set)', safe=True)
Sean Farley
revsets: add commonancestors revset...
r38643 def commonancestors(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changesets that are ancestors of every changeset in set."""
Valentin Gatien-Baron
revset: make commonancestors(x + x^) be ::(x^), not ::x...
r39859 startrevs = getset(repo, fullreposet(repo), x, order=anyorder)
if not startrevs:
Yuya Nishihara
revset: special case commonancestors(none()) to be empty set...
r38727 return baseset()
Valentin Gatien-Baron
revset: make commonancestors(x + x^) be ::(x^), not ::x...
r39859 for r in startrevs:
Sean Farley
revsets: add commonancestors revset...
r38643 subset &= dagop.revancestors(repo, baseset([r]))
return subset
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
revset: add a revset for parents in merge state...
r44817 @predicate(b'conflictlocal()', safe=True)
def conflictlocal(repo, subset, x):
"""The local side of the merge, if currently in an unresolved merge.
"merge" here includes merge conflicts from e.g. 'hg rebase' or 'hg graft'.
"""
getargs(x, 0, 0, _(b"conflictlocal takes no arguments"))
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 from . import mergestate as mergestatemod
mergestate = mergestatemod.mergestate.read(repo)
Martin von Zweigbergk
revset: add a revset for parents in merge state...
r44817 if mergestate.active() and repo.changelog.hasnode(mergestate.local):
return subset & {repo.changelog.rev(mergestate.local)}
return baseset()
@predicate(b'conflictother()', safe=True)
def conflictother(repo, subset, x):
"""The other side of the merge, if currently in an unresolved merge.
"merge" here includes merge conflicts from e.g. 'hg rebase' or 'hg graft'.
"""
getargs(x, 0, 0, _(b"conflictother takes no arguments"))
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 from . import mergestate as mergestatemod
mergestate = mergestatemod.mergestate.read(repo)
Martin von Zweigbergk
revset: add a revset for parents in merge state...
r44817 if mergestate.active() and repo.changelog.hasnode(mergestate.other):
return subset & {repo.changelog.rev(mergestate.other)}
return baseset()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'contains(pattern)', weight=100)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def contains(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """The revision's manifest contains a file matching pattern (but might not
Greg Hurrell
help: clarify distinction among `contains`/`file`/`filelog`...
r21199 modify it). See :hg:`help patterns` for information about file patterns.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
The pattern without explicit kind like ``glob:`` is expected to be
relative to the current directory and match against a file exactly
for efficiency.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "contains" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"contains requires a pattern"))
Lucas Moscovicz
revset: added lazyset implementation to contains revset
r20461
def matches(x):
if not matchmod.patkind(pat):
pats = pathutil.canonpath(repo.root, repo.getcwd(), pat)
if pats in repo[x]:
return True
else:
c = repo[x]
m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
Matt Mackall
revsets: provide contexts for filesets...
r15964 for f in c.manifest():
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 if m(f):
Lucas Moscovicz
revset: added lazyset implementation to contains revset
r20461 return True
return False
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(matches, condrepr=(b'<contains %r>', pat))
@predicate(b'converted([id])', safe=True)
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002 def converted(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets converted from the given identifier in the old repository if
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002 present, or all converted changesets if no identifier is specified.
"""
# There is exactly no chance of resolving the revision, so do a simple
# string compare and hope for the best
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 rev = None
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002 # i18n: "converted" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 0, 1, _(b'converted takes one or no arguments'))
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002 if l:
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "converted" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 rev = getstring(l[0], _(b'converted requires a revision'))
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002
def _matchvalue(r):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 source = repo[r].extra().get(b'convert_revision', None)
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002 return source is not None and (rev is None or source.startswith(rev))
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: _matchvalue(r), condrepr=(b'<converted %r>', rev)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Harbison
revset: add a predicate for finding converted changesets...
r17002
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'date(interval)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def date(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changesets within the interval, see :hg:`help dates`."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "date" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ds = getstring(x, _(b"date requires a string"))
Boris Feld
util: extract all date-related utils in utils/dateutil module...
r36625 dm = dateutil.matchdate(ds)
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda x: dm(repo[x].date()[0]), condrepr=(b'<date %r>', ds)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'desc(string)', safe=True, weight=10)
Thomas Arendsen Hein
revset: add desc(string) to search in commit messages...
r14650 def desc(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Search commit message for string. The match is case-insensitive.
Matt Harbison
revset: add regular expression support to 'desc'...
r30783
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `string`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Thomas Arendsen Hein
revset: add desc(string) to search in commit messages...
r14650 """
# i18n: "desc" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ds = getstring(x, _(b"desc requires a string"))
Matt Harbison
revset: add regular expression support to 'desc'...
r30783
kind, pattern, matcher = _substringmatcher(ds, casesensitive=False)
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: matcher(repo[r].description()), condrepr=(b'<desc %r>', ds)
Augie Fackler
formatting: blacken the codebase...
r43346 )
def _descendants(
repo, subset, x, followfirst=False, startdepth=None, stopdepth=None
):
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 roots = getset(repo, fullreposet(repo), x)
Mads Kiilerich
revset: better naming of variables containing the value of a single argument...
r22944 if not roots:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 s = dagop.revdescendants(repo, roots, followfirst, startdepth, stopdepth)
Yuya Nishihara
dagop: change revdescendants() to include all root revisions...
r33075 return subset & s
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'descendants(set[, depth])', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def descendants(repo, subset, x):
Yuya Nishihara
help: clarify ancestors() and descendants() include given set (issue5594)...
r32905 """Changesets which are descendants of changesets in set, including the
given changesets themselves.
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080
If depth is specified, the result only includes changesets up to
the specified generation.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 # startdepth is for internal use only until we can decide the UI
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'descendants', b'set depth startdepth')
if b'set' not in args:
Yuya Nishihara
revset: add support of keyword arguments to ancestors() and descendants()...
r32914 # i18n: "descendants" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'descendants takes at least 1 argument'))
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 startdepth = stopdepth = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'startdepth' in args:
Augie Fackler
formatting: blacken the codebase...
r43346 n = getinteger(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'startdepth'], b"descendants expects an integer startdepth"
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 if n < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(b"negative startdepth")
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 startdepth = n
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'depth' in args:
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 # i18n: "descendants" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 n = getinteger(
args[b'depth'], _(b"descendants expects an integer depth")
)
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 if n < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"negative depth"))
Yuya Nishihara
revset: add depth limit to descendants() (issue5374)...
r33080 stopdepth = n + 1
Augie Fackler
formatting: blacken the codebase...
r43346 return _descendants(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo, subset, args[b'set'], startdepth=startdepth, stopdepth=stopdepth
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_firstdescendants', safe=True)
Patrick Mezard
graphlog: fix --follow-first --rev combinations...
r16409 def _firstdescendants(repo, subset, x):
# ``_firstdescendants(set)``
# Like ``descendants(set)`` but follows only the first parents.
return _descendants(repo, subset, x, followfirst=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'destination([set])', safe=True, weight=10)
Matt Harbison
revset: add destination() predicate...
r17186 def destination(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets that were created by a graft, transplant or rebase operation,
Matt Harbison
revset: add destination() predicate...
r17186 with the given revisions specified as the source. Omitting the optional set
is the same as passing all().
"""
if x is not None:
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 sources = getset(repo, fullreposet(repo), x)
Matt Harbison
revset: add destination() predicate...
r17186 else:
Yuya Nishihara
revset: drop unnecessary calls of getall() with empty argument...
r24201 sources = fullreposet(repo)
Matt Harbison
revset: add destination() predicate...
r17186
dests = set()
# subset contains all of the possible destinations that can be returned, so
Mads Kiilerich
revset: better naming of variables containing the value of a single argument...
r22944 # iterate over them and see if their source(s) were provided in the arg set.
# Even if the immediate src of r is not in the arg set, src's source (or
Matt Harbison
revset: add destination() predicate...
r17186 # further back) may be. Scanning back further than the immediate src allows
# transitive transplants and rebases to yield the same results as transitive
# grafts.
for r in subset:
src = _getrevsource(repo, r)
lineage = None
while src is not None:
if lineage is None:
lineage = list()
lineage.append(r)
# The visited lineage is a match if the current source is in the arg
# set. Since every candidate dest is visited by way of iterating
timeless@mozdev.org
spelling: further
r17494 # subset, any dests further back in the lineage will be tested by a
Matt Harbison
revset: add destination() predicate...
r17186 # different iteration over subset. Likewise, if the src was already
# selected, the current lineage can be selected without going back
# further.
Mads Kiilerich
revset: better naming of variables containing the value of a single argument...
r22944 if src in sources or src in dests:
Matt Harbison
revset: add destination() predicate...
r17186 dests.update(lineage)
break
r = src
src = _getrevsource(repo, r)
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
dests.__contains__,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 condrepr=lambda: b'<destination %r>' % _sortedb(dests),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Harbison
revset: add destination() predicate...
r17186
Yuya Nishihara
revset: rename diff(pattern) to diffcontains(pattern)...
r46342 @predicate(b'diffcontains(pattern)', weight=110)
def diffcontains(repo, subset, x):
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317 """Search revision differences for when the pattern was added or removed.
The pattern may be a substring literal or a regular expression. See
:hg:`help revisions.patterns`.
"""
Yuya Nishihara
revset: rename diff(pattern) to diffcontains(pattern)...
r46342 args = getargsdict(x, b'diffcontains', b'pattern')
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317 if b'pattern' not in args:
Yuya Nishihara
revset: rename diff(pattern) to diffcontains(pattern)...
r46342 # i18n: "diffcontains" is a keyword
raise error.ParseError(_(b'diffcontains takes at least 1 argument'))
pattern = getstring(
args[b'pattern'], _(b'diffcontains requires a string pattern')
)
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317 regexp = stringutil.substringregexp(pattern, re.M)
# TODO: add support for file pattern and --follow. For example,
Yuya Nishihara
revset: rename diff(pattern) to diffcontains(pattern)...
r46342 # diffcontains(pattern[, set]) where set may be file(pattern) or
# follow(pattern), and we'll eventually add a support for narrowing
# files by revset?
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317 fmatch = matchmod.always()
def makefilematcher(ctx):
return fmatch
# TODO: search in a windowed way
searcher = grepmod.grepsearcher(repo.ui, repo, regexp, diff=True)
def testdiff(rev):
# consume the generator to discard revfiles/matches cache
found = False
for fn, ctx, pstates, states in searcher.searchfiles(
baseset([rev]), makefilematcher
):
if next(grepmod.difflinestates(pstates, states), None):
found = True
return found
Yuya Nishihara
revset: rename diff(pattern) to diffcontains(pattern)...
r46342 return subset.filter(testdiff, condrepr=(b'<diffcontains %r>', pattern))
Yuya Nishihara
revset: add diff(pattern) predicate for "grep --diff"...
r46317
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'contentdivergent()', safe=True)
Boris Feld
revset: remane divergent into contentdivergent...
r33770 def contentdivergent(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """
Boris Feld
revset: mark evolution-related revsets as experimental...
r33855 Final successors of changesets with an alternative set of final
successors. (EXPERIMENTAL)
Pierre-Yves David
obsolete: add revset and test for divergent changesets...
r18071 """
Boris Feld
revset: remane divergent into contentdivergent...
r33770 # i18n: "contentdivergent" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"contentdivergent takes no arguments"))
contentdivergent = obsmod.getrevs(repo, b'contentdivergent')
Boris Feld
obsolete: rename divergent volatile set into contentdivergent volatile set...
r33773 return subset & contentdivergent
Pierre-Yves David
obsolete: add revset and test for divergent changesets...
r18071
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'expectsize(set[, size])', safe=True, takeorder=True)
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 def expectsize(repo, subset, x, order):
Navaneeth Suresh
revset: improve documentation on expectsize()...
r41847 """Return the given revset if size matches the revset size.
Abort if the revset doesn't expect given size.
size can either be an integer range or an integer.
For example, ``expectsize(0:1, 3:5)`` will abort as revset size is 2 and
2 is not between 3 and 5 inclusive."""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'expectsize', b'set size')
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 minsize = 0
maxsize = len(repo) + 1
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 err = b''
if b'size' not in args or b'set' not in args:
raise error.ParseError(_(b'invalid set of arguments'))
Augie Fackler
formatting: blacken the codebase...
r43346 minsize, maxsize = getintrange(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'size'],
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b'expectsize requires a size range or a positive integer'),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'size range bounds must be integers'),
Augie Fackler
formatting: blacken the codebase...
r43346 minsize,
maxsize,
)
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 if minsize < 0 or maxsize < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'negative size'))
rev = getset(repo, fullreposet(repo), args[b'set'], order=order)
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 if minsize != maxsize and (len(rev) < minsize or len(rev) > maxsize):
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 err = _(b'revset size mismatch. expected between %d and %d, got %d') % (
minsize,
maxsize,
len(rev),
)
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 elif minsize == maxsize and len(rev) != minsize:
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 err = _(b'revset size mismatch. expected %d, got %d') % (
Augie Fackler
formatting: blacken the codebase...
r43346 minsize,
len(rev),
)
Navaneeth Suresh
revset: add expectsize to check the size of a set...
r41829 if err:
raise error.RepoLookupError(err)
if order == followorder:
return subset & rev
else:
return rev & subset
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'extdata(source)', safe=False, weight=100)
Yuya Nishihara
revset: add experimental support for extdata...
r34458 def extdata(repo, subset, x):
"""Changesets in the specified extdata source. (EXPERIMENTAL)"""
# i18n: "extdata" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'extdata', b'source')
Augie Fackler
formatting: blacken the codebase...
r43346 source = getstring(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args.get(b'source'),
Augie Fackler
formatting: blacken the codebase...
r43346 # i18n: "extdata" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'extdata takes at least 1 string argument'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: add experimental support for extdata...
r34458 data = scmutil.extdatasource(repo, source)
return subset & baseset(data)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'extinct()', safe=True)
Pierre-Yves David
obsolete: compute extinct changesets...
r17173 def extinct(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Obsolete changesets with obsolete descendants only. (EXPERIMENTAL)"""
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "extinct" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"extinct takes no arguments"))
extincts = obsmod.getrevs(repo, b'extinct')
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & extincts
Pierre-Yves David
obsolete: compute extinct changesets...
r17173
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'extra(label, [value])', safe=True)
Henrik Stuart
revset: add function for matching extra data (issue2767)
r16661 def extra(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets with the given label in the extra metadata, with the given
Simon King
revset: add pattern matching to 'extra' revset expression
r16824 optional value.
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `value`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Simon King
revset: add pattern matching to 'extra' revset expression
r16824 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'extra', b'label value')
if b'label' not in args:
Yuya Nishihara
revset: port extra() to support keyword arguments...
r25706 # i18n: "extra" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'extra takes at least 1 argument'))
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "extra" is a keyword
Augie Fackler
formatting: blacken the codebase...
r43346 label = getstring(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 args[b'label'], _(b'first argument to extra must be a string')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Henrik Stuart
revset: add function for matching extra data (issue2767)
r16661 value = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'value' in args:
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "extra" is a keyword
Augie Fackler
formatting: blacken the codebase...
r43346 value = getstring(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 args[b'value'], _(b'second argument to extra must be a string')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, value, matcher = stringutil.stringmatcher(value)
Henrik Stuart
revset: add function for matching extra data (issue2767)
r16661
def _matchvalue(r):
extra = repo[r].extra()
Simon King
revset: add pattern matching to 'extra' revset expression
r16824 return label in extra and (value is None or matcher(extra[label]))
Henrik Stuart
revset: add function for matching extra data (issue2767)
r16661
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: _matchvalue(r), condrepr=(b'<extra[%r] %r>', label, value)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
phases: implements simple revset symbol...
r15819
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'filelog(pattern)', safe=True)
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342 def filelog(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets connected to the specified filelog.
FUJIWARA Katsunori
revset: add explanation about difference between 'filelog()' and 'file()'
r17244
Greg Hurrell
help: clarify distinction among `contains`/`file`/`filelog`...
r21199 For performance reasons, visits only revisions mentioned in the file-level
filelog, rather than filtering through all changesets (much faster, but
doesn't include deletes or duplicate changes). For a slower, more accurate
result, use ``file()``.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
The pattern without explicit kind like ``glob:`` is expected to be
relative to the current directory and match against a file exactly
for efficiency.
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342 """
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "filelog" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"filelog requires a pattern"))
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342 s = set()
Pierre-Yves David
linkrev: work around linkrev to filtered entry in 'filelog' revset...
r23719 cl = repo.changelog
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342
Matt Mackall
revsets: provide contexts for filesets...
r15964 if not matchmod.patkind(pat):
FUJIWARA Katsunori
revset: use "canonpath()" for "filelog()" pattern without explicit kind...
r20288 f = pathutil.canonpath(repo.root, repo.getcwd(), pat)
Pierre-Yves David
linkrev: work around linkrev to filtered entry in 'filelog' revset...
r23719 files = [f]
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342 else:
FUJIWARA Katsunori
revset: use "canonpath()" for "filelog()" pattern without explicit kind...
r20288 m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=repo[None])
Pierre-Yves David
linkrev: work around linkrev to filtered entry in 'filelog' revset...
r23719 files = (f for f in repo[None] if m(f))
for f in files:
fl = repo.file(f)
Matt Mackall
log: speed up single file log with hidden revs (issue4747)...
r27945 known = {}
scanpos = 0
Pierre-Yves David
linkrev: work around linkrev to filtered entry in 'filelog' revset...
r23719 for fr in list(fl):
Matt Mackall
log: speed up single file log with hidden revs (issue4747)...
r27945 fn = fl.node(fr)
if fn in known:
s.add(known[fn])
Martin von Zweigbergk
filelog: remove trailing "form feed" character
r23821 continue
Matt Mackall
log: speed up single file log with hidden revs (issue4747)...
r27945
lr = fl.linkrev(fr)
if lr in cl:
s.add(lr)
elif scanpos is not None:
# lowest matching changeset is filtered, scan further
# ahead in changelog
start = max(lr, scanpos) + 1
scanpos = None
for r in cl.revs(start):
# minimize parsing of non-matching entries
if f in cl.revision(r) and f in cl.readfiles(r):
try:
# try to use manifest delta fastpath
n = repo[r].filenode(f)
if n not in known:
if n == fn:
s.add(r)
scanpos = r
break
else:
known[n] = r
except error.ManifestLookupError:
# deletion in changelog
continue
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342
Pierre-Yves David
revset: use `subset &` in `filelog`...
r22534 return subset & s
Matt Mackall
revset: introduce filelog() to emulate log's fast path...
r14342
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'first(set, [n])', safe=True, takeorder=True, weight=0)
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 def first(repo, subset, x, order):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """An alias for limit()."""
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 return limit(repo, subset, x, order)
Matt Mackall
revsets: add first alias for last
r15117
Augie Fackler
formatting: blacken the codebase...
r43346
Patrick Mezard
context: add followfirst arg to filectx and workingfilectx...
r16185 def _follow(repo, subset, x, name, followfirst=False):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, name, b'file startrev')
Yuya Nishihara
revset: alias follow(startrev=rev) to ancestors(rev)...
r35301 revs = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'startrev' in args:
revs = getset(repo, fullreposet(repo), args[b'startrev'])
if b'file' in args:
x = getstring(args[b'file'], _(b"%s expected a pattern") % name)
Yuya Nishihara
revset: alias follow(startrev=rev) to ancestors(rev)...
r35301 if revs is None:
revs = [None]
Yuya Nishihara
revset: make follow() accept multiple startrevs...
r35299 fctxs = []
for r in revs:
ctx = mctx = repo[r]
if r is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ctx = repo[b'.']
Augie Fackler
formatting: blacken the codebase...
r43346 m = matchmod.match(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo.root, repo.getcwd(), [x], ctx=mctx, default=b'path'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: make follow() accept multiple startrevs...
r35299 fctxs.extend(ctx[f].introfilectx() for f in ctx.manifest().walk(m))
Yuya Nishihara
dagop: add smartset interface to filectxancestors()...
r35297 s = dagop.filerevancestors(fctxs, followfirst)
Patrick Mezard
context: add followfirst arg to filectx and workingfilectx...
r16185 else:
Yuya Nishihara
revset: alias follow(startrev=rev) to ancestors(rev)...
r35301 if revs is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 revs = baseset([repo[b'.'].rev()])
Yuya Nishihara
revset: alias follow(startrev=rev) to ancestors(rev)...
r35301 s = dagop.revancestors(repo, revs, followfirst)
Patrick Mezard
context: add followfirst arg to filectx and workingfilectx...
r16185
Pierre-Yves David
revset: use `subset &` in `follow`...
r22535 return subset & s
Patrick Mezard
context: add followfirst arg to filectx and workingfilectx...
r16185
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'follow([file[, startrev]])', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def follow(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """
Yuya Nishihara
revset: replace "working copy" with "working directory" in function help
r24366 An alias for ``::.`` (ancestors of the working directory's first parent).
Yuya Nishihara
revset: make follow() accept keyword arguments...
r35300 If file pattern is specified, the histories of files matching given
Gábor Stefanik
revset: support "follow(renamed.py, e22f4f3f06c3)" (issue5334)...
r29814 pattern in the revision given by startrev are followed, including copies.
Matt Mackall
revset: add follow(filename) to follow a filename's history across copies
r14343 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return _follow(repo, subset, x, b'follow')
@predicate(b'_followfirst', safe=True)
Patrick Mezard
graphlog: implement --follow-first...
r16174 def _followfirst(repo, subset, x):
Yuya Nishihara
revset: make follow() accept keyword arguments...
r35300 # ``followfirst([file[, startrev]])``
# Like ``follow([file[, startrev]])`` but follows only the first parent
Gábor Stefanik
revset: support "follow(renamed.py, e22f4f3f06c3)" (issue5334)...
r29814 # of every revisions or files revisions.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return _follow(repo, subset, x, b'_followfirst', followfirst=True)
Matt Mackall
revset: add follow(filename) to follow a filename's history across copies
r14343
Augie Fackler
formatting: blacken the codebase...
r43346
@predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'followlines(file, fromline:toline[, startrev=., descend=False])',
safe=True,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 def followlines(repo, subset, x):
"""Changesets modifying `file` in line range ('fromline', 'toline').
Yuya Nishihara
revset: rename rev argument of followlines() to startrev...
r30800 Line range corresponds to 'file' content at 'startrev' and should hence be
consistent with file size. If startrev is not specified, working directory's
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 parent is used.
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938
By default, ancestors of 'startrev' are returned. If 'descend' is True,
descendants of 'startrev' are returned though renames are (currently) not
followed in this direction.
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'followlines', b'file *lines startrev descend')
if len(args[b'lines']) != 1:
raise error.ParseError(_(b"followlines requires a line range"))
rev = b'.'
if b'startrev' in args:
revs = getset(repo, fullreposet(repo), args[b'startrev'])
Yuya Nishihara
revset: parse variable-length arguments of followlines() by getargsdict()
r30754 if len(revs) != 1:
raise error.ParseError(
FUJIWARA Katsunori
revset: add i18n comments to error messages for followlines predicate...
r32086 # i18n: "followlines" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"followlines expects exactly one revision")
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: parse variable-length arguments of followlines() by getargsdict()
r30754 rev = revs.last()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(args[b'file'], _(b"followlines requires a pattern"))
Denis Laxalde
revset: extract a parsefollowlinespattern helper function...
r34855 # i18n: "followlines" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 msg = _(b"followlines expects exactly one file")
Denis Laxalde
revset: extract a parsefollowlinespattern helper function...
r34855 fname = scmutil.parsefollowlinespattern(repo, rev, pat, msg)
Yuya Nishihara
revset: extract a helper to parse integer range...
r41702 fromline, toline = util.processlinerange(
Augie Fackler
formatting: blacken the codebase...
r43346 *getintrange(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'lines'][0],
Augie Fackler
formatting: blacken the codebase...
r43346 # i18n: "followlines" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"followlines expects a line number or a range"),
_(b"line range bounds must be integers"),
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
fctx = repo[rev].filectx(fname)
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 descend = False
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'descend' in args:
Augie Fackler
formatting: blacken the codebase...
r43346 descend = getboolean(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'descend'],
Augie Fackler
formatting: blacken the codebase...
r43346 # i18n: "descend" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"descend argument must be a boolean"),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 if descend:
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 rs = generatorset(
Augie Fackler
formatting: blacken the codebase...
r43346 (
c.rev()
for c, _linerange in dagop.blockdescendants(
fctx, fromline, toline
)
),
iterasc=True,
)
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 else:
rs = generatorset(
Augie Fackler
formatting: blacken the codebase...
r43346 (
c.rev()
for c, _linerange in dagop.blockancestors(
fctx, fromline, toline
)
),
iterasc=False,
)
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 return subset & rs
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
Augie Fackler
formatting: blacken the codebase...
r43346
revset: introduce a `nodefromfile` revset...
r47566 @predicate(b'nodefromfile(path)')
def nodefromfile(repo, subset, x):
"""
An alias for ``::.`` (ancestors of the working directory's first parent).
If file pattern is specified, the histories of files matching given
pattern in the revision given by startrev are followed, including copies.
"""
path = getstring(x, _(b"nodefromfile require a file path"))
listed_rev = set()
try:
with pycompat.open(path, 'rb') as f:
for line in f:
n = line.strip()
rn = _node(repo, n)
if rn is not None:
listed_rev.add(rn)
except IOError as exc:
m = _(b'cannot open nodes file "%s": %s')
m %= (path, encoding.strtolocal(exc.strerror))
raise error.Abort(m)
return subset & baseset(listed_rev)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'all()', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def getall(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """All changesets, the same as ``0:tip``."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "all" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"all takes no arguments"))
Yuya Nishihara
revset: have all() filter out null revision...
r24202 return subset & spanset(repo) # drop "null" if any
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'grep(regex)', weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def grep(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``
Martin Geisler
merge with stable
r14357 to ensure special escape characters are handled correctly. Unlike
``keyword(string)``, the match is case-sensitive.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
try:
# i18n: "grep" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 gr = re.compile(getstring(x, _(b"grep requires a string")))
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except re.error as e:
Augie Fackler
revset: use {force,}bytestr to fix some %r formatting issues...
r36598 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 )
Lucas Moscovicz
revset: added lazyset implementation to grep revset...
r20453
def matches(x):
c = repo[x]
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 for e in c.files() + [c.user(), c.description()]:
if gr.search(e):
Lucas Moscovicz
revset: added lazyset implementation to grep revset...
r20453 return True
return False
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(matches, condrepr=(b'<grep %r>', gr.pattern))
@predicate(b'_matchfiles', safe=True)
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 def _matchfiles(repo, subset, x):
# _matchfiles takes a revset list of prefixed arguments:
#
# [p:foo, i:bar, x:baz]
#
# builds a match object from them and filters subset. Allowed
# prefixes are 'p:' for regular patterns, 'i:' for include
Patrick Mezard
graphlog: evaluate FILE/-I/-X filesets on the working dir...
r16181 # patterns and 'x:' for exclude patterns. Use 'r:' prefix to pass
# a revision identifier, or the empty string to reference the
# working directory, from which the match object is
Patrick Mezard
graphlog: correctly handle calls in subdirectories
r16411 # initialized. Use 'd:' to set the default matching mode, default
# to 'glob'. At most one 'r:' and 'd:' argument can be passed.
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 1, -1, b"_matchfiles requires at least one argument")
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 pats, inc, exc = [], [], []
Patrick Mezard
graphlog: correctly handle calls in subdirectories
r16411 rev, default = None, None
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 for arg in l:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = getstring(arg, b"_matchfiles requires string arguments")
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 prefix, value = s[:2], s[2:]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if prefix == b'p:':
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 pats.append(value)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif prefix == b'i:':
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 inc.append(value)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif prefix == b'x:':
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 exc.append(value)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif prefix == b'r:':
Patrick Mezard
graphlog: evaluate FILE/-I/-X filesets on the working dir...
r16181 if rev is not None:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 b'_matchfiles expected at most one revision'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if value == b'': # empty means working directory
Joerg Sonnenberger
node: import symbols explicitly...
r46729 rev = wdirrev
Matt Harbison
revset: evaluate filesets against each revision for 'file()' (issue5778)...
r35835 else:
Martin von Zweigbergk
log: evaluate filesets on working copy, not its parent...
r23950 rev = value
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif prefix == b'd:':
Patrick Mezard
graphlog: correctly handle calls in subdirectories
r16411 if default is not None:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 b'_matchfiles expected at most one default mode'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
graphlog: correctly handle calls in subdirectories
r16411 default = value
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(b'invalid _matchfiles prefix: %s' % prefix)
Patrick Mezard
graphlog: correctly handle calls in subdirectories
r16411 if not default:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 default = b'glob'
hasset = any(matchmod.patkind(p) == b'set' for p in pats + inc + exc)
Lucas Moscovicz
revset: added lazyset implementation to _matchfiles...
r20458
Matt Harbison
revset: evaluate filesets against each revision for 'file()' (issue5778)...
r35835 mcache = [None]
Matt Mackall
revset: avoid recalculating filesets...
r23061
Pierre-Yves David
revset: speed up '_matchfiles'...
r27028 # This directly read the changelog data as creating changectx for all
# revisions is quite expensive.
Laurent Charignon
log: speed up hg log <file|folder>...
r27440 getfiles = repo.changelog.readfiles
Augie Fackler
formatting: blacken the codebase...
r43346
Lucas Moscovicz
revset: added lazyset implementation to _matchfiles...
r20458 def matches(x):
Pierre-Yves David
revset: speed up '_matchfiles'...
r27028 if x == wdirrev:
files = repo[x].files()
else:
Laurent Charignon
log: speed up hg log <file|folder>...
r27440 files = getfiles(x)
Matt Harbison
revset: evaluate filesets against each revision for 'file()' (issue5778)...
r35835
if not mcache[0] or (hasset and rev is None):
r = x if rev is None else rev
Augie Fackler
formatting: blacken the codebase...
r43346 mcache[0] = matchmod.match(
repo.root,
repo.getcwd(),
pats,
include=inc,
exclude=exc,
ctx=repo[r],
default=default,
)
Matt Harbison
revset: evaluate filesets against each revision for 'file()' (issue5778)...
r35835 m = mcache[0]
Pierre-Yves David
revset: speed up '_matchfiles'...
r27028 for f in files:
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161 if m(f):
Lucas Moscovicz
revset: added lazyset implementation to _matchfiles...
r20458 return True
return False
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
matches,
condrepr=(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'<matchfiles patterns=%r, include=%r '
b'exclude=%r, default=%r, rev=%r>',
Augie Fackler
formatting: blacken the codebase...
r43346 pats,
inc,
exc,
default,
rev,
),
)
Patrick Mezard
graphlog: paths/-I/-X handling requires a new revset...
r16161
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'file(pattern)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def hasfile(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets affecting files matched by pattern.
FUJIWARA Katsunori
revset: add explanation about difference between 'filelog()' and 'file()'
r17244
Greg Ward
revset: polish explanation of the difference between file() and filelog()
r17265 For a faster but less accurate result, consider using ``filelog()``
instead.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
This predicate uses ``glob:`` as the default kind of pattern.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "file" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"file requires a pattern"))
return _matchfiles(repo, subset, (b'string', b'p:' + pat))
@predicate(b'head()', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def head(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changeset is a named branch head."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "head" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"head takes no arguments"))
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 hs = set()
Pierre-Yves David
revset: translate node directly with changelog in 'head'...
r25620 cl = repo.changelog
Pulkit Goyal
branchcache: rename itervalues() to iterheads()...
r42169 for ls in repo.branchmap().iterheads():
Pierre-Yves David
revset: translate node directly with changelog in 'head'...
r25620 hs.update(cl.rev(h) for h in ls)
Martin von Zweigbergk
revset: make head() honor order of subset...
r29408 return subset & baseset(hs)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'heads(set)', safe=True, takeorder=True)
Yuya Nishihara
revset: fix heads() order to always follow the input set (BC)...
r38498 def heads(repo, subset, x, order):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Members of set with no children in set."""
Yuya Nishihara
revset: fix heads() order to always follow the input set (BC)...
r38498 # argument set should never define order
if order == defineorder:
order = followorder
Boris Feld
revset: inline parents computation to reuse the input argument...
r41310 inputset = getset(repo, fullreposet(repo), x, order=order)
Boris Feld
revset: use changelog's `headrevs` method to compute heads...
r41312 wdirparents = None
Joerg Sonnenberger
node: import symbols explicitly...
r46729 if wdirrev in inputset:
Boris Feld
revset: use changelog's `headrevs` method to compute heads...
r41312 # a bit slower, but not common so good enough for now
wdirparents = [p.rev() for p in repo[None].parents()]
inputset = set(inputset)
Joerg Sonnenberger
node: import symbols explicitly...
r46729 inputset.discard(wdirrev)
Boris Feld
revset: use changelog's `headrevs` method to compute heads...
r41312 heads = repo.changelog.headrevs(inputset)
if wdirparents is not None:
heads.difference_update(wdirparents)
Joerg Sonnenberger
node: import symbols explicitly...
r46729 heads.add(wdirrev)
Boris Feld
revset: use changelog's `headrevs` method to compute heads...
r41312 heads = baseset(heads)
return subset & heads
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'hidden()', safe=True)
Patrick Mezard
revset: add hidden() revset
r17390 def hidden(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Hidden changesets."""
Patrick Mezard
revset: add hidden() revset
r17390 # i18n: "hidden" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"hidden takes no arguments"))
hiddenrevs = repoview.filterrevs(repo, b'visible')
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & hiddenrevs
Patrick Mezard
revset: add hidden() revset
r17390
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'keyword(string)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def keyword(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Search commit message, user name, and names of changed files for
Martin Geisler
merge with stable
r14357 string. The match is case-insensitive.
Matt Harbison
revset: point to 'grep' in the 'keyword' help for regex searches...
r30772
For a regular expression or case sensitive search of these fields, use
``grep(regex)``.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "keyword" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 kw = encoding.lower(getstring(x, _(b"keyword requires a string")))
Lucas Moscovicz
revset: added lazyset implementation to keyword revset...
r20447
def matches(r):
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 c = repo[r]
Augie Fackler
formatting: blacken the codebase...
r43346 return any(
kw in encoding.lower(t)
for t in c.files() + [c.user(), c.description()]
)
Lucas Moscovicz
revset: added lazyset implementation to keyword revset...
r20447
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(matches, condrepr=(b'<keyword %r>', kw))
@predicate(b'limit(set[, n[, offset]])', safe=True, takeorder=True, weight=0)
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 def limit(repo, subset, x, order):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """First n members of set, defaulting to 1, starting from offset."""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'limit', b'set n offset')
if b'set' not in args:
Yuya Nishihara
revset: port limit() to support keyword arguments...
r26637 # i18n: "limit" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"limit requires one to three arguments"))
Yuya Nishihara
revset: add default value to getinteger() helper...
r30802 # i18n: "limit" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lim = getinteger(args.get(b'n'), _(b"limit expects a number"), default=1)
Yuya Nishihara
revset: reject negative number to select first/last n members...
r32798 if lim < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"negative number to select"))
Yuya Nishihara
revset: add default value to getinteger() helper...
r30802 # i18n: "limit" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ofs = getinteger(
args.get(b'offset'), _(b"limit expects a number"), default=0
)
Yuya Nishihara
revset: factor out getinteger() helper...
r30801 if ofs < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"negative offset"))
os = getset(repo, fullreposet(repo), args[b'set'])
Yuya Nishihara
smartset: extract method to slice abstractsmartset...
r32819 ls = os.slice(ofs, ofs + lim)
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 if order == followorder and lim > 1:
return subset & ls
Yuya Nishihara
revset: filter first/last members by __and__ operation...
r32799 return ls & subset
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'last(set, [n])', safe=True, takeorder=True)
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 def last(repo, subset, x, order):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Last n members of set, defaulting to 1."""
Matt Mackall
revsets: add a last function...
r14061 # i18n: "last" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 1, 2, _(b"last requires one or two arguments"))
Yuya Nishihara
revset: factor out getinteger() helper...
r30801 lim = 1
if len(l) == 2:
Matt Mackall
revsets: add a last function...
r14061 # i18n: "last" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lim = getinteger(l[1], _(b"last expects a number"))
Yuya Nishihara
revset: reject negative number to select first/last n members...
r32798 if lim < 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"negative number to select"))
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 os = getset(repo, fullreposet(repo), l[0])
Lucas Moscovicz
revset: changed last implementation to use lazy classes...
r20534 os.reverse()
Yuya Nishihara
smartset: extract method to slice abstractsmartset...
r32819 ls = os.slice(0, lim)
Yuya Nishihara
revset: fix order of first/last members in compound expression (BC)...
r32800 if order == followorder and lim > 1:
return subset & ls
Yuya Nishihara
revset: filter first/last members by __and__ operation...
r32799 ls.reverse()
return ls & subset
Matt Mackall
revsets: add a last function...
r14061
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'max(set)', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def maxrev(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changeset with highest revision number in set."""
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 os = getset(repo, fullreposet(repo), x)
Durham Goode
revset: remove existence check from min() and max()...
r26305 try:
Lucas Moscovicz
revset: changed minrev and maxrev implementations to use ordered sets...
r20754 m = os.max()
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 if m in subset:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return baseset([m], datarepr=(b'<max %r, %r>', subset, os))
Durham Goode
revset: remove existence check from min() and max()...
r26305 except ValueError:
# os.max() throws a ValueError when the collection is empty.
# Same as python's max().
pass
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return baseset(datarepr=(b'<max %r, %r>', subset, os))
@predicate(b'merge()', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def merge(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changeset is a merge changeset."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "merge" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"merge takes no arguments"))
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 cl = repo.changelog
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: fix merge() to fall back to changectx API if wdir specified...
r42634 def ismerge(r):
try:
return cl.parentrevs(r)[1] != nullrev
except error.WdirUnsupported:
return bool(repo[r].p2())
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(ismerge, condrepr=b'<merge>')
@predicate(b'branchpoint()', safe=True)
Ivan Andrus
revsets: add branchpoint() function...
r17753 def branchpoint(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changesets with more than one child."""
Ivan Andrus
revsets: add branchpoint() function...
r17753 # i18n: "branchpoint" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"branchpoint takes no arguments"))
Ivan Andrus
revsets: add branchpoint() function...
r17753 cl = repo.changelog
if not subset:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Pierre-Yves David
revset: mark spots that should use 'smartset.min()'...
r25549 # XXX this should be 'parentset.min()' assuming 'parentset' is a smartset
# (and if it is not, it should.)
Ivan Andrus
revsets: add branchpoint() function...
r17753 baserev = min(subset)
Augie Fackler
formatting: blacken the codebase...
r43346 parentscount = [0] * (len(repo) - baserev)
Pierre-Yves David
clfilter: use changelog to iterate over the repo in branchpoint...
r17785 for r in cl.revs(start=baserev + 1):
Ivan Andrus
revsets: add branchpoint() function...
r17753 for p in cl.parentrevs(r):
if p >= baserev:
parentscount[p - baserev] += 1
Augie Fackler
formatting: blacken the codebase...
r43346 return subset.filter(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lambda r: parentscount[r - baserev] > 1, condrepr=b'<branchpoint>'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Ivan Andrus
revsets: add branchpoint() function...
r17753
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'min(set)', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def minrev(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changeset with lowest revision number in set."""
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 os = getset(repo, fullreposet(repo), x)
Durham Goode
revset: remove existence check from min() and max()...
r26305 try:
Lucas Moscovicz
revset: changed minrev and maxrev implementations to use ordered sets...
r20754 m = os.min()
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 if m in subset:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return baseset([m], datarepr=(b'<min %r, %r>', subset, os))
Durham Goode
revset: remove existence check from min() and max()...
r26305 except ValueError:
# os.min() throws a ValueError when the collection is empty.
# Same as python's min().
pass
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return baseset(datarepr=(b'<min %r, %r>', subset, os))
@predicate(b'modifies(pattern)', safe=True, weight=30)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def modifies(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets modifying files matched by pattern.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
The pattern without explicit kind like ``glob:`` is expected to be
relative to the current directory and match against a file or a
directory.
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 """
# i18n: "modifies" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"modifies requires a pattern"))
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 return checkstatus(repo, subset, pat, 'modified')
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'named(namespace)')
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 def named(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """The changesets in a given namespace.
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `namespace`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 """
# i18n: "named" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 1, 1, _(b'named requires a namespace argument'))
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836
Augie Fackler
formatting: blacken the codebase...
r43346 ns = getstring(
args[0],
# i18n: "named" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'the argument to named must be a string'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, pattern, matcher = stringutil.stringmatcher(ns)
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 namespaces = set()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'literal':
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 if pattern not in repo.names:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.RepoLookupError(
_(b"namespace '%s' does not exist") % ns
)
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 namespaces.add(repo.names[pattern])
else:
Gregory Szorc
py3: finish porting iteritems() to pycompat and remove source transformer...
r43376 for name, ns in pycompat.iteritems(repo.names):
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 if matcher(name):
namespaces.add(ns)
names = set()
for ns in namespaces:
for name in ns.listnames(repo):
FUJIWARA Katsunori
revset: mask specific names for named() predicate...
r24151 if name not in ns.deprecated:
names.update(repo[n].rev() for n in ns.nodes(repo, name))
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836
Joerg Sonnenberger
node: import symbols explicitly...
r46729 names -= {nullrev}
Sean Farley
namespaces: add revset for 'named(namespace)'...
r23836 return subset & names
Augie Fackler
formatting: blacken the codebase...
r43346
revset: introduce a `nodefromfile` revset...
r47566 def _node(repo, n):
"""process a node input"""
rn = None
Joerg Sonnenberger
core: don't hard-code hex node lengths...
r47815 if len(n) == 2 * repo.nodeconstants.nodelen:
Alexander Drozdov
revset: id() called with 40-byte strings should give the same results as for short strings...
r24904 try:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 rn = repo.changelog.rev(bin(n))
Yuya Nishihara
revset: add support for integer and hex wdir identifiers...
r32659 except error.WdirUnsupported:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 rn = wdirrev
Alexander Drozdov
revset: id() called with 40-byte strings should give the same results as for short strings...
r24904 except (LookupError, TypeError):
rn = None
Augie Fackler
revset: add id() and rev() to allow explicitly referring to changes by hash or rev
r12716 else:
Yuya Nishihara
revlog: add support for partial matching of wdir node id...
r32684 try:
Martin von Zweigbergk
revset: use resolvehexnodeidprefix() in id() predicate (BC)...
r37884 pm = scmutil.resolvehexnodeidprefix(repo, n)
Yuya Nishihara
revlog: add support for partial matching of wdir node id...
r32684 if pm is not None:
Yuya Nishihara
revset: add support for integer and hex wdir identifiers...
r32659 rn = repo.changelog.rev(pm)
Martin von Zweigbergk
revset: make id() an empty set for ambiguous nodeid (BC)...
r37883 except LookupError:
pass
Yuya Nishihara
revlog: add support for partial matching of wdir node id...
r32684 except error.WdirUnsupported:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 rn = wdirrev
revset: introduce a `nodefromfile` revset...
r47566 return rn
@predicate(b'id(string)', safe=True)
def node_(repo, subset, x):
"""Revision non-ambiguously specified by the given hex string prefix."""
# i18n: "id" is a keyword
l = getargs(x, 1, 1, _(b"id requires one argument"))
# i18n: "id" is a keyword
n = getstring(l[0], _(b"id requires a string"))
rn = _node(repo, n)
Matt Harbison
revset: fix traceback for bogus revisions in id(rev)...
r16735
Pierre-Yves David
revset-node: speedup by a few hundred fold...
r23005 if rn is None:
return baseset()
result = baseset([rn])
return result & subset
Augie Fackler
revset: add id() and rev() to allow explicitly referring to changes by hash or rev
r12716
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'none()', safe=True)
Martin von Zweigbergk
revsets: define a none() revset...
r38294 def none(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """No changesets."""
Martin von Zweigbergk
revsets: define a none() revset...
r38294 # i18n: "none" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"none takes no arguments"))
Martin von Zweigbergk
revsets: define a none() revset...
r38294 return baseset()
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'obsolete()', safe=True)
Pierre-Yves David
revset: add an `obsolete` symbol...
r17170 def obsolete(repo, subset, x):
Matt Harbison
revset: mark `obsolete()` experimental...
r45188 """Mutable changeset with a newer version. (EXPERIMENTAL)"""
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "obsolete" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"obsolete takes no arguments"))
obsoletes = obsmod.getrevs(repo, b'obsolete')
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & obsoletes
Pierre-Yves David
revset: add an `obsolete` symbol...
r17170
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'only(set, [set])', safe=True)
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466 def only(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets that are ancestors of the first set that are not ancestors
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466 of any other head in the repo. If a second set is specified, the result
is ancestors of the first set that are not ancestors of the second set
(i.e. ::<set1> - ::<set2>).
"""
cl = repo.changelog
# i18n: "only" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 1, 2, _(b'only takes one or two arguments'))
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 include = getset(repo, fullreposet(repo), args[0])
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466 if len(args) == 1:
if not include:
return baseset()
Yuya Nishihara
dagop: split module hosting DAG-related algorithms from revset...
r32903 descendants = set(dagop.revdescendants(repo, include, False))
Augie Fackler
formatting: blacken the codebase...
r43346 exclude = [
rev
for rev in cl.headrevs()
if not rev in descendants and not rev in include
]
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466 else:
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 exclude = getset(repo, fullreposet(repo), args[1])
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466
results = set(cl.findmissingrevs(common=exclude, heads=include))
Pierre-Yves David
revset: mark spots that use 'set' instead of 'smartset'...
r25554 # XXX we should turn this into a baseset instead of a set, smartset may do
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # some optimizations from the fact this is a baseset.
Yuya Nishihara
revset: move 'only' so that functions are sorted alphabetically
r23466 return subset & results
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'origin([set])', safe=True)
Matt Harbison
revset: add origin() predicate...
r17185 def origin(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """
Matt Harbison
revset: add origin() predicate...
r17185 Changesets that were specified as a source for the grafts, transplants or
rebases that created the given revisions. Omitting the optional set is the
same as passing all(). If a changeset created by these operations is itself
specified as a source for one of these operations, only the source changeset
for the first operation is selected.
"""
if x is not None:
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 dests = getset(repo, fullreposet(repo), x)
Matt Harbison
revset: add origin() predicate...
r17185 else:
Yuya Nishihara
revset: drop unnecessary calls of getall() with empty argument...
r24201 dests = fullreposet(repo)
Matt Harbison
revset: add origin() predicate...
r17185
def _firstsrc(rev):
src = _getrevsource(repo, rev)
if src is None:
return None
while True:
prev = _getrevsource(repo, src)
if prev is None:
return src
src = prev
Martin von Zweigbergk
cleanup: use set literals...
r32291 o = {_firstsrc(r) for r in dests}
o -= {None}
Pierre-Yves David
revset: mark spots that use 'set' instead of 'smartset'...
r25554 # XXX we should turn this into a baseset instead of a set, smartset may do
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # some optimizations from the fact this is a baseset.
Pierre-Yves David
revset: use `subset &` in `origin`...
r22536 return subset & o
Matt Harbison
revset: add origin() predicate...
r17185
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'outgoing([path])', safe=False, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def outgoing(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets not found in the specified destination repository, or the
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 default push location.
revset: document the `outgoing` behavior if the path resolve to multiple urls...
r48049
If the location resolve to multiple repositories, the union of all
outgoing changeset will be used.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Gregory Szorc
revset: don't import discovery at module level...
r24722 # Avoid cycles.
Gregory Szorc
revset: use absolute_import
r25971 from . import (
discovery,
hg,
)
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "outgoing" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 0, 1, _(b"outgoing takes one or no arguments"))
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 # i18n: "outgoing" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 dest = (
l and getstring(l[0], _(b"outgoing requires a repository path")) or b''
)
outgoing: use `get_push_paths` in the revset too...
r47695 if dest:
dests = [dest]
else:
dests = []
missing = set()
for path in urlutil.get_push_paths(repo, repo.ui, dests):
dest = path.pushloc or path.loc
branches = path.branch, []
revs, checkout = hg.addbranchrevs(repo, repo, branches, [])
if revs:
revs = [repo.lookup(rev) for rev in revs]
other = hg.peer(repo, {}, dest)
try:
Martin von Zweigbergk
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)...
r48230 with repo.ui.silent():
outgoing = discovery.findcommonoutgoing(
repo, other, onlyheads=revs
)
outgoing: use `get_push_paths` in the revset too...
r47695 finally:
other.close()
missing.update(outgoing.missing)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 cl = repo.changelog
outgoing: use `get_push_paths` in the revset too...
r47695 o = {cl.rev(r) for r in missing}
Pierre-Yves David
revset: use `subset &` in `outgoing`...
r22529 return subset & o
Augie Fackler
revset: add id() and rev() to allow explicitly referring to changes by hash or rev
r12716
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'p1([set])', safe=True)
Matt Mackall
revset: introduce revset core
r11275 def p1(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """First parent of changesets in set, or the working directory."""
Kevin Bullock
revsets: let p1() and p2() return parents of working dir...
r12928 if x is None:
Matt Mackall
misc: replace .parents()[0] with p1()
r13878 p = repo[x].p1().rev()
Pierre-Yves David
revset: use `subset &` in bare `p1()`...
r22538 if p >= 0:
return subset & baseset([p])
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Kevin Bullock
revsets: let p1() and p2() return parents of working dir...
r12928
Matt Mackall
revset: introduce revset core
r11275 ps = set()
cl = repo.changelog
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 for r in getset(repo, fullreposet(repo), x):
Pulkit Goyal
revset: make `hg log -r 'wdir()^'` work (issue4905)...
r32403 try:
ps.add(cl.parentrevs(r)[0])
except error.WdirUnsupported:
Martin von Zweigbergk
cleanup: use p1() and p2() instead of parents()[0] and parents()[1]...
r41442 ps.add(repo[r].p1().rev())
Joerg Sonnenberger
node: import symbols explicitly...
r46729 ps -= {nullrev}
Pierre-Yves David
revset: mark spots that use 'set' instead of 'smartset'...
r25554 # XXX we should turn this into a baseset instead of a set, smartset may do
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # some optimizations from the fact this is a baseset.
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & ps
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'p2([set])', safe=True)
Matt Mackall
revset: introduce revset core
r11275 def p2(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Second parent of changesets in set, or the working directory."""
Kevin Bullock
revsets: let p1() and p2() return parents of working dir...
r12928 if x is None:
ps = repo[x].parents()
try:
Patrick Mezard
revset: fix p1, p2 and parents in dirstate case (a5f7f1e9340e)...
r12935 p = ps[1].rev()
Pierre-Yves David
revset: use `subset &` in bare `p2()`...
r22539 if p >= 0:
return subset & baseset([p])
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Kevin Bullock
revsets: let p1() and p2() return parents of working dir...
r12928 except IndexError:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Kevin Bullock
revsets: let p1() and p2() return parents of working dir...
r12928
Matt Mackall
revset: introduce revset core
r11275 ps = set()
cl = repo.changelog
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 for r in getset(repo, fullreposet(repo), x):
Pulkit Goyal
revset: add support for p2(wdir()) to get second parent of working directory...
r32440 try:
ps.add(cl.parentrevs(r)[1])
except error.WdirUnsupported:
parents = repo[r].parents()
if len(parents) == 2:
ps.add(parents[1])
Joerg Sonnenberger
node: import symbols explicitly...
r46729 ps -= {nullrev}
Pierre-Yves David
revset: mark spots that use 'set' instead of 'smartset'...
r25554 # XXX we should turn this into a baseset instead of a set, smartset may do
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # some optimizations from the fact this is a baseset.
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & ps
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def parentpost(repo, subset, x, order):
Yuya Nishihara
revset: add stub to handle parentpost operation...
r29931 return p1(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'parents([set])', safe=True)
Matt Mackall
revset: introduce revset core
r11275 def parents(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """
Kevin Bullock
revsets: let parents() return parents of working dir...
r12929 The set of all parents for all changesets in set, or the working directory.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Kevin Bullock
revsets: let parents() return parents of working dir...
r12929 if x is None:
Augie Fackler
cleanup: run pyupgrade on our source tree to clean up varying things...
r44937 ps = {p.rev() for p in repo[x].parents()}
Pierre-Yves David
revset: refactor parents() into a single return point...
r22496 else:
ps = set()
cl = repo.changelog
Pierre-Yves David
revset: prefetch method in "parents"...
r25716 up = ps.update
parentrevs = cl.parentrevs
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 for r in getset(repo, fullreposet(repo), x):
Pulkit Goyal
revset: use try-except instead of if-else because of perf...
r32439 try:
up(parentrevs(r))
except error.WdirUnsupported:
Pierre-Yves David
revset: prefetch method in "parents"...
r25716 up(p.rev() for p in repo[r].parents())
Joerg Sonnenberger
node: import symbols explicitly...
r46729 ps -= {nullrev}
Pierre-Yves David
revert: bring back usage of `subset & ps` in `parents`...
r22712 return subset & ps
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: use phasecache.getrevset...
r31017 def _phase(repo, subset, *targets):
"""helper to select all rev in <targets> phases"""
Jun Wu
revset: use phasecache.getrevset to calculate public()...
r35331 return repo._phasecache.getrevset(repo, targets, subset)
Pierre-Yves David
revset: refactor the non-public phase code...
r25621
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_phase(idx)', safe=True)
Boris Feld
phase: expose a `_phase(idx)` revset...
r39310 def phase(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 1, 1, b"_phase requires one argument")
target = getinteger(l[0], b"_phase expects a number")
Boris Feld
phase: expose a `_phase(idx)` revset...
r39310 return _phase(repo, subset, target)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'draft()', safe=True)
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 def draft(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changeset in draft phase."""
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 # i18n: "draft" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"draft takes no arguments"))
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 target = phases.draft
return _phase(repo, subset, target)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'secret()', safe=True)
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 def secret(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changeset in secret phase."""
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 # i18n: "secret" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"secret takes no arguments"))
Pierre-Yves David
revset: refactor the non-public phase code...
r25621 target = phases.secret
return _phase(repo, subset, target)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'stack([revs])', safe=True)
Boris Feld
stack: follow-up on the stack revset...
r37407 def stack(repo, subset, x):
"""Experimental revset for the stack of changesets or working directory
parent. (EXPERIMENTAL)
"""
Boris Feld
stack: import Evolve stack test file...
r37019 if x is None:
av6
revset: drop argument when it's None...
r42927 stacks = stackmod.getstack(repo)
Boris Feld
stack: import Evolve stack test file...
r37019 else:
stacks = smartset.baseset([])
for revision in getset(repo, fullreposet(repo), x):
Boris Feld
stack: follow-up on the stack revset...
r37407 currentstack = stackmod.getstack(repo, revision)
Boris Feld
stack: import Evolve stack test file...
r37019 stacks = stacks + currentstack
Boris Feld
stack: follow-up on the stack revset...
r37407 return subset & stacks
Boris Feld
stack: import Evolve stack test file...
r37019
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass around ordering flags to operations...
r29932 def parentspec(repo, subset, x, n, order):
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 """``set^0``
The set.
``set^1`` (or ``set^``), ``set^2``
First or second parent, respectively, of all changesets in set.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Brodie Rao
revset: handle re.compile() errors in grep()...
r12320 try:
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 n = int(n[1])
Kevin Gessner
revset: add missing whitespace
r14072 if n not in (0, 1, 2):
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 raise ValueError
Matt Mackall
revsets: actually catch type error on tip^p1(tip) (issue2884)...
r14851 except (TypeError, ValueError):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"^ expects a number 0, 1, or 2"))
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 ps = set()
Matt Mackall
revset: introduce revset core
r11275 cl = repo.changelog
Pierre-Yves David
revset-parentspec: call 'getset' on a 'fullreposet'...
r23165 for r in getset(repo, fullreposet(repo), x):
Kevin Gessner
revset: add ^ and ~ operators from parentrevspec extension...
r14070 if n == 0:
ps.add(r)
elif n == 1:
Pulkit Goyal
revset: add support for "wdir()^n"...
r32436 try:
ps.add(cl.parentrevs(r)[0])
except error.WdirUnsupported:
Martin von Zweigbergk
cleanup: use p1() and p2() instead of parents()[0] and parents()[1]...
r41442 ps.add(repo[r].p1().rev())
Pulkit Goyal
revset: remove redundant condition and change to else from elif...
r32438 else:
Pulkit Goyal
revset: add support for "wdir()^n"...
r32436 try:
parents = cl.parentrevs(r)
Joerg Sonnenberger
node: import symbols explicitly...
r46729 if parents[1] != nullrev:
Pulkit Goyal
revset: add support for "wdir()^n"...
r32436 ps.add(parents[1])
except error.WdirUnsupported:
parents = repo[r].parents()
if len(parents) == 2:
ps.add(parents[1].rev())
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & ps
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'present(set)', safe=True, takeorder=True)
Jun Wu
revset: remove order information from tree (API)...
r34013 def present(repo, subset, x, order):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """An empty set, if any revision in set isn't found; otherwise,
Patrick Mezard
revsets: generate predicate help dynamically
r12821 all revisions in set.
FUJIWARA Katsunori
doc: add detail explanation for 'present()' predicate of revsets
r16748
If any of specified revisions is not present in the local repository,
the query is normally aborted. But this predicate allows the query
to continue even in such cases.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Wagner Bruna
revset: predicate to avoid lookup errors...
r11944 try:
Jun Wu
revset: remove order information from tree (API)...
r34013 return getset(repo, subset, x, order)
Wagner Bruna
revset: predicate to avoid lookup errors...
r11944 except error.RepoLookupError:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Wagner Bruna
revset: predicate to avoid lookup errors...
r11944
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: drop docstring from internal _notpublic() function...
r25224 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_notpublic', safe=True)
Laurent Charignon
revset: optimize not public revset...
r25191 def _notpublic(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, b"_notpublic takes no arguments")
Jun Wu
revset: use phasecache.getrevset...
r31017 return _phase(repo, subset, phases.draft, phases.secret)
Laurent Charignon
revset: optimize not public revset...
r25191
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_phaseandancestors(phasename, set)', safe=True)
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067 def _phaseandancestors(repo, subset, x):
# equivalent to (phasename() & ancestors(set)) but more efficient
# phasename could be one of 'draft', 'secret', or '_notpublic'
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 2, 2, b"_phaseandancestors requires two arguments")
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067 phasename = getsymbol(args[0])
s = getset(repo, fullreposet(repo), args[1])
draft = phases.draft
secret = phases.secret
phasenamemap = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'_notpublic': draft,
b'draft': draft, # follow secret's ancestors
b'secret': secret,
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067 }
if phasename not in phasenamemap:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(b'%r is not a valid phasename' % phasename)
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067
minimalphase = phasenamemap[phasename]
getphase = repo._phasecache.phase
def cutfunc(rev):
return getphase(repo, rev) < minimalphase
revs = dagop.revancestors(repo, s, cutfunc=cutfunc)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if phasename == b'draft': # need to remove secret changesets
Jun Wu
revset: optimize "draft() & ::x" pattern...
r34067 revs = revs.filter(lambda r: getphase(repo, r) == draft)
return subset & revs
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'public()', safe=True)
Pierre-Yves David
phases: implements simple revset symbol...
r15819 def public(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changeset in public phase."""
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "public" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"public takes no arguments"))
Jun Wu
revset: use phasecache.getrevset to calculate public()...
r35331 return _phase(repo, subset, phases.public)
Pierre-Yves David
phases: implements simple revset symbol...
r15819
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'remote([id [,path]])', safe=False)
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 def remote(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Local revision that corresponds to the given identifier in a
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 remote repository, if present. Here, the '.' identifier is a
synonym for the current local branch.
"""
Augie Fackler
formatting: blacken the codebase...
r43346 from . import hg # avoid start-up nasties
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 # i18n: "remote" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 0, 2, _(b"remote takes zero, one, or two arguments"))
q = b'.'
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 if len(l) > 0:
Augie Fackler
formatting: blacken the codebase...
r43346 # i18n: "remote" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 q = getstring(l[0], _(b"remote requires a string id"))
if q == b'.':
q = repo[b'.'].branch()
dest = b''
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 if len(l) > 1:
# i18n: "remote" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 dest = getstring(l[1], _(b"remote requires a repository path"))
revset: use `get_unique_pull_path` for `remote(…)`...
r47718 if not dest:
dest = b'default'
dest, branches = urlutil.get_unique_pull_path(
b'remote', repo, repo.ui, dest
)
Matt Harbison
revset: drop some unused code in the `remote` revset...
r44449
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936 other = hg.peer(repo, {}, dest)
n = other.lookup(q)
if n in repo:
r = repo[n].rev()
FUJIWARA Katsunori
revset: fix 'remote()' failure when remote repo has more revs than local...
r16006 if r in subset:
Lucas Moscovicz
revset: added baseset class (still empty) to improve revset performance...
r20364 return baseset([r])
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Matt Mackall
revset: add remote() predicate to lookup remote revisions
r15936
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'removes(pattern)', safe=True, weight=30)
Matt Mackall
revset: introduce revset core
r11275 def removes(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets which remove files matching pattern.
FUJIWARA Katsunori
revset: add explanation about the pattern without explicit kind...
r20289
The pattern without explicit kind like ``glob:`` is expected to be
relative to the current directory and match against a file or a
directory.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Martin Geisler
revset: add translator comments to i18n strings
r12815 # i18n: "removes" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(x, _(b"removes requires a pattern"))
Yuya Nishihara
revset: remove indirect indexing of status tuple...
r45997 return checkstatus(repo, subset, pat, 'removed')
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'rev(number)', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def rev(repo, subset, x):
Yuya Nishihara
revset: leverage internal _rev() function to implement rev()...
r45075 """Revision with the given numeric identifier."""
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 try:
Yuya Nishihara
revset: leverage internal _rev() function to implement rev()...
r45075 return _rev(repo, subset, x)
except error.RepoLookupError:
Yuya Nishihara
revset: have rev() drop out-of-range or filtered rev explicitly (issue4396)...
r23062 return baseset()
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_rev(number)', safe=True)
Boris Feld
revset: introduce an internal `_rev` predicate for '%d' usage...
r41333 def _rev(repo, subset, x):
# internal version of "rev(x)" that raise error if "x" is invalid
# i18n: "rev" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 1, 1, _(b"rev requires one argument"))
Boris Feld
revset: introduce an internal `_rev` predicate for '%d' usage...
r41333 try:
# i18n: "rev" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = int(getstring(l[0], _(b"rev requires a number")))
Boris Feld
revset: introduce an internal `_rev` predicate for '%d' usage...
r41333 except (TypeError, ValueError):
# i18n: "rev" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"rev expects a number"))
Yuya Nishihara
revset: allow repo.revs('%d', wdirrev)...
r45073 if l not in _virtualrevs:
Yuya Nishihara
revset: fix crash by repo.revs('%d', tip + 1)...
r45074 try:
repo.changelog.node(l) # check that the rev exists
except IndexError:
raise error.RepoLookupError(_(b"unknown revision '%d'") % l)
Boris Feld
revset: introduce an internal `_rev` predicate for '%d' usage...
r41333 return subset & baseset([l])
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'revset(set)', safe=True, takeorder=True)
Boris Feld
revset: document the `revset(...)` syntax...
r40346 def revsetpredicate(repo, subset, x, order):
"""Strictly interpret the content as a revset.
The content of this special predicate will be strictly interpreted as a
revset. For example, ``revset(id(0))`` will be interpreted as "id(0)"
without possible ambiguity with a "id(0)" bookmark or tag.
"""
return getset(repo, subset, x, order)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'matching(revision [, field])', safe=True)
Angel Ezquerra
revset: add "matching" keyword...
r16402 def matching(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets in which a given set of fields match the set of fields in the
Angel Ezquerra
revset: add "matching" keyword...
r16402 selected revision or set.
FUJIWARA Katsunori
doc: flatten description of 'matching()' predicate to be formatted well...
r16528
Angel Ezquerra
revset: add "matching" keyword...
r16402 To match more than one field pass the list of fields to match separated
FUJIWARA Katsunori
doc: flatten description of 'matching()' predicate to be formatted well...
r16528 by spaces (e.g. ``author description``).
Valid fields are most regular revision fields and some special fields.
Regular revision fields are ``description``, ``author``, ``branch``,
Angel Ezquerra
revset: add "diff" field to "matching" keyword...
r17102 ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``
and ``diff``.
Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the
contents of the revision. Two revisions matching their ``diff`` will
also match their ``files``.
FUJIWARA Katsunori
doc: flatten description of 'matching()' predicate to be formatted well...
r16528
Special fields are ``summary`` and ``metadata``:
``summary`` matches the first line of the description.
Jesse Glick
revset: documentation typo "metatadata"
r16639 ``metadata`` is equivalent to matching ``description user date``
FUJIWARA Katsunori
doc: flatten description of 'matching()' predicate to be formatted well...
r16528 (i.e. it matches the main metadata fields).
``metadata`` is the default field which is used when no fields are
specified. You can match more than one field at a time.
Angel Ezquerra
revset: add "matching" keyword...
r16402 """
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "matching" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 l = getargs(x, 1, 2, _(b"matching takes 1 or 2 arguments"))
Angel Ezquerra
revset: add "matching" keyword...
r16402
Pierre-Yves David
revset-matching: call 'getset' on a 'fullreposet'...
r23166 revs = getset(repo, fullreposet(repo), l[0])
Angel Ezquerra
revset: add "matching" keyword...
r16402
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fieldlist = [b'metadata']
Angel Ezquerra
revset: add "matching" keyword...
r16402 if len(l) > 1:
Augie Fackler
formatting: blacken the codebase...
r43346 fieldlist = getstring(
l[1],
# i18n: "matching" is a keyword
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b"matching requires a string as its second argument"),
Augie Fackler
formatting: blacken the codebase...
r43346 ).split()
Angel Ezquerra
revset: add "matching" keyword...
r16402
Angel Ezquerra
revset: add "diff" field to "matching" keyword...
r17102 # Make sure that there are no repeated fields,
# expand the 'special' 'metadata' field type
# and check the 'files' whenever we check the 'diff'
Angel Ezquerra
revset: add "matching" keyword...
r16402 fields = []
for field in fieldlist:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if field == b'metadata':
fields += [b'user', b'description', b'date']
elif field == b'diff':
Angel Ezquerra
revset: add "diff" field to "matching" keyword...
r17102 # a revision matching the diff must also match the files
# since matching the diff is very costly, make sure to
# also match the files first
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fields += [b'files', b'diff']
Angel Ezquerra
revset: add "matching" keyword...
r16402 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if field == b'author':
field = b'user'
Angel Ezquerra
revset: add "matching" keyword...
r16402 fields.append(field)
fields = set(fields)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'summary' in fields and b'description' in fields:
Angel Ezquerra
revset: make matching keyword not match summary when matching for description
r16444 # If a revision matches its description it also matches its summary
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fields.discard(b'summary')
Angel Ezquerra
revset: add "matching" keyword...
r16402
# We may want to match more than one field
Angel Ezquerra
revset: speedup matching() by first matching fields that take less time to...
r16446 # Not all fields take the same amount of time to be matched
# Sort the selected fields in order of increasing matching cost
Augie Fackler
formatting: blacken the codebase...
r43346 fieldorder = [
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'phase',
b'parents',
b'user',
b'date',
b'branch',
b'summary',
b'files',
b'description',
b'substate',
b'diff',
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Angel Ezquerra
revset: speedup matching() by first matching fields that take less time to...
r16446 def fieldkeyfunc(f):
try:
return fieldorder.index(f)
except ValueError:
# assume an unknown field is very costly
return len(fieldorder)
Augie Fackler
formatting: blacken the codebase...
r43346
Angel Ezquerra
revset: speedup matching() by first matching fields that take less time to...
r16446 fields = list(fields)
fields.sort(key=fieldkeyfunc)
Angel Ezquerra
revset: add "matching" keyword...
r16402 # Each field will be matched with its own "getfield" function
# which will be added to the getfieldfuncs array of functions
getfieldfuncs = []
_funcs = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'user': lambda r: repo[r].user(),
b'branch': lambda r: repo[r].branch(),
b'date': lambda r: repo[r].date(),
b'description': lambda r: repo[r].description(),
b'files': lambda r: repo[r].files(),
b'parents': lambda r: repo[r].parents(),
b'phase': lambda r: repo[r].phase(),
b'substate': lambda r: repo[r].substate,
b'summary': lambda r: repo[r].description().splitlines()[0],
b'diff': lambda r: list(
repo[r].diff(opts=diffutil.diffallopts(repo.ui, {b'git': True}))
Augie Fackler
formatting: blacken the codebase...
r43346 ),
Angel Ezquerra
revset: add "matching" keyword...
r16402 }
for info in fields:
getfield = _funcs.get(info, None)
if getfield is None:
raise error.ParseError(
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "matching" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"unexpected field name passed to matching: %s")
Augie Fackler
formatting: blacken the codebase...
r43346 % info
)
Angel Ezquerra
revset: add "matching" keyword...
r16402 getfieldfuncs.append(getfield)
# convert the getfield array of functions into a "getinfo" function
# which returns an array of field values (or a single value if there
# is only one field to match)
Angel Ezquerra
revset: speedup matching() by stopping the match early if a field does not match...
r16445 getinfo = lambda r: [f(r) for f in getfieldfuncs]
Angel Ezquerra
revset: add "matching" keyword...
r16402
Lucas Moscovicz
revset: added lazyset implementation to matching revset...
r20459 def matches(x):
for rev in revs:
target = getinfo(rev)
Angel Ezquerra
revset: speedup matching() by stopping the match early if a field does not match...
r16445 match = True
for n, f in enumerate(getfieldfuncs):
Lucas Moscovicz
revset: added lazyset implementation to matching revset...
r20459 if target[n] != f(x):
Angel Ezquerra
revset: speedup matching() by stopping the match early if a field does not match...
r16445 match = False
if match:
Lucas Moscovicz
revset: added lazyset implementation to matching revset...
r20459 return True
return False
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(matches, condrepr=(b'<matching%r %r>', fields, revs))
@predicate(b'reverse(set)', safe=True, takeorder=True, weight=0)
Yuya Nishihara
revset: make reverse() noop depending on ordering requirement (BC)...
r29945 def reverse(repo, subset, x, order):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Reverse order of set."""
Jun Wu
revset: remove order information from tree (API)...
r34013 l = getset(repo, subset, x, order)
Yuya Nishihara
revset: make reverse() noop depending on ordering requirement (BC)...
r29945 if order == defineorder:
l.reverse()
Matt Mackall
revset: introduce revset core
r11275 return l
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'roots(set)', safe=True)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def roots(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changesets in set with no parent changeset in set."""
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 s = getset(repo, fullreposet(repo), x)
Pierre-Yves David
revset: improves time complexity of 'roots(xxx)'...
r25647 parents = repo.changelog.parentrevs
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
revset: improves time complexity of 'roots(xxx)'...
r25647 def filter(r):
for p in parents(r):
if 0 <= p and p in s:
return False
return True
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset & s.filter(filter, condrepr=b'<roots>')
Wagner Bruna
revset: predicate to avoid lookup errors...
r11944
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: define table of sort() key functions...
r29265 _sortkeyfuncs = {
Yuya Nishihara
revset: fix sorting key of wdir revision...
r46293 b'rev': scmutil.intrev,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'branch': lambda c: c.branch(),
b'desc': lambda c: c.description(),
b'user': lambda c: c.user(),
b'author': lambda c: c.user(),
b'date': lambda c: c.date()[0],
Yuya Nishihara
revset: fix sorting key of wdir revision...
r46293 b'node': scmutil.binnode,
Yuya Nishihara
revset: define table of sort() key functions...
r29265 }
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: extract function that validates sort() arguments...
r29365 def _getsortargs(x):
"""Parse sort options into (set, [(key, reverse)], opts)"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargsdict(x, b'sort', b'set keys topo.firstbranch')
if b'set' not in args:
Martijn Pieters
revset: use getargsdict for sort()...
r29238 # i18n: "sort" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'sort requires one or two arguments'))
keys = b"rev"
if b'keys' in args:
FUJIWARA Katsunori
i18n: add/relocate "i18n keyword" comments for i18n messages in revset.py
r17259 # i18n: "sort" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 keys = getstring(args[b'keys'], _(b"sort spec must be a string"))
Martijn Pieters
revset: use getargsdict for sort()...
r29238
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 keyflags = []
for k in keys.split():
fk = k
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 reverse = k.startswith(b'-')
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 if reverse:
k = k[1:]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if k not in _sortkeyfuncs and k != b'topo':
Augie Fackler
revset: use {force,}bytestr to fix some %r formatting issues...
r36598 raise error.ParseError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"unknown sort key %r") % pycompat.bytestr(fk)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 keyflags.append((k, reverse))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if len(keyflags) > 1 and any(k == b'topo' for k, reverse in keyflags):
Martijn Pieters
revset: add new topographical sort...
r29348 # i18n: "topo" is a keyword
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b'topo sort order cannot be combined with other sort keys')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Martijn Pieters
revset: add new topographical sort...
r29348
Yuya Nishihara
revset: build dict of extra sort options before evaluating set...
r29364 opts = {}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'topo.firstbranch' in args:
if any(k == b'topo' for k, reverse in keyflags):
opts[b'topo.firstbranch'] = args[b'topo.firstbranch']
Martijn Pieters
revset: add new topographical sort...
r29348 else:
# i18n: "topo" and "topo.firstbranch" are keywords
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.ParseError(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'topo.firstbranch can only be used '
b'when using the topo sort key'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Martijn Pieters
revset: add new topographical sort...
r29348
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return args[b'set'], keyflags, opts
Yuya Nishihara
revset: extract function that validates sort() arguments...
r29365
Augie Fackler
formatting: blacken the codebase...
r43346
@predicate(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'sort(set[, [-]key... [, ...]])', safe=True, takeorder=True, weight=10
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: make sort() noop depending on ordering requirement (BC)...
r29946 def sort(repo, subset, x, order):
Yuya Nishihara
revset: extract function that validates sort() arguments...
r29365 """Sort set by keys. The default sort order is ascending, specify a key
as ``-key`` to sort in descending order.
The keys can be:
- ``rev`` for the revision number,
- ``branch`` for the branch name,
- ``desc`` for the commit message (description),
- ``user`` for user name (``author`` can be used as an alias),
- ``date`` for the commit date
- ``topo`` for a reverse topographical sort
revset: add a `node` key for sorting...
r46278 - ``node`` the nodeid of the revision
Yuya Nishihara
revset: extract function that validates sort() arguments...
r29365
The ``topo`` sort order cannot be combined with other sort keys. This sort
takes one optional argument, ``topo.firstbranch``, which takes a revset that
specifies what topographical branches to prioritize in the sort.
"""
s, keyflags, opts = _getsortargs(x)
Jun Wu
revset: remove order information from tree (API)...
r34013 revs = getset(repo, subset, s, order)
Yuya Nishihara
revset: build dict of extra sort options before evaluating set...
r29364
Yuya Nishihara
revset: make sort() noop depending on ordering requirement (BC)...
r29946 if not keyflags or order != defineorder:
Lucas Moscovicz
revset: changed sort method to use native sort implementation of smartsets...
r20719 return revs
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if len(keyflags) == 1 and keyflags[0][0] == b"rev":
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 revs.sort(reverse=keyflags[0][1])
Lucas Moscovicz
revset: changed sort method to use native sort implementation of smartsets...
r20719 return revs
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif keyflags[0][0] == b"topo":
Yuya Nishihara
revset: build dict of extra sort options before evaluating set...
r29364 firstbranch = ()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'topo.firstbranch' in opts:
firstbranch = getset(repo, subset, opts[b'topo.firstbranch'])
Augie Fackler
formatting: blacken the codebase...
r43346 revs = baseset(
dagop.toposort(revs, repo.changelog.parentrevs, firstbranch),
istopo=True,
)
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 if keyflags[0][1]:
Martijn Pieters
revset: add new topographical sort...
r29348 revs.reverse()
return revs
Yuya Nishihara
revset: make sort() do dumb multi-pass sorting for multiple keys (issue5218)...
r29001 # sort() is guaranteed to be stable
ctxs = [repo[r] for r in revs]
Yuya Nishihara
revset: build list of (key, reverse) pairs before sorting...
r29363 for k, reverse in reversed(keyflags):
ctxs.sort(key=_sortkeyfuncs[k], reverse=reverse)
Yuya Nishihara
revset: make sort() do dumb multi-pass sorting for multiple keys (issue5218)...
r29001 return baseset([c.rev() for c in ctxs])
Matt Mackall
revset: introduce revset core
r11275
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'subrepo([pattern])')
Matt Harbison
revset: add the 'subrepo' symbol...
r24446 def subrepo(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """Changesets that add, modify or remove the given subrepo. If no subrepo
Matt Harbison
revset: add the 'subrepo' symbol...
r24446 pattern is named, any subrepo changes are returned.
"""
# i18n: "subrepo" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 0, 1, _(b'subrepo takes at most one argument'))
Yuya Nishihara
revset: define "pat" variable unconditionally in subrepo()...
r28272 pat = None
Matt Harbison
revset: add the 'subrepo' symbol...
r24446 if len(args) != 0:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pat = getstring(args[0], _(b"subrepo requires a pattern"))
m = matchmod.exact([b'.hgsubstate'])
Matt Harbison
revset: add the 'subrepo' symbol...
r24446
def submatches(names):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 k, p, m = stringutil.stringmatcher(pat)
Matt Harbison
revset: add the 'subrepo' symbol...
r24446 for name in names:
if m(name):
yield name
def matches(x):
c = repo[x]
s = repo.status(c.p1().node(), c.node(), match=m)
Yuya Nishihara
revset: define "pat" variable unconditionally in subrepo()...
r28272 if pat is None:
Matt Harbison
revset: add the 'subrepo' symbol...
r24446 return s.added or s.modified or s.removed
if s.added:
Augie Fackler
cleanup: use __builtins__.any instead of util.any...
r25149 return any(submatches(c.substate.keys()))
Matt Harbison
revset: add the 'subrepo' symbol...
r24446
if s.modified:
subs = set(c.p1().substate.keys())
subs.update(c.substate.keys())
for path in submatches(subs):
if c.p1().substate.get(path) != c.substate.get(path):
return True
if s.removed:
Augie Fackler
cleanup: use __builtins__.any instead of util.any...
r25149 return any(submatches(c.p1().substate.keys()))
Matt Harbison
revset: add the 'subrepo' symbol...
r24446
return False
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return subset.filter(matches, condrepr=(b'<subrepo %r>', pat))
Matt Harbison
revset: add the 'subrepo' symbol...
r24446
Augie Fackler
formatting: blacken the codebase...
r43346
Jun Wu
revset: define successors revset...
r33377 def _mapbynodefunc(repo, s, f):
"""(repo, smartset, [node] -> [node]) -> smartset
Helper method to map a smartset to another smartset given a function only
talking about nodes. Handles converting between rev numbers and nodes, and
filtering.
"""
cl = repo.unfiltered().changelog
index: use `index.get_rev` in `revset._mapbynodefunc`...
r43961 torev = cl.index.get_rev
Jun Wu
revset: define successors revset...
r33377 tonode = cl.node
Augie Fackler
cleanup: run pyupgrade on our source tree to clean up varying things...
r44937 result = {torev(n) for n in f(tonode(r) for r in s)}
index: use `index.get_rev` in `revset._mapbynodefunc`...
r43961 result.discard(None)
Jun Wu
revset: define successors revset...
r33377 return smartset.baseset(result - repo.changelog.filteredrevs)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'successors(set)', safe=True)
Jun Wu
revset: define successors revset...
r33377 def successors(repo, subset, x):
Matt Harbison
revset: mark `successors()` experimental...
r45189 """All successors for set, including the given set themselves.
(EXPERIMENTAL)"""
Jun Wu
revset: define successors revset...
r33377 s = getset(repo, fullreposet(repo), x)
f = lambda nodes: obsutil.allsuccessors(repo.obsstore, nodes)
d = _mapbynodefunc(repo, s, f)
return subset & d
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
revset: stop lowercasing the regex pattern for 'author'...
r30782 def _substringmatcher(pattern, casesensitive=True):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, pattern, matcher = stringutil.stringmatcher(
Augie Fackler
formatting: blacken the codebase...
r43346 pattern, casesensitive=casesensitive
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'literal':
Matt Harbison
revset: stop lowercasing the regex pattern for 'author'...
r30782 if not casesensitive:
pattern = encoding.lower(pattern)
matcher = lambda s: pattern in encoding.lower(s)
else:
matcher = lambda s: pattern in s
Simon King
revset: add pattern matching to the 'user' revset expression
r16823 return kind, pattern, matcher
Simon King
revset: add helper function for matching strings to patterns
r16819
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'tag([name])', safe=True)
Augie Fackler
revset: rename tagged() to tag() and allow it to take an optional tag name
r12715 def tag(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """The specified tag by name, or all tagged revisions if no name is given.
Matt Harbison
revset: document the regular expression support for tag(name)...
r20824
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `name`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Patrick Mezard
revsets: generate predicate help dynamically
r12821 """
Martin Geisler
revset: add translator comments to i18n strings
r12815 # i18n: "tag" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = getargs(x, 0, 1, _(b"tag takes one or no arguments"))
Matt Mackall
revset: add tagged predicate
r11280 cl = repo.changelog
Augie Fackler
revset: rename tagged() to tag() and allow it to take an optional tag name
r12715 if args:
Augie Fackler
formatting: blacken the codebase...
r43346 pattern = getstring(
args[0],
# i18n: "tag" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'the argument to tag must be a string'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 kind, pattern, matcher = stringutil.stringmatcher(pattern)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'literal':
Matt Mackall
revset: avoid validating all tag nodes for tag(x)...
r16825 # avoid resolving all tags
tn = repo._tagscache.tags.get(pattern, None)
if tn is None:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.RepoLookupError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"tag '%s' does not exist") % pattern
Augie Fackler
formatting: blacken the codebase...
r43346 )
Martin von Zweigbergk
cleanup: use set literals...
r32291 s = {repo[tn].rev()}
Simon King
revset: add pattern matching to 'tag' revset expression...
r16820 else:
Martin von Zweigbergk
cleanup: use set literals...
r32291 s = {cl.rev(n) for t, n in repo.tagslist() if matcher(t)}
Augie Fackler
revset: rename tagged() to tag() and allow it to take an optional tag name
r12715 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = {cl.rev(n) for t, n in repo.tagslist() if t != b'tip'}
Lucas Moscovicz
revset: added intersection to baseset class...
r20367 return subset & s
Matt Mackall
revset: add tagged predicate
r11280
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'tagged', safe=True)
Patrick Mezard
revsets: generate predicate help dynamically
r12821 def tagged(repo, subset, x):
return tag(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'orphan()', safe=True)
Boris Feld
revset: rename unstable into orphan...
r33769 def orphan(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Non-obsolete changesets with obsolete ancestors. (EXPERIMENTAL)"""
Boris Feld
revset: rename unstable into orphan...
r33769 # i18n: "orphan" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"orphan takes no arguments"))
orphan = obsmod.getrevs(repo, b'orphan')
Boris Feld
obsolete: rename unstable volatile set into orphan volatile set...
r33772 return subset & orphan
Pierre-Yves David
obsolete: compute unstable changeset...
r17171
Matt Harbison
revset: import `unstable()` from the evolve extension...
r45182 @predicate(b'unstable()', safe=True)
def unstable(repo, subset, x):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Changesets with instabilities. (EXPERIMENTAL)"""
Matt Harbison
revset: import `unstable()` from the evolve extension...
r45182 # i18n: "unstable" is a keyword
getargs(x, 0, 0, b'unstable takes no arguments')
_unstable = set()
_unstable.update(obsmod.getrevs(repo, b'orphan'))
_unstable.update(obsmod.getrevs(repo, b'phasedivergent'))
_unstable.update(obsmod.getrevs(repo, b'contentdivergent'))
Yuya Nishihara
revset: remove explicit sort() from unstable()...
r45205 return subset & baseset(_unstable)
Matt Harbison
revset: import `unstable()` from the evolve extension...
r45182
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'user(string)', safe=True, weight=10)
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 def user(repo, subset, x):
FUJIWARA Katsunori
revset: use decorator to register a function as revset predicate...
r27584 """User name contains string. The match is case-insensitive.
Simon King
revset: add pattern matching to the 'user' revset expression
r16823
Matt Harbison
help: eliminate duplicate text for revset string patterns...
r30784 Pattern matching is supported for `string`. See
Yuya Nishihara
help: use :hg: role and canonical name to point to revset string patterns...
r30799 :hg:`help revisions.patterns`.
Matt Mackall
bookmarks: move revset support to core
r13359 """
Idan Kamara
revset: rearrange code so functions are sorted alphabetically
r13915 return author(repo, subset, x)
Matt Mackall
bookmarks: move revset support to core
r13359
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'wdir()', safe=True, weight=0)
Yuya Nishihara
revset: add wdir() function to specify workingctx revision by command...
r24419 def wdir(repo, subset, x):
Yuya Nishihara
revset: document wdir() as an experimental function...
r30701 """Working directory. (EXPERIMENTAL)"""
Yuya Nishihara
revset: add wdir() function to specify workingctx revision by command...
r24419 # i18n: "wdir" is a keyword
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 getargs(x, 0, 0, _(b"wdir takes no arguments"))
Joerg Sonnenberger
node: import symbols explicitly...
r46729 if wdirrev in subset or isinstance(subset, fullreposet):
return baseset([wdirrev])
Yuya Nishihara
revset: add wdir() function to specify workingctx revision by command...
r24419 return baseset()
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _orderedlist(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = getstring(x, b"internal error")
Matt Mackall
revset: optimize building large lists in formatrevspec...
r15898 if not s:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Yuya Nishihara
revset: make internal _list() expression remove duplicated revisions...
r25341 # remove duplicates here. it's difficult for caller to deduplicate sets
# because different symbols can point to the same rev.
Yuya Nishihara
revset: add fast path for _list() of integer revisions...
r25344 cl = repo.changelog
Yuya Nishihara
revset: make internal _list() expression remove duplicated revisions...
r25341 ls = []
seen = set()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for t in s.split(b'\0'):
Yuya Nishihara
revset: add fast path for _list() of integer revisions...
r25344 try:
# fast path for integer revision
r = int(t)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if (b'%d' % r) != t or r not in cl:
Yuya Nishihara
revset: add fast path for _list() of integer revisions...
r25344 raise ValueError
Durham Goode
revset: fix resolving strings from a list...
r26143 revs = [r]
Yuya Nishihara
revset: add fast path for _list() of integer revisions...
r25344 except ValueError:
Jun Wu
revset: remove order information from tree (API)...
r34013 revs = stringset(repo, subset, t, defineorder)
Durham Goode
revset: fix resolving strings from a list...
r26143
for r in revs:
if r in seen:
continue
Augie Fackler
formatting: blacken the codebase...
r43346 if (
r in subset
or r in _virtualrevs
and isinstance(subset, fullreposet)
):
Durham Goode
revset: fix resolving strings from a list...
r26143 ls.append(r)
seen.add(r)
Yuya Nishihara
revset: make internal _list() expression remove duplicated revisions...
r25341 return baseset(ls)
Matt Mackall
revset: optimize building large lists in formatrevspec...
r15898
Augie Fackler
formatting: blacken the codebase...
r43346
Lucas Moscovicz
revset: added _intlist method to replace _list for %ld...
r20566 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_list', safe=True, takeorder=True)
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _list(repo, subset, x, order):
if order == followorder:
# slow path to take the subset order
return subset & _orderedlist(repo, fullreposet(repo), x)
else:
return _orderedlist(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _orderedintlist(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = getstring(x, b"internal error")
Lucas Moscovicz
revset: added _intlist method to replace _list for %ld...
r20566 if not s:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ls = [int(r) for r in s.split(b'\0')]
Pierre-Yves David
revset-_intlist: remove usage of `set()`...
r22876 s = subset
Lucas Moscovicz
revset: added _intlist method to replace _list for %ld...
r20566 return baseset([r for r in ls if r in s])
Augie Fackler
formatting: blacken the codebase...
r43346
Lucas Moscovicz
revset: added _hexlist method to replace _list for %ln...
r20569 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_intlist', safe=True, takeorder=True, weight=0)
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _intlist(repo, subset, x, order):
if order == followorder:
# slow path to take the subset order
return subset & _orderedintlist(repo, fullreposet(repo), x)
else:
return _orderedintlist(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _orderedhexlist(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = getstring(x, b"internal error")
Lucas Moscovicz
revset: added _hexlist method to replace _list for %ln...
r20569 if not s:
Pierre-Yves David
baseset: use default value instead of [] when possible...
r22802 return baseset()
Lucas Moscovicz
revset: added _hexlist method to replace _list for %ln...
r20569 cl = repo.changelog
Joerg Sonnenberger
node: import symbols explicitly...
r46729 ls = [cl.rev(bin(r)) for r in s.split(b'\0')]
Pierre-Yves David
revset-_hexlist: remove usage of `set()`...
r22877 s = subset
Lucas Moscovicz
revset: added _hexlist method to replace _list for %ln...
r20569 return baseset([r for r in ls if r in s])
Matt Mackall
revset: optimize building large lists in formatrevspec...
r15898
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 # for internal use
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @predicate(b'_hexlist', safe=True, takeorder=True)
Yuya Nishihara
revset: fix order of nested '_(|int|hex)list' expression (BC)...
r29935 def _hexlist(repo, subset, x, order):
if order == followorder:
# slow path to take the subset order
return subset & _orderedhexlist(repo, fullreposet(repo), x)
else:
return _orderedhexlist(repo, subset, x)
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
revset: introduce revset core
r11275 methods = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"range": rangeset,
b"rangeall": rangeall,
b"rangepre": rangepre,
b"rangepost": rangepost,
b"dagrange": dagrange,
b"string": stringset,
b"symbol": stringset,
b"and": andset,
b"andsmally": andsmallyset,
b"or": orset,
b"not": notset,
b"difference": differenceset,
b"relation": relationset,
b"relsubscript": relsubscriptset,
b"subscript": subscriptset,
b"list": listset,
b"keyvalue": keyvaluepair,
b"func": func,
b"ancestor": ancestorspec,
b"parent": parentspec,
b"parentpost": parentpost,
b"smartset": rawsmartset,
Matt Mackall
revset: introduce revset core
r11275 }
av6
revset: implement a simple 'foo#generations' expression...
r45204 relations = {
b"g": generationsrel,
b"generations": generationsrel,
}
av6
revset: move subscript relation functions to its own dict...
r40967 subscriptrelations = {
av6
revset: rename generationsrel() to generationssubrel()...
r45203 b"g": generationssubrel,
b"generations": generationssubrel,
av6
revset: move subscript relation functions to its own dict...
r40967 }
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
revset: use revsymbol() for checking if a symbol is valid...
r37368 def lookupfn(repo):
Martin von Zweigbergk
errors: raise InputError if an ambiguous revision id prefix is used...
r46731 def fn(symbol):
try:
return scmutil.isrevsymbol(repo, symbol)
except error.AmbiguousPrefixLookupError:
raise error.InputError(
b'ambiguous revision identifier: %s' % symbol
)
return fn
Martin von Zweigbergk
revset: use revsymbol() for checking if a symbol is valid...
r37368
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass in lookup function instead of repo (API)...
r37692 def match(ui, spec, lookup=None):
Yuya Nishihara
revset: move order argument to run-time match function...
r34020 """Create a matcher for a single revision spec"""
Yuya Nishihara
revset: pass in lookup function to matchany() (issue5879)...
r37992 return matchany(ui, [spec], lookup=lookup)
Yuya Nishihara
revset: add option to make matcher takes the ordering of the input set...
r29955
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: pass in lookup function instead of repo (API)...
r37692 def matchany(ui, specs, lookup=None, localalias=None):
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 """Create a matcher that will include any revisions matching one of the
Yuya Nishihara
revset: add option to make matcher takes the ordering of the input set...
r29955 given specs
Yuya Nishihara
revset: pass in lookup function instead of repo (API)...
r37692 If lookup function is not None, the parser will first attempt to handle
old-style ranges, which may contain operator characters.
Jun Wu
revset: make repo.anyrevs accept customized alias override (API)...
r33336 If localalias is not None, it is a dict {name: definitionstring}. It takes
precedence over [revsetalias] config section.
Yuya Nishihara
revset: add option to make matcher takes the ordering of the input set...
r29955 """
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 if not specs:
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 def mfunc(repo, subset=None):
return baseset()
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 return mfunc
if not all(specs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b"empty query"))
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 if len(specs) == 1:
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 tree = revsetlang.parse(specs[0], lookup)
Yuya Nishihara
revset: add matchany() to construct OR expression from a list of specs...
r25927 else:
Augie Fackler
formatting: blacken the codebase...
r43346 tree = (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'or',
(b'list',) + tuple(revsetlang.parse(s, lookup) for s in specs),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
revset: add public function to create matcher from evaluatable tree...
r29906
Jun Wu
revset: make repo.anyrevs accept customized alias override (API)...
r33336 aliases = []
warn = None
Matt Mackall
revset: allow bypassing alias expansion...
r14900 if ui:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 aliases.extend(ui.configitems(b'revsetalias'))
Jun Wu
revset: make repo.anyrevs accept customized alias override (API)...
r33336 warn = ui.warn
if localalias:
aliases.extend(localalias.items())
if aliases:
tree = revsetlang.expandaliases(tree, aliases, warn=warn)
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 tree = revsetlang.foldconcat(tree)
Jun Wu
revset: remove order information from tree (API)...
r34013 tree = revsetlang.analyze(tree)
Yuya Nishihara
revset: split language services to revsetlang module (API)...
r31024 tree = revsetlang.optimize(tree)
Yuya Nishihara
revset: move order argument to run-time match function...
r34020 return makematcher(tree)
Yuya Nishihara
revset: add public function to create matcher from evaluatable tree...
r29906
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: move order argument to run-time match function...
r34020 def makematcher(tree):
Yuya Nishihara
revset: add public function to create matcher from evaluatable tree...
r29906 """Create a matcher from an evaluatable tree"""
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
revset: make match function follow given subset if specified (API)...
r34021 def mfunc(repo, subset=None, order=None):
if order is None:
if subset is None:
order = defineorder # 'x'
else:
order = followorder # 'subset & x'
Yuya Nishihara
revset: make match function initiate query from full set by default...
r24114 if subset is None:
Yuya Nishihara
revset: specify fullreposet without using spanset factory...
r24115 subset = fullreposet(repo)
Jun Wu
revset: remove order information from tree (API)...
r34013 return getset(repo, subset, tree, order)
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
revset: introduce revset core
r11275 return mfunc
Patrick Mezard
revsets: generate predicate help dynamically
r12821
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
registrar: define revsetpredicate to decorate revset predicate...
r28393 def loadpredicate(ui, extname, registrarobj):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Load revset 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: define revsetpredicate to decorate revset predicate...
r28393 symbols[name] = func
if func._safe:
safesymbols.add(name)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
revset: replace predicate by revsetpredicate of registrar...
r28395 # load built-in predicates explicitly to setup safesymbols
loadpredicate(None, None, predicate)
Patrick Mezard
hggettext: handle i18nfunctions declaration for docstrings translations
r12823 # tell hggettext to extract docstrings from these functions:
i18nfunctions = symbols.values()