--- a/mercurial/help/revisions.txt Wed Jan 11 11:40:40 2017 -0800
+++ b/mercurial/help/revisions.txt Wed Jan 11 11:37:38 2017 -0800
@@ -1,4 +1,7 @@
-Mercurial supports several ways to specify individual revisions.
+Mercurial supports several ways to specify revisions.
+
+Specifying single revisions
+===========================
A plain integer is treated as a revision number. Negative integers are
treated as sequential offsets from the tip, with -1 denoting the tip,
@@ -25,3 +28,163 @@
working directory is checked out, it is equivalent to null. If an
uncommitted merge is in progress, "." is the revision of the first
parent.
+
+Specifying multiple revisions
+=============================
+
+Mercurial supports a functional language for selecting a set of
+revisions.
+
+The language supports a number of predicates which are joined by infix
+operators. Parenthesis can be used for grouping.
+
+Identifiers such as branch names may need quoting with single or
+double quotes if they contain characters like ``-`` or if they match
+one of the predefined predicates.
+
+Special characters can be used in quoted identifiers by escaping them,
+e.g., ``\n`` is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``.
+
+Operators
+=========
+
+There is a single prefix operator:
+
+``not x``
+ Changesets not in x. Short form is ``! x``.
+
+These are the supported infix operators:
+
+``x::y``
+ A DAG range, meaning all changesets that are descendants of x and
+ ancestors of y, including x and y themselves. If the first endpoint
+ is left out, this is equivalent to ``ancestors(y)``, if the second
+ is left out it is equivalent to ``descendants(x)``.
+
+ An alternative syntax is ``x..y``.
+
+``x:y``
+ All changesets with revision numbers between x and y, both
+ inclusive. Either endpoint can be left out, they default to 0 and
+ tip.
+
+``x and y``
+ The intersection of changesets in x and y. Short form is ``x & y``.
+
+``x or y``
+ The union of changesets in x and y. There are two alternative short
+ forms: ``x | y`` and ``x + y``.
+
+``x - y``
+ Changesets in x but not in y.
+
+``x % y``
+ Changesets that are ancestors of x but not ancestors of y (i.e. ::x - ::y).
+ This is shorthand notation for ``only(x, y)`` (see below). The second
+ argument is optional and, if left out, is equivalent to ``only(x)``.
+
+``x^n``
+ The nth parent of x, n == 0, 1, or 2.
+ For n == 0, x; for n == 1, the first parent of each changeset in x;
+ for n == 2, the second parent of changeset in x.
+
+``x~n``
+ The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``.
+
+``x ## y``
+ Concatenate strings and identifiers into one string.
+
+ All other prefix, infix and postfix operators have lower priority than
+ ``##``. For example, ``a1 ## a2~2`` is equivalent to ``(a1 ## a2)~2``.
+
+ For example::
+
+ [revsetalias]
+ issue(a1) = grep(r'\bissue[ :]?' ## a1 ## r'\b|\bbug\(' ## a1 ## r'\)')
+
+ ``issue(1234)`` is equivalent to
+ ``grep(r'\bissue[ :]?1234\b|\bbug\(1234\)')``
+ in this case. This matches against all of "issue 1234", "issue:1234",
+ "issue1234" and "bug(1234)".
+
+There is a single postfix operator:
+
+``x^``
+ Equivalent to ``x^1``, the first parent of each changeset in x.
+
+Predicates
+==========
+
+The following predicates are supported:
+
+.. predicatesmarker
+
+Aliases
+=======
+
+New predicates (known as "aliases") can be defined, using any combination of
+existing predicates or other aliases. An alias definition looks like::
+
+ <alias> = <definition>
+
+in the ``revsetalias`` section of a Mercurial configuration file. Arguments
+of the form `a1`, `a2`, etc. are substituted from the alias into the
+definition.
+
+For example,
+
+::
+
+ [revsetalias]
+ h = heads()
+ d(s) = sort(s, date)
+ rs(s, k) = reverse(sort(s, k))
+
+defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is
+exactly equivalent to ``reverse(sort(0:tip, author))``.
+
+Equivalents
+===========
+
+Command line equivalents for :hg:`log`::
+
+ -f -> ::.
+ -d x -> date(x)
+ -k x -> keyword(x)
+ -m -> merge()
+ -u x -> user(x)
+ -b x -> branch(x)
+ -P x -> !::x
+ -l x -> limit(expr, x)
+
+Examples
+========
+
+Some sample queries:
+
+- Changesets on the default branch::
+
+ hg log -r "branch(default)"
+
+- Changesets on the default branch since tag 1.5 (excluding merges)::
+
+ hg log -r "branch(default) and 1.5:: and not merge()"
+
+- Open branch heads::
+
+ hg log -r "head() and not closed()"
+
+- Changesets between tags 1.3 and 1.5 mentioning "bug" that affect
+ ``hgext/*``::
+
+ hg log -r "1.3::1.5 and keyword(bug) and file('hgext/*')"
+
+- Changesets committed in May 2008, sorted by user::
+
+ hg log -r "sort(date('May 2008'), user)"
+
+- Changesets mentioning "bug" or "issue" that are not in a tagged
+ release::
+
+ hg log -r "(keyword(bug) or keyword(issue)) and not ancestors(tag())"