Использование шаблонов
Mercurial позволяет вам настраивать вывод команд с помощью шаблонов.
Вы можете либо передать шаблон,
либо выбрать существующий шаблон-стиль в командной строке с помощью
параметра --template.
Можно настроить вывод для любой команды, похожей на log: log,
outgoing, incoming, tip, parents и heads.
Некоторые встроенные стили поставляются с Mercurial. Их можно посмотреть
с помощью "hg log --template list". Пример использования:
$ hg log -r1.0::1.1 --template changelog
Шаблон - это текст с разметкой, позволяющей выполнять подстановку
переменных:
$ hg log -r1 --template "{node}\n"
b56ce7b07c52de7d5fd79fb89701ea538af65746
Строки в фигурных скобках называются ключевыми словами. Ключевые
слова доступны в зависимости от контекста, в котором применяется
шаблон. Эти ключевые слова как правило доступны в шаблонах для
команд, похожих на log:
- author
- Строка. Неизмененный автор набора изменений.
- bisect
- Строка. Состояние поиска делением пополам (bisect) набора изменений.
- bookmarks
- Список строк. Все закладки, ассоциированные с набором изменений.
- branch
- Строка. Имя ветки, на которую был зафиксирован набор изменений.
- children
- Список строк. Дочерние ревизии набора изменений.
- currentbookmark
- Строкa. Активная закладка, если она установлена на набор изменений.
- date
- Информация о дате. Дата фиксации набора изменений.
- desc
- Строка. Текст описания набора изменений.
- diffstat
- Строка. Статистика изменений в следующем формате: "измененные файлы: +добавленных/-удаленных строк"
- extras
- Список словарей с парами ключ-значение из поля 'extras' текущего набора изменений.
- file_adds
- Список строк. Файлы, добавленные этим набором изменений.
- file_copies
- Список строк. Файлы, скопированные в этом наборе изменений, вместе с их источниками.
- file_copies_switch
- Список строк. То же, что "file_copies", но отображается только если была установлена опция --copied.
- file_dels
- Список строк. Файлы, удаленные этим набором изменений.
- file_mods
- Список строк. Файлы, измененные этим набором изменений.
- files
- Список строк. Все файлы, измененные, добавленные или удаленные этим набором изменений.
- latesttag
- Строка. Последняя глобальная метка среди предков данного набора изменений.
- latesttagdistance
- Целое число. Самый длинный путь до последней метки.
- node
- Строка. Хэш набора изменений в виде 40-значной шестнадцатеричной строки.
- p1node
- Строка. Хэш первого родителя набора изменений в виде 40-значного шестнадцатиричного числа. Если у данного набора изменений родителя нет, все цифры равны 0.
- p1rev
- целое число. Локальный номер ревизии первого родителя набора изменений, либо -1, если родителей у него нет.
- p2node
- Строка. Хэш второго родителя набора изменений в виде 40-значного шестнадцатиричного числа. Если у данного набора изменений второго родителя нет, все цифры равны 0.
- p2rev
- целое число. Локальный номер ревизии второго родителя набора изменений, либо -1, если второго родителе у него нет.
- parents
- Список строк. Родители ревизии в формате "номер ревизии:хэш". Если набор изменений имеет только одного "естественного" родителя (предшествующая ревизия), ничего не показывается.
- phase
- Строка. Имя фазы набора изменений.
- phaseidx
- Целое число. Индекс фазы набора изменений.
- rev
- Целое число. Локальный номер ревизии в этом хранилище.
- subrepos
- Список строк. Подхранилища, обнавленные в наборе изменений.
- tags
- Список строк. Все метки, ассоциированные с набором изменений.
Ключевое слово "date" не создает читаемого вывода. Если вы хотите
использовать дату в выходном тексте, можно использовать для этого
фильтр. Фильтры - это функции, которые возвращают строку, основанную
на входной переменной. Убедитесь, что сначала используется фильтр,
преобразующий входные значения в строки, если вы хотите применить
фильтр, принимающий на вход строку, к входной переменной типа список.
Можно также использовать цепочку фильтров для получения желаемого
результата:
$ hg tip --template "{date|isodate}\n"
2008-08-21 18:22 +0000
Список фильтров (вход, описание):
- addbreaks
- Произвольный текст. Добавляет XHTML-тег "<br />" перед окончанием каждой строки кроме последней.
- age
- Дата. Возвращает читаемый интервал дат/времени между данной датой/временем и текущей датой/временем.
- basename
- Произвольный текст. Интерпретирует текст как путь и возвращает последний его компонент после разбиения по разделителям пути (игнорируя разделители на конце). Например, "foo/bar/baz" преобразуется в "baz", а "foo/bar//" - в "bar".
- date
- Дата. Возвращает дату в формате Unix, включая часовой пояс: "Mon Sep 04 15:13:13 2006 0700".
- domain
- Произвольный текст. Ищет первую строку, которая выглядит как email-адрес, и вычленяет из нее домен. Пример: "User <user@example.com>" преобразуется в "example.com".
- email
- Произвольный текст. Выделяет первую строку, которая выглядит как email-адрес. Пример: "User <user@example.com>" преобразуется в "user@example.com".
- emailuser
- Произвольный текст. Возвращает пользователя из email-адреса.
- escape
- Произвольный текст. Заменяет спецсимволы XML/XHTML "&", "<" и ">" соответствующими сущностями XML и отфильтровывает NUL-символы.
- fill68
- Произвольный текст. Делает строки не длиннее 68 символов.
- fill76
- Произвольный текст. Делает строки не длиннее 76 символов.
- firstline
- Произвольный текст. Возвращает первую строку текста.
- hex
- Произвольный текст. Преобразует двоичный идентификатор ревизии в длинную шестнадцатеричную форму.
- hgdate
- Дата. Возвращает дату в виде пары чисел: "1157407993 25200" (метка времени Unix, смещение часового пояса).
- isodate
- Дата. Возвращает дату в формате ISO 8601: "2009-08-18 13:00 +0200".
- isodatesec
- Дата. Возвращает дату в формате ISO 8601 включая секунды: "2009-08-18 13:00:13 +0200". См. также фильтр rfc3339date.
- localdate
- Дата. Преобразует дату в локальный формат.
- nonempty
- Произвольный текст. Возвращает '(none)' если входная строка пуста.
- obfuscate
- Произвольный текст. Возвращает входной текст в виде последовательности XML-сущностей.
- person
- Произвольный текст. Возвращает имя перед email-адресом, интерпретируя его согласно RFC 5322.
- rfc3339date
- Дата. Возвращает дату в Internet-формате, описанном в RFC 3339: "2009-08-18T13:00:13+02:00".
- rfc822date
- Дата. Возвращает дату, используя формат заголовков email-сообщений: "Tue, 18 Aug 2009 13:00:13 +0200".
- short
- Хэш набора изменений. Возвращает хэш набора изменений в сокращенной форме, т.е. строку из 12 шестнадцатеричных символов.
- shortbisect
- Произвольный текст. Воспринимает "текст" как статус бисекции и возвращает одну букву, представляющую статус (G: good (хорошая), B: bad (плохая), S: skipped (пропущена), U: untested (не тестировалась), I: ignored (игнорирована). Возвращает один пробел, если "текст" не является корректным статусом бисекции.
- shortdate
- Дата. Возвращает дату в виде "2006-09-18".
- splitlines
- Произвольный текст. Разбивает текст в список строк.
- stringify
- Любой тип. Превращает значение в текст, путем конвертации значений в текст и их объединения.
- strip
- Произвольный текст. Удаляет ведущие и замыкающие пробельные символы.
- stripdir
- Считает входной текст путем файловой системы и по возможности удаляет последний уровень каталога. Например, "foo" и "foo/bar" преобразуются в "foo".
- tabindent
- Произвольный текст. Возвращает текст, каждая непустая строка которого, кроме первой, начинается с символа табуляции.
- urlescape
- Произвольный текст. Экранирует все "специальные" символы. Например, "foo bar" превращается в "foo%20bar".
- user
- Произвольный текст. Возвращает короткий вариант имени пользователя или email-адреса.
Обратите внимание, что фильтр это просто вызов функции, т.е.
"expr|filter" эквивалентно "filter(expr)".
В дополнение к фильтрам, существует несколько встроенных функций:
- date(дата[, формат])
- fill(текст[, ширина])
- get(словарь, ключ)
- if(выражение, то[, иначе])
- ifcontains(выражение, выражение, то[, иначе])
- ifeq(выражение, выражение, то[, иначе])
- join(список, разделитель)
- label(метка, выражение)
- pad(text, width[, fillchar, right])
- revset(запрос[, формат])
- rstdoc(текст, стиль)
- shortest(узел)
- startswith(строка, текст)
- strip(текст[, символы])
- sub(шабл, замена, выражение)
- word(число, текст[, разделитель])
Также, для любого выражения, возвращающего список, есть оператор:
Примеры шаблонов в командной строке:
- Форматирование списков, например, файлов:
$ hg log -r 0 --template "files:\n{files % ' {file}\n'}"
- Объединить список файлов символами ", ":
$ hg log -r 0 --template "files: {join(files, ', ')}\n"
- Изменить каждую строку описания ревизии:
$ hg log --template "{splitlines(desc) % '**** {line}\n'}"
- Форматирование даты:
$ hg log -r 0 --template "{date(date, '%Y')}\n"
- Выводить описание так, чтобы оно занимало 30 символов:
$ hg log -r 0 --template "{fill(desc, '30')}"
- Использование условия для проверки, является ли ветка основной:
$ hg log -r 0 --template "{ifeq(branch, 'default', 'on the main branch',
'on branch {branch}')}\n"
- Добавить перенос строки, если значение не пустое:
$ hg tip --template "{if(author, '{author}\n')}"
- Пометить вывод для использования с расширением color:
$ hg log -r 0 --template "{label('changeset.{phase}', node|short)}\n"
- Инвертировать фильтр первой строки, т.е. все, кроме первой строки:
$ hg log -r 0 --template "{sub(r'^.*\n?\n?', '', desc)}\n"
- Показать содержимое поля 'extra', по одному на строку:
$ hg log -r 0 --template "{join(extras, '\n')}\n"
- Пометить текущую закладку звездочкой '*':
$ hg log --template "{bookmarks % '{bookmark}{ifeq(bookmark, current, \"*\")} '}\n"
- Пометить рабочую копию родителя собакой '@':
$ hg log --template "{ifcontains(rev, revset('.'), '@')}\n"
- Показывать только описания ревизий, начинающиеся с "шаблона":
$ hg log --template "{startswith(\"template\", firstline(desc))}\n"
- Напечатать первое слово каждой строки сообщения фиксации:
$ hg log --template "{word(\"0\", desc)}\n"