Как управлять файлами хуков в каталоге состояний «.hg /»? - PullRequest
1 голос
/ 04 октября 2011

Я пишу серию ловушек для изменений и фиксации, используя собственную реализацию Python Mercurial API . Частично это требует от меня сохранения определенной части информации, относящейся к моим хукам, такой как идентификатор последней ревизии, который мои хуки действительно видели.

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

Моей первой мыслью было просто использовать существующую конфигурацию .hg/hgrc, поскольку мне нужно хранить только простые строки и целые числа, и именно там в настоящее время живы те несколько строк конфигурации, которые используют мои хуки. API предоставляет простые средства для чтения этой конфигурации через ui.config*, но, похоже, нет никаких средств для ее фактического изменения или записи.

Мне достаточно просто получить список конфигурации, добавить или изменить его, а затем написать его с помощью модуля конфигурации, но я действительно чувствую, что могу пропустить что-то, что предлагает API. Я продолжаю думать: «, если в зрелом API нет очевидных способов сделать это, я мог бы поступить неправильно»."

Есть ли «правильный» способ сделать это, возможно, с помощью API? Или, может быть, что-то, чего я не нашел в API для управления такого рода данными без использования hgrc? Моя главная забота - гонки между несколькими людьми, толкающими одновременно.

1 Ответ

5 голосов
/ 05 октября 2011

Конфигурационные файлы hgrc предназначены только для чтения, и нет внутреннего API для записи в эти файлы. Единственным исключением из этого правила является то, что клон создает файл по умолчанию .hg / hgrc, содержащий исходный URL-адрес клона. Так что нет, не пытайтесь использовать это.

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

Для удобства объекты репо содержат метод открывания для файлов в пространстве рабочего состояния (.hg /, repo.wopener ()), которые защищены repo.wlock () и файлами в хранилище репозитория (.hg / store /, repo.sopener ()), которые защищены repo.lock ().

Также возможно делать атомарные записи в файл:

f = self.wopener("mydata", "w", atomictemp=True)
f.write(somedata)
f.close()

Обязательно прочитайте и это:

https://www.mercurial -scm.org / вики / LockingDesign

...