Глава 6. Взаимодействие с людьми

Содержание

6.1. Веб-интерфейс Mercurial
6.2. Модели сотрудничества
6.2.1. Факторы, которые необходимо иметь в виду
6.2.2. Неформальный подход
6.2.3. Единый центральный репозиторий
6.2.4. Хостинг центрального репозитория
6.2.5. Работа с несколькими ветвями
6.2.6. Ветви для новых функций
6.2.7. Релиз по расписанию
6.2.8. Модель ядра Linux
6.2.9. Втягивающее против совместно-вносимого сотрудничества
6.2.10. Когда разработка сталкивается с управлением ветвлениями
6.3. Техническая сторона совместного использования
6.4. Неофициальный обмен с помощью hg serve
6.4.1. Несколько деталей к размышлению
6.5. Использование протокола Secure Shell (ssh)
6.5.1. Как читать и записывать, используя ssh URL-ы
6.5.2. Выбор ssh-клиента для Вашей системы
6.5.3. Генерация криптографической пары (открытого и секретного ключей)
6.5.4. Использование агента аутентификации
6.5.5. Правильная настройка сервера.
6.5.6. Использование сжатия по ssh
6.6. Работа по HTTP с использованием CGI
6.6.1. Список проверок конфигурации веб-сервера
6.6.2. Базовая конфигурация CGI
6.6.3. Настройка доступа к нескольким хранилищам с помощью одного CGI-скрипта
6.6.4. Загрузка исходных архивов
6.6.5. Опции настройки веб интерфейса
6.7. Системный файл конфигурации
6.7.1. Делаем Mercurial более доверенным.

Mercurial, как полностью децентрализованный инструмент, не навязывает никакой политики взаимодействия людей друг с другом. Однако, если вы новичок в работе с распределенным контролем версий, будет полезно иметь некоторые инструменты и примеры в голове, обдумывая возможные модели рабочего процесса.

6.1. Веб-интерфейс Mercurial

Mercurial имеет мощный веб-интерфейс, обеспечивающий несколько полезных возможностей.

В плане интерактивного использования интерфейс позволяет просматривать один или несколько репозиториев. Вы можете просматривать историю репозитория, изменения (комментарии и различия), а также содержимое каждого каталога и файла. Можно даже посмотреть на историю в графическом виде, который позволяет проследить зависимости между отдельными ревизиями и слияниями.

Также для использования человеком web-интерфейс обеспечивает RSS-канал для изменений в репозитарии. Это позволяет вам «подписаться» на репозитарий, используя вашу любимую программу для чтения новостей, и автоматически получать сообщения об активности в данном репозитарии, как только что-то произойдет. Я считаю эту возможность гораздо более удобной, чем модель подписки на почтовый список рассылки, с помощью которого будут рассылаться сообщения, поскольку это не требует дополнительной настройки со стороны владельца репозитария.

Web-интерфейс также позволяет удаленным пользователям клонировать репозиторий, получать с него изменения и в случае, если сервер настроен для внесения изменений, возвращать изменения обратно. Тунельный HTTP протокол Mercurial хорошо сжимает данные и это позволяет работать даже на низкоскоростных сетевых соединенияx.

Простейший способ начать использовать Web-интерфейс — использовать ваш web-браузер для посещения существующего репозитария, например, такого, как основной репозитарий Mercurial, расположенный по адресу http://www.selenic.com/repo/hg.

Если вы заинтересованы обеспечить Web-интерфейс к своему собственному репозитарию, есть несколько хороших путей.

Самый простой и быстрый способ, чтобы начать работу в неформальной обстановке является использование команды hg serve, которая лучше всего подходит для кратковременных «лёгких» серверов. Смотрите Раздел 6.4, «Неофициальный обмен с помощью hg serve» чтобы узнать, как использовать эту команду.

Для долгоживущих репозитариев, которые вы хотели бы иметь постоянно доступным, есть несколько общественных хостинг сервисов. Некоторые из них бесплатны для проектов с открытым кодом, а другие платные коммерческие хостинги. Актуальный список доступен в http://www.selenic.com/mercurial/wiki/index.cgi/MercurialHosting.

Если вы предпочитаете использовать ваш собственный компьютер для репозитариев, Mercurial имеет встроенную поддержку нескольких популярных хостинг технологий, в первую очередь cgi (common gateway interface), а также wsgi (web services gateway interface). Смотрите Раздел 6.6, «Работа по HTTP с использованием CGI» для более подробной информации о конфигурации CGI и WCGI.

6.2. Модели сотрудничества

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

6.2.1. Факторы, которые необходимо иметь в виду

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

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

Не заметайте поддающиеся предвидению социальные или технические проблемы под ковер. Какую бы схему Вы ни внедряли, вы должны планировать ошибки и проблемные сценарии. Рассмотрите добавление автоматизированных механизмов для предотвращения или быстрого восстановления после проблем, которые Вы можете предвидеть. Например, если Вы хотите иметь ветвь, в которой хранятся изменения не-для-релиза, Вы должны заранее хорошо подумать над тем, что кто-то может случайно добавить эти изменения в релиз. Вы могли бы избежать этой конкретной проблемы, написав перехватчик, который будет мешать изменениям, вносимым в неподходящую ветвь кода.

6.2.2. Неформальный подход

Я не стал бы рекомендовать этот подход, как универсальный, однако он крайне прост и отлично работает в некоторых нестандартных ситуациях.

К примеру, множество проектов представляет собой группу слабо взаимодействующих между собой участников, которые крайне редко встречаются лично. Некоторые группы стараются преодолеть возникающую в результате удаленной работы изоляцию, устраивая «спринты». Во время «спринта», участники собираются вместе в назначенном месте — конференц-зале компании или отеля — и проводят несколько дней в неотрывной разработке, разбираясь со сложными местами проектов.

«Спринт» или хакерский сбор в кафе — отличное место для применения команды hg serve, поскольку эта команда не требует никакой сложной серверной инфраструктуры. Вы можете приступить к использованию hg serve моментально, прочитав Раздел 6.4, «Неофициальный обмен с помощью hg serve». Вы можете просто сообщить соседу, что Вы запустили сервер, передать ему ссылку любым удобным способом, и у вас уже есть отличное средство для совместной работы. Ваш сосед может открыть полученный URL своим браузером и ознакомиться с внесенными Вами изменениями, он может воспользоваться сделанными Вами исправлениями, а может клонировать ветвь, содержащую новые возможности, и опробовать ее.

Одновременно положительной и отрицательной стороной такого варианта взаимодействия является то, что только те люди, которые знают о внесенных вами изменениях, могут их увидеть. Неформальный подход просто невозможно использовать в больших коллективах, поскольку каждый участник должен отслеживать изменения в n репозиториях, чтобы получить их.

6.2.3. Единый центральный репозиторий

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

Каждый участник разработки начинает работу с создания локальной копии центрального репозитория. Он может получать изменения из него тогда, когда ему понадобится. В то же время некоторые (а возможно и все) разработчики имеют привилегии на добавление в репозиторий готовых к публикации изменений.

В рамках этого подхода также остается возможным обмен изменениями напрямую между разработчиками, без добавления их в центральный репозиторий. К примеру, я исправил ошибку, однако я не могу гарантировать, что будучи опубликованным в центральном репозитории, мое исправление не нарушит работу кода других разработчиков, которые получат это исправление. Чтобы снизить риск возможного вреда, я могу попросить вас клонировать мой репозиторий в ваш собственный временный репозиторий, и проверить работоспособность. Это позволит нам избежать публикации потенциально небезопасных изменений до тех пор, пока они не пройдут небольшого тестирования.

Если команда хостит собственные репозитории по такому типу работы, разработчики обычно используют протокол ssh для безопасного добавления изменений в центральный репозиторий, как это описано в разделе Раздел 6.5, «Использование протокола Secure Shell (ssh)». Также, часто используется возможность публикации доступной только для чтения копии репозитория с помощью HTTP-сервера, используя CGI, как показано в Раздел 6.6, «Работа по HTTP с использованием CGI». Публикация с помощью HTTP удовлетворяет потребностям людей, которые не имеют доступа на запись, и которые хотят использовать web-браузеры для просмотра истории репозитория.

6.2.4. Хостинг центрального репозитория

Преимуществом общественных услуг хостинга, таких как Bitbucket является то, что они не только поддерживают неудобные детали конфигурации, такие как учетные записи пользователей, проверки подлинности и защищенные протоколы передачи, они обеспечивают дополнительную инфраструктуру, чтобы эта модель хорошо работала.

Например, хорошо организованный хостинг позволяет людям клонировать собственные копии репозитория за один клик. Это позволяет людям работать в разных местах и делиться своим изменениями, когда они готовы.

Кроме того, хороший сервис хостинга позволяет людям общаться друг с другом, например, говорить «Есть изменения готовые для просмотра в этом дереве».

6.2.5. Работа с несколькими ветвями

Работа над проектами более-менее значительного размера, как правило, идет сразу на нескольких фронтах. В течение жизненного цикла, проект переживает периодические официальные релизы. После этого релиз может на некоторое время после выпуска перейти в «режим поддержки» — когда в программное обеспечение вносятся только исправления ошибок, не добавляя новых возможностей. Параллельно с этими релизами, один или несколько будущих релизов находятся в разработке. Для обозначения подобных направлений в разработке, используется термин «ветвь».

Mercurial исключительно хорошо подходит для ведения нескольких похожих, но не одинаковых ветвей. Каждое «направление разработки» может храниться в своем собственном центральном репозитории, и вы можете добавлять изменения из одного в другой, когда появляется такая необходимость. Поскольку репозитории являются независимыми, нестабильные изменения в разрабатываемой ветви не повлияют на стабильную ветвь, покуда кто-нибудь не захочет объединить их.

Вот как это работает на практике: Допустим, у вас есть одна «главная ветвь» на центральном сервере.

$ hg init main
$ cd main
$ echo 'This is a boring feature.' > myfile
$ hg commit -A -m 'We have reached an important milestone!'
adding myfile

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

Когда главная ветвь достигает состояния релиза, вы можете использовать команду hg tag, чтобы дать постоянное имя этой ревизии.

$ hg tag v1.0
$ hg tip
changeset:   1:1e1d75b92915
tag:         tip
user:        Bryan O'Sullivan <bos@serpentine.com>
date:        Thu Feb 02 14:09:34 2012 +0000
summary:     Added tag v1.0 for changeset 6fc05bef0b12

$ hg tags
tip                                1:1e1d75b92915
v1.0                               0:6fc05bef0b12

Теперь, скажем, произошли изменения в главной ветви.

$ cd ../main
$ echo 'This is exciting and new!' >> myfile
$ hg commit -m 'Add a new feature'
$ cat myfile
This is a boring feature.
This is exciting and new!

Используя тег для пометки релиза, участник, клонирующий репозиторий, в любое время в последующем может воспользоваться командой hg update для получения точной копии рабочей папки по состоянию на момент релиза.

$ cd ..
$ hg clone -U main main-old
$ cd main-old
$ hg update v1.0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat myfile
This is a boring feature.

В дополнение к этому, сразу же после того, как основная ветка будет тегирована, кто-либо может клонировать основную ветку на сервере в новую «стабильную» ветку, также находящуюся на сервере.

$ cd ..
$ hg clone -rv1.0 main stable
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Любой, кому нужно сделать изменения в стабильной ветке, может клонировать этот репозиторий, вполнить изменения, сделать коммит и передать изменения сюда.

$ hg clone stable stable-fix
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd stable-fix
$ echo 'This is a fix to a boring feature.' > myfile
$ hg commit -m 'Fix a bug'
$ hg push
pushing to /tmp/branching5YEWM8/stable
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files

Поскольку репозитории Mercurial независимы, и поскольку Mercurial не осуществляет автоматически изменения, стабильная и основная ветки изолированы друг от друга. Изменения, сделанные вами в основной ветке не «просачиваются» в стабильную ветку, и обратно.

Часто у вас будет возникать желание, что бы багфиксы из стабильной ветки применялись и к основной. Вместо простого переписывания исправления в основную ветку, вы можете просто выполнить pull и merge измениний стабильной ветки в основную. И Mercurial перенесет вам эти багфиксы.

$ cd ../main
$ hg pull ../stable
pulling from ../stable
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
$ hg merge
merging myfile
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m 'Bring in bugfix from stable branch'
$ cat myfile
This is a fix to a boring feature.
This is exciting and new!

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

6.2.6. Ветви для новых функций

Для больших проектов эффективным способом управлять изменениями будет разбиение команды на несколько меньших групп. Каждая из которых будет использовать свою собственную ветку клонированную из единой «главной» ветки, используемой для всего проекта. Люди работающие над отдельными ветками обычно хорошо изолированны от изменений в других ветках.

Рисунок 6.1. Ветви для новых функций

XXX add text

Когда отдельная функция приобретает удобоваримую форму, кто-то из команды, работавшей над данной функцией затягивает изменения из главной ветки в ветку функции и выполняет слияние, а затем заливает изменения назад в главную ветку.

6.2.7. Релиз по расписанию

Некоторые проекты организованы по принципу «поезда»: выпуск новой версии планируется каждые несколько месяцев, и все функции, которые завершены к «отправлению поезда», включаются в релиз.

Эта модель имеет много общего с моделью «ветви для новых функций». Отличие следующее: в случае, если функция не вошла в релиз (опоздала на поезд), один из членов команды-разработчика функции вытягивает вошедшие в релиз изменения в ветку функции и производит слияние, после чего команда продолжает работать «поверх» нового релиза и, таким образом, сможет включить функцию в новый релиз.

6.2.8. Модель ядра Linux

В разработке ядра Linux есть неглубокая иерархическая структура, окруженная очевидным облаком хаоса. Поскольку большинство разработчиков Linux используют git, распределенный инструмент управления версиями, подобный Mercurial, полезно описать рабочий процесс в этом окружении. Если вам понравятся идеи, подход легко переносится на другие инструменты.

В центре сообщества сидит Линус Торвальдс (Linus Torvalds), создатель Linux. Он публикует единственный исходный архив, который считается «авторитетным» текущим деревом всего сообщества разработчиков. Любой может клонировать дерево Линуса, но он очень разборчив в выборе деревьев с которых можно вливать изменения.

У Линуса есть несколько «доверенных лейтенантов». Как правило он помещает любые изменения, которые они издают, в большинстве случае даже не рассматривая их изменения. Некоторые из лейтенантов вообще являются «мейнтейнерами», отвечающими за отдельные подсистемы в пределах ядра. Если случайный разработчик ядра хочет сделать изменения в подсистему, которые они хотят внести в дерево Линуса, они должны узнать кто является мейнтейнером подсистемы и попросить его внести изменения. Если мейнтейнер рассмотрит их изменения и согласиться их взять, то он передаст их Линусу должны образом.

У индивидуальных лейтенантов имеются свои собственные подходы к рассмотрению, принятию и публикации изменений, и для того чтобы решить когда передать их Линусу. В дополнение, существует несколько хорошо известных веток которые люди используют для различных целей. Например, некоторые люди обслуживают «stable» («стабильную ветку») репозитория с несколько устаревшей версией ядра, внося критические исправления если они необходимы. Некоторые мейнтейнеры публикуют несколько деревьев: одно для экспериментальных изменений, одно для изменений которые они собираются внести в стабильные и так далее. Другие просто публикуют отдельные деревья.

У этой модели есть две важные особенности. Первая это «только внесение». Вы должны спросить, убедить или попросить другого разработчика сделать изменения за вас, потому что практически нет веток, куда может помещать код одна персона, и не существует способа помещать код в ветки, контролируемые кем-то еще.

Вторая базируется на репутации и доверии. Если вы никому не известны, Линус вероятно проигнорирует ваши изменения и даже оставит вас без ответа. Но майнтейнер подсистемы вероятно рассмотрит их, если они пройдут его критерии пригодности. Чем более «хорошие» изменения вы вносите, тем более вероятно что они будут доверять вашему суждению и принимать ваши изменения. Если вы хорошо известны и поддерживаете долгое время какую-либо возможность в ветке, которые Линус еще не принял, люди с похожими интересами могут вносить ваши изменения регулярно, для того чтобы не отставать от вашей работы.

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

Людям, пришедшим с более строгих проектов, и сравнивающих процесс разработки ядра Linux с места откуда они пришли, процесс разработки кажется полностью безумным. Разработка подчиняется прихотям людей; люди делают большие изменения всякий раз, как считают это нужным; и темп эволюционирования потрясает. Но все же Linux — это успешная и хорошо оцениваемая часть программного обеспечения.

6.2.9. Втягивающее против совместно-вносимого сотрудничества

Постоянным источником жара в open source сообществе является вопрос, которая из двух моделей разработки лучше: та, в которой люди всегда берут изменения у других, или та, в которой множество людей вносят изменения в общий репозиторий.

Обычно, покровители модели совместного вноса используют инструменты принуждающие использовать этот метод. Если вы используете инструмент централизованного контроля версий вроде Subversion, нет возможности выбрать модель: инструмент даёт вам только совместный внос, и если вы захотите что-то ещё, вам придётся прикрутить свой собственный метод сверху (как например наложение патча вручную).

Хорошая распределенная версионная система, такая как Mercurial, поддерживает обе модели. И вы и ваши коллеги можете организовывать совместную работу, основываясь на ваших нуждах и предпочтениях, а не так, как принуждают вас ваши инструменты.

6.2.10. Когда разработка сталкивается с управлением ветвлениями

Единожды создав несколько распределенных репозиториев и начав распространять изменения между локальным и общим репозиториями, вы с вашей командой начнете становиться связанными, но столкнетесь с немного другой проблемой: управлением направлениями, в которых ваша команда может разом двинуться. Хотя эта тема тесно связана с тем, как ваша команда взаимодействует, она довольно глубока, чтобы заслужить собственное рассмотрение в Глава 8, Управление релизами и ветками.

6.3. Техническая сторона совместного использования

Остаток от этой главы посвящен вопросу обмена данными с вашими сотрудниками.

6.4. Неофициальный обмен с помощью hg serve

Команда hg serve чудесно подходит для маленьких, тесно связанных и быстро продвигающихся групп (разработчиков). Она также предоставляет отличную возможность пощупать использование команд Mercurial через сеть.

Запустите hg serve внутри репозитория, и через секунду она (команда) поднимет специальный HTTP сервер, принимающий подключения от любого клиента и предоставляющий данные этого репозитория, пока вы не отключите его. Любой, кто знает URL только что запущенного сервера, и способный подключиться к вашему компьютеру через сеть, может использовать браузер или Mercurial для чтения дынных этого репозитория. URL запущенного экземпляра hg serve на ноутбуке вероятно будет выглядеть приблизительно как http://my-laptop.local:8000/.

Команда hg serve это не полноценный web сервер. Вы можете делать с ним только две вещи:

  • Разрешать людям просматривать репозиторий через обычный web браузер

  • Использовать родной протокол Mercurial, так что люди смогут сделать hg clone или hg pull с вашего репозитория.

На практике команда hg serve не позволяет удаленным пользователям модифицировать ваш репозиторий. Она предназначена для использования в рамках «только чтение».

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

6.4.1. Несколько деталей к размышлению

Поскольку hg serve предоставляет доступ на чтение всем клиентам без идентификации, эту команду следует использовать только в окружении, где вы либо не имеете причин для беспокойства, либо имеете возможность определять, кто может подключиться к вашему хранилищу и получить из него данные.

Команда hg serve ничего не знает о брандмауэрах, которые могут быть установлены в вашей системе или сети. Она не обнаруживает и не управляет вашими брандмауэрами. Если сторонний человек не может обратиться к запущенному экземпляру hg serve, второе, что нужно проверить (после того, как убедитесь, что он использует правильный URL) — это конфигурация брандмауэра.

По умолчанию, hg serve принимает входящие соединения на 8000 порт. Если другой процесс уже прослушивает порт, который вы хотите использовать, вы можете указать другой порт с помощью ключа -p.

Обычно, когда hg serve запущен, он ничего не выводит, что может быть немного странным. Если вы хотите убедиться, что он действительно работает и вы можете передать URL своим сотрудникам, запускайте его с ключом -v.

6.5. Использование протокола Secure Shell (ssh)

Используя протокол Secure Shell (ssh), Вы можете безопасно получать и записывать изменения через сетевое соединение. Для того, что бы воспользоваться этим, Вы должны немного изменить конфигурацию на стороне клиента или сервера.

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

(Если Вы знакомы с ssh, приведенный ниже материал наверняка покажется Вам элементарным.)

6.5.1. Как читать и записывать, используя ssh URL-ы

Обычно, ssh URL выглядит подобным образом:

ssh://bos@hg.serpentine.com:22/hg/hgbook
  1. Часть «ssh://» указывает Mercurial, что нужно использовать ssh протокол.

  2. Часть bos представляет собой имя пользователя для подключения к серверу. Вы можете не указывать эту часть, если имя пользователя на удалённом сервере совпадает с Вашим локальным именем пользователя.

  3. «hg.serpentine.com» представляет собой имя хоста для подключения.

  4. «:22» указывает номер порта для подключения к серверу. По умолчанию используется порт 22, поэтому Вам нужно указывать эту часть только если используется не стандартный 22 порт.

  5. Остальная часть URL представляет собой локальный путь к хранилищу на серевере.

Существует множество неразберихи по прочтению ssh-URL, так как не существует стандарта его интерпретации. Некоторые программы ведут себя одним образом, другие — иначе, когда речь идет о таких путях. Это не идеальная ситуация, и она вряд ли изменится. Пожалуйста, прочтите внимательно следующие абзацы.

Mercurial рассматривает путь к хранилищу на сервере относительно домашней директории удаленного пользователя. Например, если домашняя директория пользователя foo на сервере /home/foo, тогда ssh-URL, который содержит компонент пути bar (ssh://foo@myserver/bar), в действительности ссылается на директорию /home/foo/bar.

Если Вы хотите указать путь относительно домашней директории другого пользователя, можете использовать путь, который начинается с тильды, за которой следует имя пользователя(назовем его otheruser), к примеру.

ssh://server/~otheruser/hg/repo

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

ssh://server//absolute/path

6.5.2. Выбор ssh-клиента для Вашей системы

Почти все Unix-подобные системы поставляются с предустановленным OpenSSH. Если Вы используете такую систему, запустите which ssh, что бы узнать, установлен ли ssh (он, как правило, находится в /usr/bin). В маловероятном случае, если его нету, обратитесь к документации на вашу систему, чтобы выяснить как его установить.

В windows, пакета tortoisehg поставляется в комплекте с версией отличной команде plink Симона Татама, и вам не нужно делать какой-либо дополнительной конфигурации.

6.5.3. Генерация криптографической пары (открытого и секретного ключей)

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

[Подсказка] Криптографической ключи не являются обязательными

Mercurial ничего не знает об аутентификации или SSH-ключах. Вы можете, если хотите, проигнорировать этот раздел и следующий, пока не устанете от многократно ввода пароля SSH.

  • На Unix-подобной операционной системы, можно сделать командой ssh-keygen.

    В windows, если вы используете TortoiseHg, вам, возможно, потребуется скачать команду с puttygen с веб-сайта PuTTY для генерации пары ключей. Смотрите документацию к puttygen об использовании этой команды.

При генерации криптографической пары весьма целесообразно защитить секретный ключ с помощью парольной фразы (единственный случай, когда Вам не захочется этого делать — это когда вы используете ssh протокол для автоматизации задач в защищённой сети)

Одной только генерации пары ключей не достаточно. Вам также необходимо добавить открытый ключ к множеству авторизованных ключей пользователя, который подключается удаленно. Для серверов, которые используют OpenSSH (подавляющее большинство), это означает, что нужно добавить публичный ключ к списку в файле под названием authorized_keys в директории .ssh пользователя.

На Unix-подобных системах, Ваш открытый ключ будет иметь расширение .pub. Если Вы используете puttygen на Windows, то Вы можете сохранить открытый ключ в файл или вставить из окна puttygen в файл authorized_keys.

6.5.4. Использование агента аутентификации

Аутентификационный агент — демон, который хранит парольную фразу в памяти (и она будет утеряна, когда Вы выйдете из системы). Ключевая фраза передаётся ssh-клиенту, если он запущен и опрашивает агента для получения парольной фразы. Если агент аутентификации не запущен, или не хранит необходимой парольной фразы, то пароль будет запрашиваться вский раз, когда Mercurial попробует установить соединение с сервером от Вашего имени (при отправке или получении Вами изменений).

Недостатком хранения парольных фраз в агенте является возможность их восстановления хорошо подготовленными злоумышленниками. Вам решать, насколько это приемлемый для Вас риск. С другой стороны, это избавляет от многократного повторного ввода.

  • На Unix-подобных системах агент называется ssh-agent, который запускается автоматически когда вы входите в систему. Для того, что бы агент запомнил парольную фразу в хранилище, нужно использовать команду ssh-add.

  • На Windows, если вы используете TortoiseHg, команда pageant выступает в качестве агента. Как и puttygen, вам необходимо скачать pageant с веб-сайта PuTTY и прочесть его документацию. Команда pageant добавляет иконку в системный трей, с помощью которой, вы можете управлять сохраненными парольными фразами.

6.5.5. Правильная настройка сервера.

Настройка ssh кропотливая, и если Вы новичек, то есть ряд вещей, которые могут пойти не так. Добавим сверху ещё и Mercurial, и появится ещё больше причин почесать затылок. Большинство потенциальных проблем возникают не на стороне клиента, а на стороне сервера. Хорошая новость заключается в том, что как только Вы получили рабочую конфигурацию, то, как правило, она будет работать неограниченное время.

Перед тем, как пытаться использовать Mercurial с доступом через ssh сервер, лучше для начала убедиться в том, что вы можете нормально использовать ssh или команду putty для доступа к серверу. Если вы столкнетесь с проблемами непосредственно при использовании этих команд, то наверняка Mercurial также не будет работать. Более того, он будет скрывать проблему. Когда Вы захотите настроить работу Mercurial по ssh, то сначала убедитесь, что подключения клиента по ssh работают, и только потом беспокойтесь о том, что это проблема Mercurial.

Первое, что нужно сделать, что бы убедиться в работоспособности серверной стороны — попробовать войти в систему с другой машины. Если вы не можете войти с помощью ssh или putty, полученное Вами сообщение об ошибке может дать несколько подсказок, что именно идет не так. Наиболее распространенными проблемами являются следующие:

  • Если получаете сообщение «connection refused» — либо не запущен демон SSH на стороне сервера, либо он не доступен из-за конфигурации межсетевого экрана.

  • Если Вы получаете сообщение об ошибке «no route to host» — Вы ввели неправильный адрес сервера или серьёзно заблокированы межсетевым экраном, который вообще не признаёт существование этого сервера.

  • Если Вы получаете ошибку «permission denied» — Вы ошиблись при вводе логина на сервере, опечатались в ключевой фразе или пароле пользователя.

В итоге, если у Вас возникают проблемы подключения к даемону ssh сервера, первое в чем нужно убедиться — запущен ли он вообще. На многих системах он установлен, но по-умолчанию отключен. После того, как закончили этот шаг, Вы должны убедиться в том, что брандмауэр на стороне сервера разрешает входящие соединения к порту, на котором слушает ssh даемон (обычно 22). Не беспокойтесь о других возможных ошибках, пока не проверите эти две.

Если Вы используете агента аутентификации на клиентской стороне для хранения Ваших парольных фраз ключей, Вы можете подключаться к серверу без ввода парольной фразы или пароля. Если Вас спрашивают парольную фразу, есть несколько возможных причин:

  • Возможно, Вы забыли использовать ssh-add или pageant для сохранения парольной фразы.

  • Возможно, Вы ввели парольную фразу не для того ключа.

Если вас спрашивают пароль для аккаунта на сервере, есть несколько возможных причин:

  • Права доступа к пользовательской домашней директории или поддиректории .ssh имеет лишние разрешения. В результате этого ssh даемон не доверяет такому authorized_keys файлу. Например, право на запись для группы в домашнюю или .ssh директорию часто является причиной такого поведения.

  • Файл authorized_keys пользователя тоже может быть причиной проблем. Если кроме пользователя ещё кто-либо может в него писать, то ssh даемон не станет доверять такому файлу и не будет его использовать.

В идеальном случае, Вы должны успешно выполнить следующую команду и получить её вывод: текущую дату и время на сервере.

ssh myserver date

Если на Вашем сервере при входе выполняются скрипты, выводящие баннеры и прочий мусор, даже при запуске неинтерактивных сессий, вроде приведённой выше — Вы должны избавиться от них или настроить сервер, чтобы это безобразие появлялось только при интерактивном входе. Иначе этот мусор будет, по-крайней мере, загромождать вывод Mercurial. Также он создаёт потенциальные проблемы для удалённого выполнения команд Mercurial. Mercurial пытается определять и игнорировать баннеры в неинтерактивных ssh сессиях, но не всегда успешно. (Если Вы изменяли логин-скрипты на сервере, то чтобы убедититься в их работоспособности в интерактивной сессии — проверьте код, возвращаемый командой tty -s.)

Как только Вы проверите простой ssh-доступ на сервер, следующим шагом к победе будет проверка выполнения Mercurial на сервере. Следующая команда должна успешно исполниться:

ssh myserver hg version

Если вы получили ошибку вместо нормального вывода команды hg version, то это, как правило, из-за неустановленного Mercurial в /usr/bin. Не беспокойтесь, если это так, то вам не нужно этого делать. Но Вы должны проверить несколько возможных проблем.

  • Mercurial вообще действительно установлен на сервере? Я знаю, что звучит банально, но это стоит проверить!

  • Возможно в вашей командной оболочке неверно указаны пути поиска исполняемых файлов (как правило определяются переменной окружения PATH).

  • Может быть переменная окружения PATH у вас правильно устанавливается только при интерактивном входе в систему. Это может случиться, если вы установили путь в неверном скрипте входа. Смотрите документацию по своей командной оболочке для подробностей.

  • Переменная среды PYTHONPATH может потребоваться для определения пути к модулям Mercurial. Может быть она вообще не установлена; содержит неверное значение; или устанавливается только при интерактивной сессии оболочки.

Если Вы успешно выполнили hg version по ssh соединению, то всё готово. Ваш сервер и клиент настроены. Вы можете начинать использовать Mercurial для доступа к хранилищам этого пользователя на этом сервере. При возникновении проблем на этом этапе, попробуйте использовать опцию --debug для более полного представления о происходящем.

6.5.6. Использование сжатия по ssh

Mercurial не сжимает данные, передаваемые по ssh, поскольку ssh протокол сам может прозрачно это делать. Однако, по-умолчанию, ssh-клиенты не используют компрессию передаваемых данных.

При работе по сети, отличной от высокоскоростной LAN, (даже по беспроводной сети), использование сжатия значительно ускоряет выполнение сетевых операций Mercurial'а. Например, кто-то измерил, что сжатие уменьшило время на клонирование через WAN достаточно большого хранилища с 51 минуты до 17 минут.

Оба клиента, и ssh, и plink, понимают опцию -C, которая включает сжатие передаваемых данных. Вы легко можете разрешить компрессию по ssh для Mercurial, отредактировав ваш файл ~/.hgrc. Вот как сделать это в обычном ssh на unix-подобных операционных системах, для примера.

[ui]
ssh = ssh -C

Если Вы используете ssh, то можете настроить постоянное использование сжатия при работе с Вашим сервером. Для этого поправьте файл .ssh/config (может не существовать), как приведено ниже.

Host hg
  Compression yes
  HostName hg.example.com

Здесь определён синоним, hg. При его использовании в командной строке ssh или в ssh-URL Mercurial'а, выполняется подключение к хосту hg.example.com с использованием сжатия. Это даёт Вам сразу и короткое имя для ввода, и включает компрессию, что хорошо и по-отдельности, и вместе.

6.6. Работа по HTTP с использованием CGI

Самый простой способ раздавать один или более репозиториев на постоянной основе, это использовать веб-сервер и встроенную реализацию CGI в Mercurial.

В зависимости от ваших целей, конфигурирование интерфейса CGI системы Mercurial может занять от нескольких мгновений до нескольких часов.

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

[Примечание] Требуется высокая надёжность

Конфигурирование веб-сервера это сложная, кропотливая деятельность, сильно зависящая от всей системы. Я не могу дать указания для всех случаев, с которыми вы столкнетесь. Пожалуйста, будьте внимательны и рассудительны в следующей части работы. Будьте готовы совершить множество ошибок и провести бессоные ночи, читая логи ошибок сервера.

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

6.6.1. Список проверок конфигурации веб-сервера

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

  1. Имеется ли в вашей системе установленный web-сервер? Mac OS X и разные дистрибутивы Linux поставляются с Apache, но во многих других операционных системах веб-серверы могут быть не установлены.

  2. Если web-сервер установлен, запущен ли он? В большинстве систем, даже если он есть, он может быть отключен по умолчанию.

  3. Позволяет ли конфигурация вашего сервера выполнять программы CGI в директории, где вы планируете это делать? Большинство серверов по умолчанию явно запрещают запуск CGI программ.

Если ваш web-сервер не установлен или у вас нет достаточного опыта конфигурирования Apache, вам следует использовать web-сервер lighttpd вместо Apache. Apache известен за причудливость и запутаность конфигурации. Хотя lighttpd менее функционален, чем Apache, большинство из его недостатков не относятся к обслуживанию хранилищ Mercurial. И с lighttpd несомненно намного легче начать работу, чем c Apache.

6.6.2. Базовая конфигурация CGI

Обычно в Unix-системах поддиректория web-контента пользователя имеет имя public_html и расположена в домашней директории. Файл с именем foo в этой директории будет доступен по ссылке http://www.example.com/username/foo.

Для начала работы найдите скрипт hgweb.cgi, который должен быть в вашей копии Mercurial. Если вы не можете быстро найти его локальную копию в вашей системе, просто скачайте его из основного хранилища Mercurial http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi.

Вам следует скопировать данный скрипт в вашу директорию public_html и задать ему права на исполнение.

cp .../hgweb.cgi ~/public_html
chmod 755 ~/public_html/hgweb.cgi

Аргумент 755 команды chmod — установка прав на выполнение скрипта; он описывает, что скрипт может читаться и выполняться всеми пользователями, а права на запись у «группы» и «других» пользователей не установлены. Если бы Вы оставили всем права на запись, то модуль suexec сервера Apache скорее всего отказался бы выполнять скрипт. suexec так же требует, чтобы директория, в которой находится скрипт, не была доступна для записи другим пользователям.

chmod 755 ~/public_html

6.6.2.1. Где могут возникнуть проблемы?

Как только вы скопировали CGI скрипт, попробуйте перейти браузером по адресу http://myhostname/~myuser/hgweb.cgi, но не падайте духом перед неудачными попытками. Вероятней всего вы не сможете открыть ссылку, и на это есть множество причин. На самом деле вы спотыкаетесь на одной из ошибок, приведенных ниже, поэтому, пожалуйста, прочтите внимательно. Это те ошибки, с которыми я сталкивался в Fedora 7 с только что установленным Apache и пользовательским аккаунтом, который я специально создал для этого.

Ваш веб-сервер может иметь настройки, запрещающие пользовательский веб-контент. При использовании Apache найдите в его конфигурационном файле директиву UserDir. Если она отсутствует, то отображение пользовательских директорий запрещено. В противном случае следующее за UserDir строковое значение определяет имя директории в домашнем каталоге пользователя, контент из которой будет отдаваться Apache'м. Например, public_html.

Ваши настройки безопасности могут быть слишком ограничивающими. Web сервер должен иметь возможность доступа к вашей домашней директории и вложенные в public_html директории, а также файлам в них. Вот рецепт, чтобы помочь вам сделать соотвествующие настройки безопасности.

chmod 755 ~
find ~/public_html -type d -print0 | xargs -0r chmod 755
find ~/public_html -type f -print0 | xargs -0r chmod 644

Другая возможная проблема с правами состоит в том, что вы можете получить пустое окно, когда пытаетесь загрузить скрипт. В этом случае очень похоже что ваши настройки безопасности также слишком ограничивают выполнение подсистемой запуска скриптов Apache скриптов у которых, к примеру, стоят права записи для группы или всех пользователей.

Ваш web сервер может быть сконфигурирован с отключенными опциями выполнения CGI программ. Вот файл пользовательской конфигурации по умолчанию из моей ОС Fedora:

<Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
  <Limit GET POST OPTIONS>
    Order allow,deny
    Allow from all
  </Limit>
  <LimitExcept GET POST OPTIONS>
    Order deny,allow Deny from all
  </LimitExcept>
</Directory>

Если вы обнаружите похожую на эту группу Directory в вашей конфигурации Apache, добавьте ExecCGI в конец директивы Options, если она отсуствует и перезапустите web сервер.

Если при открытии через web браузер Ваш Apache выдаёт исходный текст CGI скрипта, вместо результатов его выполнения, то Вам надо добавить или раскомментировать (если уже есть) такую директиву:

AddHandler cgi-script .cgi

Следующая возможная проблема, которую вам придется решить, может быть красочный вывод трассировки Python, который будет говорить о том что он не может импортировать связанный с mercurial модуль. Это уже прогресс! Теперь сервер пытается выполнить CGI программу. Это ошибка вероятно произойдет, если вы проведете инсталяцию Mercurial для себя, вместо версии установки в систему.Помните что ваш web сервер запускает ваши CGI программы без каких-либо переменных среды, которые присуствуют в интерактивном сеансе. Если случилась такая ошибка, отредактируйте ваш hgweb.cgi файл и следйуте указаниям как установить внутри него правильную переменную среды PYTHONPATH.

В конце-концов вы увидите другую трассировку Python, которая будет жаловаться что не может найти /path/to/repository. Отредактируйте ваш hgweb.cgi скрипт и замените в нем строку /path/to/repository на полный путь к репозиторию, который вы хотите отобразить в web сервере.

В этом месте, когда вы попробуете перезагрузить web страничку, вы должны увидеть простой HTML интерфейс истории вашего репозитория. Фуф!

6.6.2.2. Настройка lighttpd

Чтобы быть исчерпывающим в моих экспериментах, я попробовал настроить всё более популярный lighttpd веб сервер для обслуживания того же репозитория, который я выше описывал с Apache. Я уже преодолел все проблемы выделенные с Apache, многие из которых не связаны с сервером. В результате я справедливо убедился в правильности разрешений на мои файлы и директории, и в том, что мой скрипт hgweb.cgi был надлежаще исправлен.

Раз у меня работал Apache, я смог быстро заставить lighttpd обслуживать репозиторий (другими словами, даже если вы попробуете использовать lighttpd, вам придётся читать раздел про Apache). Для начала я отредактировал секцию mod_access в его конфигурационном файле, чтобы включить mod_cgi и mod_userdir, которые по умолчанию были отключены в моей системе. Затем я добавил несколько строк в конце конфигурационного файла, чтобы настроить эти модули.

userdir.path = "public_html"
cgi.assign = (".cgi" => "" )

После этого lighttpd отлично запустился. Если бы я настраивал lighttpd до Apache, то почти наверняка столкнулся бы с теми же проблемами конфигурации системы, что и в Apache. Однако, я нашел, что lighttpd заметно проще конфигурировать чем Apache, несмотря на то, что я уже использовал Apache больше десяти лет, и это был мой первый опыт работы с lighttpd.

6.6.3. Настройка доступа к нескольким хранилищам с помощью одного CGI-скрипта

Скрипт hgweb.cgi позволяет Вам опубликовать одно хранилище, что является досадным ограничением. Если Вы хотите опубликовать больше одного, использовав несколько копий этого скрипта с разными именами без раздражения себя, лучшим выбором будет использовать скрипт hgwebdir.cgi.

Процедура настройки hgwebdir.cgi несколько сложнее чем hgweb.cgi. Для начала, Вы должны получить копию скрипта. Если у Вас его нет под рукой, можете загрузить из хранилища Mercurial по ссылке http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi.

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

cp .../hgwebdir.cgi ~/public_html
chmod 755 ~/public_html ~/public_html/hgwebdir.cgi

После базовой настроки попробуйте открыть http://myhostname/~myuser/hgwebdir.cgi в Вашем браузере. Должен отображаться пустой список хранилищ. Если Вы получаете пустое окно или сообщение об ошибке, попробуйте просмотреть список потенциальных проблем в Раздел 6.6.2.1, «Где могут возникнуть проблемы?».

Скрипт hgwebdir.cgi зависит от внешнего файла конфигурации. По-умолчанию он ищет файл hgweb.config в этом же каталоге. Вы должны создать его и сделать общедоступным. Формат этого файла похож на формат «ini» файлов в Windows, который распознается в Python модулем ConfigParser [web:configparser].

Самый простой способ настроить hgwebdir.cgi — использовать раздел, который называется collections. Это позволит автоматически опубликовать все хранилища в каталоге, который Вы укажите. Этот раздел должен выглядеть следующим образом:

[collections]
/my/root = /my/root

Mercurial воспринимает это так: смотрит имя директории с правой стороны от знака «=»; ищет репозитории внутри этой директории; и использует текст с левой стороны чтобы обрезать совпадающий текст в именах, фактически отображающихся в веб интерфейсе. Оставшаяся часть после обрезания пути называется «виртуальный путь».

В упомянутом выше примере, если мы имеем репозиторий, чей локальный путь /my/root/this/repo, CGI скрипт обрежет начальную часть /my/root в имени и опубликует репозиторий с виртуальным путём this/repo. Если базовый URL нашего CGI скрипта http://myhostname/~myuser/hgwebdir.cgi, тогда полный путь для этого репозитория будет http://myhostname/~myuser/hgwebdir.cgi/this/repo.

Если мы заменим /my/root с левой стороны этого примера на /my, тогда hgwebdir.cgi будет просто обрезать /my из имени репозитория и будет предоставлять виртуальный путь root/this/repo вместо this/repo.

Скрипт hgwebdir.cgi будет рекурсивно искать в каждой из перечисленных в секции collections конфигурационного файла директории, но не будет рекурсивно искать в найденых репозиториях.

Механизм collections позволяет легко публиковать множество репозиториев в манере «выстрелил и забыл». Вам нужно только один раз установить CGI скрипт и конфигурационный файл. Впоследствии вы можете публиковать и прятать репозиторий в любое время, просто помещая внутрь или убирая из дерктории, за которой наблюдает hgwebdir.cgi.

6.6.3.1. Явное определение публикуемых репозиториев

В дополнение в механизму collections, скрипт hgwebdir.cgi позволяет вам публиковать специфичный лист репозиториев. Для того сделать это создайте секцию paths с содержимым подобным этому:

[paths]
repo1 = /my/path/to/some/repo
repo2 = /some/path/to/another

В этом случае, виртуальный путь (показывающаяся в URL часть) расположен слева в каждом определении, тогда как путь к репозиторию находиться справа. Обратите внимание, что нет никакой зависимости между выбранным вами виртуальным путём и положением ропозитория в вашей файловой системе.

Если вы хотите, то можете использовать collections и механизм paths одновременно в одном конфигурационном файле.

[Примечание] Остерегайтесь дублирования виртуальных путей

Если несколько репозиториев будут иметь один и тот же виртуальный путь, hgwebdir.cgi не будет сообщать об ошибке. Вместо этого он будет вести себя непредсказуемо.

6.6.4. Загрузка исходных архивов

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

По умолчанию эта возможность отключена. Если вы хотите включить её, вам нужно будет добавить элемент allow_archive в секцию web вашего ~/.hgrc файла.

6.6.5. Опции настройки веб интерфейса

Web интерфейс Mercurial (команда hg serve, hgweb.cgi и скрипты hgwebdir.cgi) имеют несколько опций, которые вы можете настроить. Они располагаются в секции web.

  • allow_archive Определяет который (если нужно) из методов загрузки архивов поддерживает Mercurial. Если вы включите эту опцию, пользователи веб интерфейса смогут скачать архив любой версии репозитория, который они просматривают. Чтобы включить возможность загрузки архивов, этот элемент должен содержать последовательность слов, перечисленных ниже.

    • bz2: Архив tar, сжатый по алгоритму bzip2. Имеет наилучшую степень сжатия, но использует больше процессорного времени на сервере.

    • gz: Архив tar, сжатый по алгоритму gzip.

    • zip: Архив zip, сжатый используя алгоритм LZW. Этот формат имеет наихудшее сжатие, но широко используется в мире Windows.

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

    [web]
    allow_archive = bz2 gz zip
  • allowpull: Boolean. Определяет позволяет ли web интерфейс удаленным пользователям использовать команды hg pull и hg clone через HTTP. Если эта опция установлена в no или false, то только «пользовательская» часть web интерфейса доступна.

  • contact: String. Строка свободного формата (но предпочтительно короткая) отождествляющая человека или группу создавшую репозиторий. Она обычно содежит имя и email адрес человека или листа почтовой рассылки. Эту запись обычно располагают в собственном .hg/hgrc репозитория, но так же можно расположить в глобальном ~/.hgrc, если каждый репозиторий имеет единственного мейнтейнера.

  • maxchanges: Integer. Максимальное количество наборов изменений отображаемое на одной странице по умолчанию.

  • maxfiles: Integer. Максимальное количество модифицированных файлов отображаемое на одной странице по умолчанию.

  • stripes: Integer. Если web интерфейс отображает разноцветные «полосы», облегчающие визуальное восприятие выводимых строк, то значение этого параметра будет означать количество строк текста в каждой цветной строке.

  • style: Управляет шаблоном Mercurial, использующимся для отображения web интерфейса. Mercurial поставляется с несколькими веб-шаблонами.

    • coal — чёрнобелый.

    • gitweb — эмулирует веб-интерфейс git-а

    • monoblue — используются синие и серый цвета.

    • paper — используется по умолчанию.

    • spartan — ранее использовался по умолчанию.

    Вы можете также определить свой шаблон; более детально эта возможность обсуждается в Глава 11, Настройка вывода Mercurial. Ниже вы можете видеть как включить стиль gitweb.

    [web]
    style = gitweb
  • templates: Path. Path содержит имя каталога в котором ищутся файлы шаблонов. По умолчанию Mercurial ищет их в директории где установлен.

Если вы используете hgwebdir.cgi, вы можете поместить для удобства некоторые элементы конфигурации в секцию web файла hgweb.config, вместо файла ~/.hgrc. Это элементы — motd и style.

6.6.5.1. Опции, специфичные для индивидуального репозитория

Некоторые элементы раздела web должны быть помещены в локальный файл .hg/hgrc, вместо помещения их в глобальный ~/.hgrc для пользователя.

  • description: String. Строка в свободной форме (предпочтительно небольшая), которая описывает сущьность репозитория или его содержимое.

  • name: String. Строка с именем репозитория для использования в web интерфейсе. Она имеет больший приоритет (переопределяет) нежели имя по умолчанию, которое является последним компонентом пути репозитория.

6.6.5.2. Опции, специфичные для команды hg serve

Некоторые элементы секции web файла ~/.hgrc используются только с командой hg serve.

  • accesslog: Path. Имя файла для аудита доступа. По умолчанию команда hg serve пишет свою информацию в stdout, а не в файл. Элементы лог файла пишутся в стандартном «объединенном» формате файлов, который используется почти всеми web серверами.

  • address: String. Локальный адрес, который должен слушать web сервер в ожидании подключений к нему. По умолчанию сервер слушает все адреса.

  • errorlog: Path. Имя файла в который будут выводиться сообщения об ошибках. По умолчанию команда hg serve записывает эту информацию в stdout, а не в файл.

  • ipv6: Boolean. Определяет использовать или нет IPv6 протокол при работе сервера. По умолчанию IPv6 не используется.

  • port: Integer. Определяет номер порта (число) который будет слушать web сервер. По умолчанию значение равно 8000.

6.6.5.3. Выбор правильного файла ~/.hgrc для добавления элементов в секцию web.

Важно помнить, что веб сервера вроде Apache или lighttpd запускаются под пользовательским аккаунтом (UID-ом), который отличается от того, под которым работаете вы. Скрипты CGI, запускаемые вашим сервером, такие как hgweb.cgi, обычно запускаются под тем же пользователем (UID-ом).

Если вы добавляете элементы в секцию web вашего персонального ~/.hgrc, то CGI скрипты не станут читать этот файл. Произведенные там настройки влияют только на поведение команды hg serve, когда вы ее используете. Чтобы заставить CGI скрипты видеть ваши параметры настроек создайте файл ~/.hgrc в домашнем каталоге пользователя под кем запускается web сервис, или добавьте эти параметры к основному системному файлу hgrc.

6.7. Системный файл конфигурации

На Unix-подобных операционных системах совместного использования несколькими пользователями (например, сервер, на котором люди публикуют изменения), часто имеет смысл создавать некое глобальное поведение по умолчанию, например, какие темы использовать в веб-интерфейсах.

Если файл с именем /etc/mercurial/hgrc существует, Mercurial будет читать во время запуска и применять параметры конфигурации, которые находит в этом файле. Он также будет искать файлы с расширением .rc в каталоге /etc/mercurial/hgrc.d, и применять параметры конфигурации, которые находит в этих файлах.

6.7.1. Делаем Mercurial более доверенным.

Один из ситуации, в котором глобальный hgrc может быть полезен, если пользователи вытягивают изменения, принадлежащие другим пользователям. По умолчанию Mercurial не будет доверять большинству параметров конфигурации из файла .hg/hgrc в репозитории, который принадлежит другому пользователю. Если мы клонируем или вытягиваем изменения такого хранилища, Mercurial выведет предупреждение о том, что он не доверяет параметрам из .hg/hgrc.

Если все участники команды находятся в той или иной группе Unix и доверяют конфигурации друг друга, или мы хотим доверять конкретным пользователям, мы можем переопределить в Mercurial скептическое отношение по-умолчанию путем создания общесистемного файла hgrc, такого как:

# Save this as e.g. /etc/mercurial/hgrc.d/trust.rc
[trusted]
# Trust all entries in any hgrc file owned by the "editors" or
# "www-data" groups.
groups = editors, www-data

# Trust entries in hgrc files owned by the following users.
users = apache, bobo