Информация об аутентификации Mercurial в истории - PullRequest
1 голос
/ 10 января 2012

У меня есть «центральный» репозиторий Mercurial, который настроен на использование HTTPS и требует аутентификации для клон-пуш-толкания изменений. Разработчики имеют свои собственные репозитории на своих компьютерах. Они свободно конфигурируют свои локальные настройки и, например, добавляют раздел как

[ui]
username = anyname

в локальный файл mercurial.ini.

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

Но я хочу, чтобы информация об аутентификации оставалась рядом с наборами изменений. Я думаю, что лучший способ сделать это - добавить еще одно дополнительное поле в описание ревизии, например, «pusher id» и сохранить там данные аутентификации.

Расширения, которые я обнаружил, не реализуют подобную функциональность. Можете ли вы дать мне информацию о некоторых сторонних расширениях, хуках или просто шаблонах кода или идеях, как это сделать? (Я абсолютно новый в Python)

1 Ответ

4 голосов
/ 10 января 2012

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

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

Это дает вам защиту от случайных (или злонамеренных!) Изменений, внесенных всервер: если Алиса и Боб говорят о «changeset X», то они могут быть уверены, что они действительно имеют в виду одно и то же.Если сервер (или кто-то еще) может изменить содержимое набора изменений, не затрагивая идентификатор, то Алисе и Бобу не будет гарантировано, что «X» действительно означает одно и то же в обоих репозиториях.Это свойство, конечно, также является фундаментальным для работы Mercurial при синхронизации репозиториев.

У вас есть две опции:

  1. Вы можете разрешить серверу отклонятьнажмите , если Алиса попытается вставить набор изменений с именем Боба.Это можно сделать с помощью хука pretxnchangegroup на сервере.Он проверит переменную среды HG_SOURCE и проверит, что указанный в списке пользователь также является инициатором всех отправленных наборов изменений между HG_NODE и tip.

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

    Если вам нужен push-журнал, взгляните на Kallithea , который имеет эту встроенную функциональность. Kallithea - это отличный способ размещения репозиториев Mercurial!Он обладает гораздо большей функциональностью, чем обычный hgweb CGI-скрипт.

...