Задание набора ревизий

Mercurial поддерживает функциональный язык для задания множества ревизий.

Язык поддерживает несколько предикатов, которые объединяются с помощью инфиксных операторов. Для группировки можно использовать круглые скобки.

Различные идентификаторы, такие как имена веток, могут заключаться в одинарные или двойные кавычки, особенно если они содержат такие символы как "-", или если их имена совпадают с именем одного из предопределенных предикатов.

В идентификаторах можно использовать специальные символы, экранируя их. Например "\n" интерпретируется как перевод строки. Чтобы запретить такую интерпретацию, поставьте перед строкой "r", например, "r'...'".

Поддерживается один префиксный оператор:

"not x"
Наборы изменений, не входящие в х. Краткая форма: "! x".

Поддерживаемые инфиксные операторы:

"x::y"
Диапазон на графе ревизий, означающий все ревизии, являющиеся предками y и потомками x, включая x и y. Если первая ревизия опущена, это эквивалентно "ancestors(y)", если вторая ревизия опущена, это эквивалентно "descendants(x)".

Альтернативная форма: "x..y".

"x:y"
Все ревизии с номерами от x до y, включительно. Обе могут быть опущены, по умолчанию считаются 0 и tip соответственно.
"x and y"
Пересечение множеств ревизий x и y. Краткая форма: "x & y".
"x or y"
Объединение множеств ревизий x и y. Возможны две краткие формы: "x | y" и "x + y".
"x - y"
Ревизии, входящие в x, но не в y.
"x^n"
n-ый родитель x, где n == 0, 1 или 2. Если n == 0, соответствует x; если n == 1, то соответствует первому родителю каждой ревизии из x; если n == 2 — второму родителю.
"x~n"
n-ый первый предок x; "x~0" соответствует x; "x~3" - "x^^^".

Существует единственный постфиксный оператор:

"x^"
То же, что "x^1" - первый родитель каждой ревизии из x.

Поддерживаются следующие предикаты:

"adds(шаблон)"
Наборы изменений, добавляющие файл, совпадающий с шаблоном.

Ожидается, что шаблон без явного задания вида, например "glob:", задан относительно текущего каталога и соответствует файлу или каталогу.

"all()"
Все наборы изменений, то же, что "0:tip".
"ancestor(*ревизия)"
Наиболее поздний общий предок наборов изменений.

Принимает 0 или более ревизий. Без аргументов возвращает пустой список. Наиболее поздний общий предок одной ревизии - сама эта ревизия.

"ancestors(множество)"
Наборы изменений, являющиеся предками какого-либо набора изменений из множества.
"author(строка)"
Псевдоним для "user(строка)".
"bisect(строка)"
Наборы изменений, отмеченные состоянием в ходе бисекции:
  • "good", "bad", "skip": явно помеченные как хороший/плохой/пропущенный
  • "goods", "bads" : топологически хорошие/плохие
  • "range" : находящиеся в рамках бисекции
  • "pruned" : goods, bads или пропущенные
  • "untested" : те, чья судьба ещё неизвестна
  • "ignored" : игнорируемые ввиду топологии графа ревизий
  • "current" : обрабатываемый в данный момент
"bookmark([имя])"
Именованная закладка или все закладки.

Если "имя" начинается с "re:", остальная часть имени считается регулярным выражением. Чтобы найти закладку, имя которой начинается с символов "re:", используйте префикс "literal:".

"branch(строка или множество)"
Все наборы изменений, принадлежащие указанной ветке или веткам данных наборов изменений.

Если "строка" начинается с "re:", остальная часть имени считается регулярным выражением. Чтобы найти ветку, имя которой начинается с символов "re:", используйте префикс "literal:".

"branchpoint()"
Наборы изменений, имеющие более одного дочернего набора изменений.
"bumped()"
Изменяемые (mutable) ревизии, помеченные как потомки публичных ревизий.

Только непубличные и неустаревшие ревизии могут быть "bumped".

"bundle()"
Наборы изменений в комплекте.

Комплект должен быть задан с помощью параметра -R.

"children(множество)"
Дочерние наборы изменений для наборов изменений из множества.
"closed()"
Набор изменений, который закрыт.
"contains(шаблон)"
Манифест ревизии содержит файл, совпадающий с шаблоном, (но может не менять его). См. справку по шаблонам имён файлов: "hg help patterns".

Ожидается, что шаблон без явного задания вида, например "glob:", задан относительно текущего каталога и совпадает с именем файла в точности для эффективности поиска.

"converted([id])"
Наборы изменений, сконвертированные из заданного идентификатора в старом хранилище, или все сконвертированные наборы изменений, если идентификатор не указан.
"date(интервал)"
Наборы изменений в интервале дат, см. "hg help dates".
"desc(строка)"
Искать строку в сообщениях фиксации. Регистр букв не учитывается.
"descendants(множество)"
Наборы изменений, являющиеся потомками наборов из множества.
"destination([множество])"
Наборы изменений, созданные с помощью операций graft, transplant или rebase c указанными ревизиями в качестве источников. Если множество ревизий опущено, вместо него предполагается all().
"divergent()"
Последние потомки ревизий, имеющих альтернативный набор последних потомков.
"draft()"
Набор изменений в черновой фазе.
"extinct()"
Устаревший набор изменений, имеющий только устаревших потомков.
"extra(label, [значение])"
Наборы изменений с заданной меткой в дополнительных метаданных и с заданным значением (необязательным).

Если "значение" начинается с "re:", остальная часть значения считается регулярным выражением. Чтобы найти значение, которое начинается с символов "re:", используйте префикс "literal:".

"file(шаблон)"
Наборы изменений, затрагивающие файлы, совпадающие с шаблоном.

Для более быстрого, но не столь точного результата, используйте "filelog()".

Предикат использует вид шаблона "glob:" по умолчанию.

"filelog(шаблон)"
Наборы изменений, связанные с указанным объектом filelog.

Из соображений производительности, проверяет только ревизии, упомянутые в истории файла, а не фильтруя все наборы изменений (намного быстрее, но не включает удаления и дублирующие изменения). Для медленного, более точного результата используйте "file()".

Ожидается, что шаблон без явного задания вида, например "glob:", задан относительно текущего каталога и совпадает с именем файла в точности для эффективности поиска.

"first(множество, [n])"
Псевдоним для limit().
"follow([файл])"
Псевдоним для "::." (предки первого родителя рабочей копии). Если указано имя файла, прослеживается вся история данного файла, включая копии.
"grep(регулярное_выражение)"
То же, что "keyword(строка)", но принимает регулярное выражение. Используйте "grep(r'...')", чтобы включить в выражение специальные символы. В отличие от "keyword(строка)", регистр букв учитывается.
"head()"
Набор изменений, являющийся головой именованной ветки.
"heads(множество)"
Элементы множества, у которых в этом множестве нет детей.
"hidden()"
Скрытые наборы изменений.
"id(строка)"
Ревизия, однозначно идентифицируемая данным шестнадцатеричным префиксом.
"keyword(строка)"
Искать строку в сообщениях фиксации, именах пользователей, именах изменённых файлов. Регистр букв не учитывается.
"last(множество, [n])"
Последние n элементов множества. По умолчанию 1 элемент.
"limit(множество, [n])"
Первые n элементов множества. По умолчанию 1 элемент.
"matching(ревизия [, поле])"
Наборы изменений, в которых заданный набор полей совпадает с набором полей в выбранной ревизии или множестве ревизий.

Для поиска ревизий с несколькими совпадающими полями, задайте список имен, полей, разделенных пробелами (например, "author description").

В качестве полей могут выступать "обычные" поля ревизий, а также несколько особых полей.

"Обычные" поля ревизий: "description", "author", "branch", "date", "files", "phase", "parents", "substate", "user" и "diff". (описание, автор, ветка, дата, файлы, фаза, родители, состояние, еще раз автор-пользователь, и различия). Обратите внимание, что "author" and "user" являются синонимами. "diff" означает содержимое ревизии. У двух ревизий, совпадающих с заданным "diff", совпадут также и "files".

Особыми полями являются "summary" and "metadata": "summary" соответствует первой строке описания. "metadata" эквивалентно совпадению "description user date" (т.е. это основные поля метаданных).

"metadata" используется по умолчанию, когда не указано ни одного поля. Можно искать по нескольким полям за раз.

"max(множество)"
Набор изменений с наибольшим номером ревизии из множества.
"merge()"
Набор изменений, являющийся ревизией слияния.
"min(множество)"
Набор изменений с наименьшим номером ревизии из множества.
"modifies(шаблон)"
Наборы изменений, изменяющие файлы, совпадающие с шаблоном.

Ожидается, что шаблон без явного задания вида, например "glob:", задан относительно текущего каталога и соответствует файлу или каталогу.

"obsolete()"
Изменяемый набор изменений, имеющий более новую версию.
"only(множество, [множество])"
Предки первого множества, которые не являются предками любой другой головы в хранилище. Если задано второе множество, то результат - это предки первого множества, не являющиеся предками второго (т.е., ::<множество1> - ::<множество2>).
"origin([множество])"
Наборы изменений, которые были заданы в качестве исходных для операций graft, rebase или transplant, создавших указанные ревизии. Если множество не задано, предполагается all(). Если набор изменений, созданный этими операциями, указан в качестве источника для одной из этих операций, будет выбран только исходный набор изменений для первой операции.
"outgoing([путь])"
Наборы изменений, отсутствующие в указанном целевом хранилище, или в месте для проталкивания по умолчанию.
"p1([множество])"
Первый родитель для всех наборов изменений из множества или для рабочего каталога.
"p2([множество])"
Второй родитель для всех наборов изменений из множества или для рабочего каталога.
"parents([множество])"
Множество всех родителей для всех наборов изменений из множества или для рабочего каталога.
"present(множество)"
Пустое множество, если какая-либо ревизия из множества не найдена. Иначе все ревизии из множества.

Если любая из заданных ревизий отсутствует в локальном хранилище, выполнение запроса обычно прерывается. Этот же предикат позволяет продолжить выполнение запроса даже в таких случаях.

"public()"
Набор изменений в публичной фазе.
"remote([id [,path]])"
Локальная ревизия, соответствующая указанному идентификатору в отдалённом хранилище, если такая существует. Идентификатор '.' является здесь синонимом текущей локальной ветки.
"removes(шаблон)"
Наборы изменений, удаляющие файлы, совпадающие с шаблоном.

Ожидается, что шаблон без явного задания вида, например "glob:", задан относительно текущего каталога и соответствует файлу или каталогу.

"rev(число)"
Ревизия с указанным числовым идентификатором.
"reverse(множество)"
Элементы множества в обратном порядке.
"roots(множество)"
Наборы изменений из множества, не имеющие родителя во множестве.
"secret()"
Набор изменений в секретной фазе.
"sort(множество[, [-]ключ...])"
Сортировать множество по ключам. Порядок по умолчанию — возрастающий, укажите "-ключ", чтобы отсортировать в убывающем порядке.

В качестве ключа можно указать:

  • "rev" для сортировки по номеру ревизии,
  • "branch" по имени ветки,
  • "desc" по сообщению фиксации,
  • "user" по имени пользователя (то же, что "author"),
  • "date" по дате фиксации
"tag([имя])"
Именованная метка или все помеченные ревизии, если имя не указано.

Если "имя" начинается с "re:", остальная часть имени считается регулярным выражением. Чтобы найти метку, имя которой начинается с символов "re:", используйте префикс "literal:".

"unstable()"
Неустаревшие наборы изменений с устаревшими предками.
"user(строка)"
Имя пользователя содержит строку. Регистр букв не учитывается.

Если "строка" начинается с "re:", остальная часть имени считается регулярным выражением. Чтобы найти пользователя, имя которого начинается с символов "re:", используйте префикс "literal:".

Можно определить новые предикаты (известные как псевдонимы или "алиасы"), используя любые комбинации существующих предикатов или псевдонимов. Определение псевдонима имеет вид:

<псевдоним> = <определение>

в секции "revsetalias" конфига Mercurial. Аргументы вида "$1", "$2" и т.д. передаются из псевдонима в его определение.

Например,

[revsetalias]
h = heads()
d($1) = sort($1, date)
rs($1, $2) = reverse(sort($1, $2))

определяет три псевдонима, "h", "d" и "rs". "rs(0:tip, автор)" - это ровно то же самое, что "reverse(sort(0:tip, автор))".

Аналоги командной строки для "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)

Примеры запросов: