Source

hgbook-ru / ru / ch11-template.xml

<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->

<chapter id="chap:template">
  <?dbhtml filename="customizing-the-output-of-mercurial.html"?>
  <title>Настройка вывода Mercurial</title>

  <para id="x_578">Mercurial предоставляет мощный механизм позволяющий контролировать как будет выводиться информация. Механизм базируется на шаблонах. Вы можете использовать шаблоны для генерации специфичного вывода одной команды или настроить весь вывод встроенного web интерфейса.</para>

  <sect1 id="sec:style">
    <title>Использование предустановленых стилей</title>

    <para id="x_579">Пакет Mercurial поставляется с некоторыми стилями вывода, которые вы можете использовать незамедлительно. Стиль &emdash; просто предустановленный шаблон, который кто-то написал и установил где-либо и который может найти Mercurial.</para>

    <para id="x_57a">До того как мы рассмотрим встроенные стили, давайте взглянем на обычный вывод.</para>

    &interaction.template.simple.normal;

    <para id="x_57b">Это информативно, но занимает довольно много места &emdash; пять линий на набор изменений. Стиль <literal>compact</literal> уменьшает это до трех линий, представленных в разреженном виде.</para>

    &interaction.template.simple.compact;

    <para id="x_57c">Стиля <literal>changelog</literal> показывает выразительность и мощь шаблонного движка в Mercurial. Стиль следует принципам проекта GNU для отображения changelog<citation>web:changelog</citation>.</para>

    &interaction.template.simple.changelog;

    <para id="x_57d">Вы не будете шокированы, узнав, что стиль вывода Mercurial по умолчанию называется <literal>default</literal>.</para>

    <sect2>
      <title>Установка стиля по умолчанию</title>

      <para id="x_57e">Вы можете изменить стиль вывода, который Mercurial будет использовать для каждой команды, редактируя файл <filename role="special">~/.hgrc</filename>, указав стиль который вы предпочитаете использовать.</para>

      <programlisting>[ui]
style = compact</programlisting>

      <para id="x_57f">Если вы напишете свой стиль, вы можете использовать его, либо указав путь к файлу стиля или скопировав файл стиля в папку, в которой mercurial сможете его найти (как правило, шаблоны расположены в поддиректории <literal>templates</literal> того каталога, куда установлен Mercurial).</para>
    </sect2>
  </sect1>

  <sect1>
    <title>Команды, которые поддерживают стили и шаблоны</title>

    <para id="x_580">Все команды Mercurial <quote>похожие на <literal>log</literal></quote> позволяют использовать стили и шаблоны: <command role="hg-cmd">hg incoming</command>, <command role="hg-cmd">hg log</command>, <command role="hg-cmd">hg outgoing</command>, и <command role="hg-cmd">hg tip</command>.</para>

    <para id="x_581">Когда я писал это руководство, только эти команды, поддерживали стили и шаблоны. Поскольку это наиболее важные команды, у которых должен настраиваться вывод, давление со стороны сообщества Mercurial по поводу возможности пользователю добавлять стили и шаблоны для других команд было небольшим.</para>
  </sect1>

  <sect1>
    <title>Основы шаблонизации</title>

    <para id="x_582">В самом простом случае шаблон mercurial это фрагмент текста. Часть текста не меняется, в то время как другая часть <emphasis>развёртывается</emphasis> и заменяется новым текстом, в случае необходимости.</para>

    <para id="x_583">Для начала давайте посмотрим, как обычно Mercurial оформляет вывод.</para>

    &interaction.template.simple.normal;

    <para id="x_584">Теперь, давайте выполним ту же команду, но с использованием шаблона для изменяющего данный вывод.</para>

    &interaction.template.simple.simplest;

    <para id="x_585">Приведенный выше пример иллюстрирует простейший шаблон, это просто статичный текст, напечатанный один раз для каждой ревизии. Опция <option role="hg-opt-log">--template</option> команды <command role="hg-cmd">hg log</command> говорит Mercurial использовать данный текст в качестве шаблона при печати каждой ревизии.</para>

    <para id="x_586">Обратите внимание, что строки шаблона заканчиваются текстом <quote><literal>\n</literal></quote>. Это у<emphasis>правляющая последовательность</emphasis>, говорящая Mercurial печатать новую строку в конце каждого пункта шаблона. Если вы пропустите этот символ новой строки, Mercurial будет печатать все блоки на одной строке. Смотрите раздел <xref linkend="sec:template:escape"/>; для более подробной информации о управляющих последовательностях.</para>

    <para id="x_587">Шаблон, который выводит фиксированную строку текста все время не очень полезен, давайте попробуем что-нибудь более сложное.</para>

    &interaction.template.simple.simplesub;

    <para id="x_588">Как видите, строка <quote><literal>{desc}</literal></quote>> в шаблоне заменяется на выходе описанием каждой ревизии. Каждый раз, когда Mercurial читает, текст, заключенный в фигурные скобки (<quote><literal>{</literal></quote> и <quote><literal>}</literal></quote>), он будет пытаться заменить фигурные скобки и текст подставляя все, что внутри. Для печати символа фигурной скобки, вы должны экранировать ее, как описано в разделе <xref linkend="sec:template:escape"/>.</para>
  </sect1>

  <sect1 id="sec:template:keyword">
    <title>Обычные ключевые слова шаблонов</title>

    <para id="x_589">Вы можете начать писать простые шаблоны, сразу же с помощью ключевых слов указанных ниже.</para>

    <itemizedlist>
      <listitem><para id="x_58a"><literal role="template-keyword">author</literal>: string. Неизменяемый автор ревизии.</para>
      </listitem>
      <listitem><para id="x_58b"><literal role="template-keyword">branches</literal>: string. Название ветки, в которой была зафиксирована ревизия. Будет пустым, если имя ветки <literal>default</literal>.</para>
      </listitem>
      <listitem><para id="x_58c"><literal role="template-keyword">date</literal>: Дата. Дата, когда была зафиксирована ревизия. Эта дата <emphasis>не</emphasis> человекочитаема, надо пропустить её через фильтр, чтобы отобразить её соответствующим образом. Смотрите раздел <xref linkend="sec:template:filter"/> для получения дополнительной информации об этих фильтрах. Дата выражается в виде пары чисел. Первое метка времени Unix UTC (в секундах с 1 января 1970); второе является смещением часового пояса коммиттера от UTC в секундах.</para>
      </listitem>
      <listitem><para id="x_58d"><literal role="template-keyword">desc</literal>: string. Текст описания ревизии.</para>
      </listitem>
      <listitem><para id="x_58e"><literal role="template-keyword">files</literal>: Список строк. Все файлы, измененные, добавленные или удаленные в этой ревизии.</para>
      </listitem>
      <listitem><para id="x_58f"><literal role="template-keyword">file_adds</literal>: Список строк. Файлы, добавляемые в этой ревизии.</para>
      </listitem>
      <listitem><para id="x_590"><literal role="template-keyword">file_dels</literal>: Список строк. Файлы, удаляемые в этой ревизии.</para>
      </listitem>
      <listitem><para id="x_591"><literal role="template-keyword">node</literal>: string. Идентификационный хеш ревизии, 40-символьная шестнадцатеричная строка.</para>
      </listitem>
      <listitem><para id="x_592"><literal role="template-keyword">parents</literal>: Список строк. Родители ревизии.</para>
      </listitem>
      <listitem><para id="x_593"><literal role="template-keyword">rev</literal>: Число. Номер ревизии локальный для репозитория.</para>
      </listitem>
      <listitem><para id="x_594"><literal role="template-keyword">tags</literal>: Список строк. Любые теги, связанные с ревизией.</para>
      </listitem>
    </itemizedlist>

    <para id="x_595">Несколько простых экспериментов покажет нам, чего ожидать, когда мы используем эти слова, вы можете увидеть результаты ниже.</para>

    &interaction.template.simple.keywords;

    <para id="x_596">Как мы уже отмечали выше, ключевое слово date выводит не человекочитаемый текст, поэтому мы должны обрабатывать его специально. Это связано с использованием <emphasis>фильтров</emphasis>, о которых смотрите в разделе <xref linkend="sec:template:filter"/>.</para>

    &interaction.template.simple.datekeyword;
  </sect1>

  <sect1 id="sec:template:escape">
    <title>Escape последовательности</title>

    <para id="x_597">Движок шаблонов Mercurial распознаёт наиболее часто используемые управляющие последовательности в строках. Когда он видит символ обратной косой черты (<quote><literal>\</literal></quote>), он читает следующий символ и заменяет 2 символа на один, как описано ниже.</para>

    <itemizedlist>
      <listitem><para id="x_598"><literal>\</literal>: Обратная косая черта, <quote><literal>\</literal></quote>, ASCII 134.</para>
      </listitem>
      <listitem><para id="x_599"><literal>\n</literal>: Перевод строки, ASCII 12.</para>
      </listitem>
      <listitem><para id="x_59a"><literal>\r</literal>: Возврат каретки, ASCII 15.</para>
      </listitem>
      <listitem><para id="x_59b"><literal>\t</literal>: Табуляция, ASCII 11.</para>
      </listitem>
      <listitem><para id="x_59c"><literal>\v</literal>: Вертикальная табуляция, ASCII 13.</para>
      </listitem>
      <listitem><para id="x_59d"><literal>\{</literal>: Открывающая фигурная скобка, <quote><literal>{</literal></quote>, ASCII 173.</para>
      </listitem>
      <listitem><para id="x_59e"><literal>\}</literal>: Закрывающая фигурная скобка, <quote><literal>}</literal></quote>, ASCII 175.</para>
      </listitem></itemizedlist>

    <para id="x_59f">Как указано выше, если вы хотите при развёртывании шаблона использовать символы <quote><literal>\</literal></quote>, <quote><literal>{</literal></quote> или <quote><literal>}</literal></quote>, вы должны экранировать их.</para>
  </sect1>

  <sect1 id="sec:template:filter">
    <title>Фильтрация ключевых слов, чтобы отобразить результат</title>

    <para id="x_5a0">Некоторые из результатов расширения шаблона не просты в использовании. Mercurial позволяет указать необязательную цепочку <emphasis>фильтров</emphasis>, чтобы изменить результат расширения ключевого слова. Вы уже видели, общий фильтр, <literal role="template-kw-filt-date">isodate</literal>, в действии выше, чтобы сделать дату читаемой.</para>

    <para id="x_5a1">Ниже приведен список наиболее часто используемых фильтров, которые поддерживает Mercurial. Некоторые фильтры могут быть применены к любому тексту, а другие могут быть использованы только в конкретных обстоятельствах. За именем каждого фильтра ниже сначала следует описание, где он может быть использован, а потом описание его действия.</para>

    <itemizedlist>
      <listitem><para id="x_5a2"><literal role="template-filter">addbreaks</literal>: Любой текст. Добавляет тег XHTML <quote><literal>&lt;br/&gt;</literal></quote> перед концом каждой строки, кроме последней. Например, <quote><literal>foo\nbar</literal></quote> преобразуется в <quote><literal>foo&lt;br/&gt;\nbar</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a3"><literal role="template-kw-filt-date">age</literal>: ключевое слово <literal role="template-keyword">date</literal>. Формирует интервал времени который прошел со времени ревизии до текущего времени. Возвращает строку типа <quote><literal>10 minutes</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a4"><literal role="template-filter">basename</literal>: Любой текст, но наиболее полезна для работы с ключевым словом <literal role="template-keyword">files</literal> и похожими. Применённый к пути файла, и верней имя файла. Например, <quote><literal>foo/bar/baz</literal></quote> преобразуется в <quote><literal>baz</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a5"><literal role="template-kw-filt-date">date</literal>: ключевое слово <literal role="template-keyword">date</literal>. Формирует дату в том же формате, что и команда Unix <literal role="template-keyword">date</literal>, но с указанием часового пояса. Возвращает строку, например <quote><literal>Mon Sep 04 15:13:13 2006 -0700</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a6"><literal role="template-kw-filt-author">domain</literal>: Любой текст, но наиболее полезно для ключевого слова <literal role="template-keyword">author</literal>. Находит первую строку, которая выглядит как адрес электронной почты, и извлекает только доменную часть. Например, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote>  преобразуется в <quote><literal>serpentine.com</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a7"><literal role="template-kw-filt-author">email</literal>: Любой текст, но наиболее полезно для ключевого слова <literal role="template-keyword">author</literal>. Находит первую строку, которая выглядит как адрес электронной почты, и извлекает email. Например, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote>  преобразуется в <quote><literal>bos@serpentine.com</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5a8"><literal role="template-filter">escape</literal>: Любой текст. Заменяет спецсимволы XML/XHTML <quote><literal>&amp;</literal></quote>, <quote><literal>&lt;</literal></quote> и <quote><literal>&gt;</literal></quote> на XML-entities.</para>
      </listitem>
      <listitem><para id="x_5a9"><literal role="template-filter">fill68</literal>: Любой текст. Разбивает текст чтоб он помещался в 68 колонок. Это полезно, сделать перед тем как передать текст на фильтр <literal role="template-filter">tabindent</literal>, если мы все еще хотим, чтобы он помещается в 80 колонок фиксированного шрифта окна.</para>
      </listitem>
      <listitem><para id="x_5aa"><literal role="template-filter">fill76</literal>: Любой текст. Разбивает текст чтоб он помещался в 76 колонок.</para>
      </listitem>
      <listitem><para id="x_5ab"><literal role="template-filter">firstline</literal>: Любой текст. Возвращает первую строку текста, без завершающих строк.</para>
      </listitem>
      <listitem><para id="x_5ac"><literal role="template-kw-filt-date">hgdate</literal>: ключевое слово <literal role="template-keyword">date</literal>. Генерирует дату, как пара читаемых чисел. Возвращает строку вида <quote><literal>1157407993 25200</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5ad"><literal role="template-kw-filt-date">isodate</literal>: ключевое слово <literal role="template-keyword">date</literal>. Генерирует дату, как текстовую строку в формате ISO 8601. Возвращает строку вида <quote><literal>2006-09-04 15:13:13 -0700</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5ae"><literal role="template-filter">obfuscate</literal>: Любой текст, но наиболее полезно для ключевого слова <literal role="template-keyword">author</literal>. Возвращает текст преобразованный в последовательность XML entities. Это помогает победить некоторых, особенно глупых сканеров собирающих адреса для спам-ботов.</para>
      </listitem>
      <listitem><para id="x_5af"><literal role="template-kw-filt-author">person</literal>: Любой текст, но наиболее полезно для ключевого слова <literal role="template-keyword">author</literal>. Возвращает текст перед адресом email. Например, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> преобразуется в <quote><literal>Bryan O'Sullivan</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5b0"><literal role="template-kw-filt-date">rfc822date</literal>: ключевое слово <literal role="template-keyword">date</literal>. Генерирует дату, как текстовую строку в формате использующемся в заголовках email. Возвращает строку вида <quote><literal>Mon, 04 Sep 2006 15:13:13 -0700</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5b1"><literal role="template-kw-filt-node">short</literal>: Хеш ревизии. Возвращает короткую форму хеша ревизии. 12-символьную шестнадцатеричную строку.</para>
      </listitem>
      <listitem><para id="x_5b2"><literal role="template-kw-filt-date">shortdate</literal>: ключевое слово <literal role="template-keyword">date</literal>. Генерирует год, месяц и день даты. Возвращает строку вида <quote><literal>2006-09-04</literal></quote>.</para>
      </listitem>
      <listitem><para id="x_5b3"><literal role="template-filter">strip</literal>: Любой текст. Удаляет все начальные и конечные пробелы из строки.</para>
      </listitem>
      <listitem><para id="x_5b4"><literal role="template-filter">tabindent</literal>: Любой текст. Возвращает текст в котором каждая строка, кроме первой, начинаются с символа табуляции.</para>
      </listitem>
      <listitem><para id="x_5b5"><literal role="template-filter">urlescape</literal>: Любой текст. Экранирует все символы, которые считаются <quote>специальными</quote> для url-анализаторов. Так, например, <literal>foo bar</literal> преобразуется в <literal>foo%20bar</literal>.</para>
      </listitem>
      <listitem><para id="x_5b6"><literal role="template-kw-filt-author">user</literal>: Любой текст, но наиболее полезно для ключевого слова <literal role="template-keyword">author</literal>. Возвращает часть <quote>user</quote> из email адреса. Например, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> преобразуется в <quote><literal>bos</literal></quote>.</para>
      </listitem>
    </itemizedlist>

    &interaction.template.simple.manyfilters;

    <note>
      <para id="x_5b7">Если вы попробуете применить фильтр к фрагменту данных, который не может быть обработан, Mercurial напечатает исключение Python. Например, попытка запустить фильтр <literal role="template-kw-filt-date">isodate</literal> для ключевого слова <literal role="template-keyword">desc</literal>, будет не очень хорошей идеей.</para>
    </note>

    <sect2>
      <title>Объединение фильтров</title>

      <para id="x_5b8">Легко объединять фильтры для получения нужного результата. Следующая цепочка фильтров приводит в порядок описание, убеждаемся что оно влезает в 68 столбцов, потом вставляем отступы в 8 символов (по крайней мере на unix-подобных системах, где табуляция условно занимает 8 символов).</para>

      &interaction.template.simple.combine;

      <para id="x_5b9">Обратите внимание на использование <quote><literal>\t</literal></quote> (символ табуляции) в шаблоне, чтобы заставить первую строку отступить, это необходимо, поскольку <literal role="template-keyword">tabindent</literal> вставляем отступы везде, <emphasis>кроме</emphasis> первой строки.</para>

      <para id="x_5ba">Имейте в виду, что порядок фильтров в цепочке является важным. Первый фильтр применяется к результату ключевого слова, второй к результату первого фильтра, и так далее. Например, использование  <literal>fill68|tabindent</literal> даст очень разные результаты в сравнении с <literal>tabindent|fill68</literal>.</para>
    </sect2>
  </sect1>

  <sect1>
    <title>От шаблонов к стилям</title>

    <para id="x_5bb">Шаблон в командной строке предоставляет простой и быстрый способ для форматирования некоторого вывода. Шаблоны могут стать слишком многословным, хотя, и это полезно, чтобы иметь возможность указать имени шаблон. Файл стиля представляет собой шаблон с именем, хранящийся в файле.</para>

    <para id="x_5bc">Более того, использование файла стиля открывает силу движка шаблонов Mercurial таким образом, который не представляется возможным с помощью опции командной строки <option role="hg-opt-log">--template</option>.</para>

    <sect2>
      <title>Простейшие файлы стилей</title>

      <para id="x_5bd">Наш простой файл стиля содержит всего одну строчку:</para>

      &interaction.template.simple.rev;

      <para id="x_5be">Это указывает Mercurial, <quote>при печати ревизии, используй текст справа как шаблон</quote></para>
    </sect2>

    <sect2>
      <title>Синтаксис файла стиля</title>

      <para id="x_5bf">Синтаксические правила файла стиля просты.</para>

      <itemizedlist>
	<listitem><para id="x_5c0">Файл обрабатывается построчно.</para>
	</listitem>
	<listitem><para id="x_5c1">Начальные и конечные пробелы игнорируются</para>
	</listitem>
	<listitem><para id="x_5c2">Пустые строки пропускаются</para>
	</listitem>
	<listitem><para id="x_5c3">Если строка начинается с одного из символов <quote><literal>#</literal></quote> или <quote><literal>;</literal></quote>, эта строка считается комментарием и пропускается как пустая.</para>
	</listitem>
	<listitem><para id="x_5c4">Строка начинается с ключевого слова. Оно должно начинаться с буквы или символа подчеркивания, и может в дальнейшем содержать любые алфавитно-цифровые символы и знак подчеркивания. (Ключевое слово должно удовлетворять следующему регулярному выражению <literal>[A-Za-z_][A-Za-z0-9_]*</literal>.)</para>
	</listitem>
	<listitem><para id="x_5c5">Следующий элемент должен быть символ <quote><literal>=</literal></quote>, в окружении произвольного количества пробелов.</para>
	</listitem>
	<listitem><para id="x_5c6">Если остальная часть строки начинается и заканчивается с соответствующими кавычками (как одинарными, так и двойными), она рассматривается в качестве тела шаблона.</para>
	</listitem>
	<listitem><para id="x_5c7">Если остальная часть строки <emphasis>не</emphasis> начинается с кавычки, то она рассматривается как имя файла, содержимое этого файла будет читаться и использоваться в качестве тела шаблона.</para>
	</listitem></itemizedlist>
    </sect2>
  </sect1>

  <sect1>
    <title>Примеры файлов стиля</title>

    <para id="x_5c8">Чтобы показать, как писать стилевой файл, напишем несколько примеров. Вместо того, чтобы обеспечивать полный стилевой файл и проходить по нему, мы отобразим обычный процесс разработки стилевого файла, начиная с чего-то очень простого, и переходя через набор последовательно более полных примеров.</para>

    <sect2>
      <title>Определение ошибки в файле стиля</title>

      <para id="x_5c9">Если Mercurial сталкивается с проблемой в файле стиля, с которым вы работаете, он печатает краткие сообщения об ошибках на самом деле очень полезными, как только вы поймёте, что они означают.</para>

&interaction.template.svnstyle.syntax.input;

      <para id="x_5ca">Обратите внимание, что <filename>broken.style</filename> пытается определить ключевое слово <literal>changeset</literal>, но забывает дать какой-либо контент для него. Когда вы указываете Mercurial использовать этот файл стиля, он оперативно жалуется.</para>

      &interaction.template.svnstyle.syntax.error;

      <para id="x_5cb">Это сообщение об ошибке выглядит устрашающе, но его не слишком трудно исследовать.</para>

      <itemizedlist>
	<listitem><para id="x_5cc">Первым компонент является просто способом Mercurial сказать: <quote>Я прерываю выполнение</quote>.</para>
	  <programlisting>___abort___: broken.style:1: parse error</programlisting>
	</listitem>
	<listitem><para id="x_5cd">Далее идёт название файла стиля который содержит ошибку</para>
	  <programlisting>abort: ___broken.style___:1: parse error</programlisting>
	</listitem>
	<listitem><para id="x_5ce">После имени файла идёт номер строки, где произошла ошибка.</para>
	  <programlisting>abort: broken.style:___1___: parse error</programlisting>
	</listitem>
	<listitem><para id="x_5cf">Наконец, описание того, что пошло не так.</para>
	  <programlisting>abort: broken.style:1: ___parse error___</programlisting>
	</listitem>
	<listitem><para id="x_5d0">Описание проблемы, не всегда понятно (как в данном случае), но даже если оно загадочно, то проблема почти всегда тривиальна, посмотрите на указанную строку в файле стиля и посмотрите, что в ней неправильно.</para>
	</listitem>
      </itemizedlist>
    </sect2>

    <sect2>
      <title>Уникальный идентификатор репозитория</title>

      <para id="x_5d1">Если вы хотите, иметь возможность определить репозиторий Mercurial <quote>довольно однозначно</quote>, используя короткую строку, в качестве идентификатора, вы можете использовать первую ревизию в репозитории.</para>

      &interaction.template.svnstyle.id;

      <para id="x_5d2">Она может быть уникальной, и поэтому она является полезной во многих случаях. Есть несколько предостережений.</para>
      <itemizedlist>
	<listitem><para id="x_5d3">Это не будет работать в совершенно пустом репозитории, потому что такие репозитории не имеют ревизии.</para>
	</listitem>
	<listitem><para id="x_5d4">Это не будет работать (крайне редко) в случае, когда репозиторий это слияние двух или более ранее независимых репозиториев, и вы до сих пор поддерживаете эти репозитории.</para>
	</listitem></itemizedlist>
      <para id="x_5d5">Вот некоторые варианты использования этого идентификатора:</para>
      <itemizedlist>
	<listitem><para id="x_5d6">В качестве ключа в таблице базы данных, которая управляет хранилищами на сервере.</para>
	</listitem>
	<listitem><para id="x_5d7">В половине кортежа {<emphasis>ID репозитория</emphasis>, <emphasis>ID ревизии</emphasis>}. Сохранить эту информацию при запуске автоматической сборки и иных действиях, так что вы можете <quote>повторить</quote> сборку  в дальнейшем, если это необходимо.</para>
	</listitem>
      </itemizedlist>
    </sect2>

    <sect2>
      <title>Просмотр файлов на нескольких строках</title>

      <para id="x_714">Предположим, мы хотим, чтобы список файлов изменившихся в ревизии, по одному на строке, с небольшой отступом перед каждым именем файла.</para>

      &interaction.ch10-multiline.go;
    </sect2>

    <sect2>
      <title>Вывод похожий на Subversion</title>

      <para id="x_5d8">Давайте попробуем подражать формату вывода который по умолчанию использует другой инструмент контроля версий, Subversion.</para>

      &interaction.template.svnstyle.short;

      <para id="x_5d9">Стиль с выводом похожим на Subversion является достаточно простым, легко скопировать и вставить кусок его вывода в файл, и заменить текст, подготовленный выше Subversion шаблонными значениями, которые мы хотели бы видеть при развёртывании.</para>

      &interaction.template.svnstyle.template;

      <para id="x_5da">Есть несколько мелочей, в котором этот шаблон отличается от вывода, производимого Subversion.</para>
      <itemizedlist>
	<listitem><para id="x_5db">Subversion печатает <quote>читаемую</quote> дату (как <quote><literal>Wed, 27 Sep 2006</literal></quote> в примере выше) в скобках. Шаблон движка Mercurial не дает возможности отображения даты в этом формате без печати времени и часового пояса.</para>
	</listitem>
	<listitem><para id="x_5dc">Мы подражать выводу Subversion вместе с <quote>разделителем</quote> строкой, заполненной символами <quote><literal>-</literal></quote> путем завершения шаблона такой строкой. Мы используем ключевое слово <literal role="template-keyword">header</literal> шаблонного движка для печати разделительной линии в качестве первой строки вывода (см. ниже), что позволит достичь аналогичного вывода в Subversion.</para>
	</listitem>
	<listitem><para id="x_5dd">Вывод Subversion включает в себя в заголовке счётчик строк в сообщении фиксации. Мы не можем повторить это в Mercurial; шаблонный движок в настоящее время не обеспечивает фильтр, который подсчитывает количество строк сгенирированных шаблоном.</para>
	</listitem></itemizedlist>
      <para id="x_5de">Мне потребовалось не более минуты или две работы, заменить точный текст из примера с выводом Subversion с некоторыми ключевыми словами и фильтрами используемыми в шаблоне выше. Файл стиля содержит ссылку на шаблон.</para>

      &interaction.template.svnstyle.style;

      <para id="x_5df">Мы могли бы включить текст шаблона непосредственно в файл стиля, заключив его в кавычки и заменяя перевод строк на последовательность <quote><literal>\n</literal></quote>, но это сделало бы файл стиля слишком трудночитаемым. Читаемость является хорошим руководством, когда вы пытаетесь решить, будет ли какой-нибудь текст принадлежит файлу стиля или файлу шаблона. Если файл стиля будет выглядеть слишком большим или непонятным если вы вставите шаблон точным фрагментом текста, поместите его лучше в шаблон.</para>
    </sect2>
  </sect1>
</chapter>

<!--
local variables: 
sgml-parent-document: ("00book.xml" "book" "chapter")
end:
-->