Ртутный хук не выполняется должным образом
-
21-08-2019 - |
Вопрос
Это должна быть очень простая вещь для запуска, но по какой-то причине она не будет работать с моим репозиторием Mercurial.Все, что я хочу, это чтобы удаленное репозиторий запускалось автоматически hg update
всякий раз, когда кто-то подталкивает к этому.Итак, у меня есть это в моем файле .hg / hgrc:
[hook]
changegroup = hg update
Просто, не так ли?Но по какой-то причине это никогда не выполняется.Я также попытался написать сценарий оболочки, который делал это..hg / hgrc выглядел примерно так:
[hooks]
changegroup = /home/marc/bin/hg-update
и hg-обновление выглядело примерно так:
#!/bin/sh
hg help >> /home/marc/works.txt;
hg update >> /home/marc/works.txt;
exit 0;
Но опять же, это не обновляется.Содержание hg help
выписываются на works.txt
, но ничего не выписано для hg update
.Есть ли что-то очевидное, чего я здесь не понимаю?Это мучает меня уже несколько дней, и, кажется, я просто не могу заставить это сработать.
Обновить
Итак, еще раз, используя -v
включение командной строки с моей рабочей станции при нажатии на удаленный репозиторий не выводит никаких подробных сообщений, даже если они у меня есть echo
строки в .hg/hgrc
.Однако, когда я выполняю push из клона репозитория в той же файловой системе (я вошел в систему через SSH), это то, что я получаю:
bash-3.00$ hg -v push ../test-repo/ pushing to ../test-repo/ searching for changes 1 changesets found running hook prechangegroup: echo "Remote repo is at `hg tip -q`" echo "Remote repo wdir is at `hg parents -q`" Remote repo is at 821:1f2656753c98 Remote repo wdir is at 821:1f2656753c98 adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files running hook changegroup: echo "Updating.... `hg update -v`" echo "Remote repo is at `hg tip -q`" echo "Remote repo wdir is at `hg parents -q`" Updating.... resolving manifests getting license.txt 1 files updated, 0 files merged, 0 files removed, 0 files unresolved Remote repo is at 822:389a6c7276c6 Remote repo wdir is at 822:389a6c7276c6
Итак, это работает, но опять же только тогда, когда я нажимаю из той же файловой системы.Это не сработает, если я попытаюсь перейти к репозиторию с другой рабочей станции по сети.
Решение
Я сам потратил некоторое время на изучение этого вопроса.Я думаю, что ответ на проблему описан кратко здесь:
Выходные данные должны быть перенаправлены в stderr (или /dev/null), поскольку для потока данных используется стандартный вывод .
По сути, вы не перенаправляетесь на stderr и, следовательно, не загрязняете стандартный вывод.
Другие советы
Что ж, пройдя через те же этапы разочарования, что и Марк У некоторое время назад, я, наконец, нашел решение проблемы, по крайней мере, при удаленном обслуживании с помощью скрипта hgwebdir WSGI.
Я обнаружил, что при использовании такого рода удаленной отправки через HTTP или HTTPS Mercurial просто игнорирует все, что вы записываете в файл .hg / hgrc или в ваш репозиторий.Однако, попадая на крючок в конфигурации hgwebdir делает свое дело.
Итак, если суть в вашем hgwebdir.wsgi скрипт - это что-то вроде
application = hgwebdir('hgweb.config')
раздел конфигурации [hooks] должен перейти в упомянутый hgweb.конфигурация.
Одним из недостатков является то, что эти крючки выполняются для каждое хранилище перечислены в разделе [пути] этой конфигурации.Несмотря на то, что HG предлагает другую функцию с поддержкой WSGI (hgweb вместо hgwebdir) для обслуживания только одного репозитория, она, похоже, не поддерживает никаких перехватов (и у нее нет никакой конфигурации).Это, однако, можно обойти, используя hgwebdir, как описано выше, и имея некоторый Apache RewriteRule, отображающий все в нужный подкаталог.Это работает у меня:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/reponame
RewriteRule ^(.*)$ reponame/$2 [QSA]
Получайте удовольствие, используя свои удаленные хукеры по HTTP: D
Прежде всего, я хочу исправить несколько комментариев выше.
- Перехваты вызываются также при переносе файловой системы.
- Нет необходимости хранить хук в том репо, с которым вы хотите, чтобы они работали.Вы также можете написать тот же хук, что и в вашем вопросе на стороне пользователя.Вы должны изменить событие с changegroup на исходящее, а также указать URL удаленного репозитория с помощью параметра -R.Затем, если отправляющий пользователь имеет достаточные привилегии в удаленном репозитории, перехват будет выполнен успешно.
.hg/hgrc
[hooks]
outgoing = hg update -R $HG_URL
Теперь перейдем к вашей проблеме....Я предлагаю создать перехватчики prechangegroup и changegroup и распечатать некоторые результаты отладки.
.hg/hgrc
[hooks]
prechangegroup = echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
changegroup = echo "Updating.... `hg update -v`"
echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
А также нажмите с помощью переключателя -v, чтобы вы могли знать, какой крючок запущен.Если вы все еще не можете разобраться, опубликуйте результат.Возможно, я смогу помочь.
Моя проблема заключалась в том, что мое приложение hgwebdir работало от имени пользователя "hg", но репозиторий принадлежал мне, поэтому мне пришлось добавить этот фрагмент конфигурации в hgweb.config, чтобы заставить его запускать перехваты:
[trusted]
users = me
Вам нужно, чтобы это было в удаленный hgrc репозиционирования.Звучит так, как будто это находится в вашем локальном репозитории.
Редактировать:Это также зависит от того, как вы нажимаете.Некоторые методы не вызывают перехваты с правой стороны.(ssh делает, я думаю, HTTP делает, файловая система делает нет)
Редактировать 2:Что, если вы нажмете "локально" на компьютере удаленного репозитория?Возможно, у вас разные пользователи / разрешения между веб-сервером и hgrc-файлом.(Смотрите [сервер] и доверенные директивы для hgrc.)
У меня была такая же проблема с запуском из Windows Eclipse через http, но после захвата stderr я обнаружил, что необходим полный путь к файлу hg.bat.Мой раздел "крючки" теперь выглядит следующим образом:
[hooks]
incoming = c:\Python27\Scripts\hg.bat update > hg_log.txt 2>>hg_err.txt
Надеюсь, это поможет кому-то еще.СтивеТ
Попробуй включение отладки подключений чтобы понять, почему он не работает.
Вероятно, проблема с разрешениями или что-то в этом роде.
потребовалось некоторое время, но у меня все получилось.
Я начал с
[hooks]
tag=set >&2
commit=set >&2
>& 2 переводит его в стандартную ошибку, поэтому удаленные консоли будут показывать это.
при удаленном запуске это должно выводиться в консоль, если оно запущено
hg push https://host/hg -v
Это было не так.
Я использовал hgweb.cgi, поэтому переключился на hgweb.wsgi без какой-либо разницы.
что я обнаружил, так это то, что некоторые перехваты не вызываются удаленно.
когда я переключил его на
[hooks]
incoming= set >&2
тег hooks и commit, похоже, не вызываются, но incoming и changeset вызываются.Я еще не подтвердил информацию о других.
теперь, когда у меня это заработало, я снова переключился на hgweb.cgi, и все работает по-прежнему.
Причина, которую я нашел для этого, не имеет ничего общего с перенаправлением stdout
Для stderr
.Как вы можете видеть на странице wiki, это не указано в текущей версии wiki
https://www.mercurial-scm.org/wiki/FAQ#FAQ.2FCommonProblems .В любом случае, чтобы_.27hg_push.27_and_have_an_automatic_.27hg_update.27_on_the_remote_server.3F
Проблема, которую я обнаружил, заключается в следующем разрешения.
В моей первоначальной настройке у меня был пользователь, скажем так hguser
с репозиторием на его домашней странице и скриптом /etc/init.d/hg.init
для запуска hg serve
.Проблема в том, что hg serve
управлялся root
, в то время как большинство файлов в репозитории относились к hguser
(некоторые из них переключились на root
в какой-то момент, но это не будет иметь значения, так как я исправлю их с помощью chown
)
Решение:
chown -R hguser:hguser /home/hguser/repo
(чтобы исправить ВСЕ файлы, вернитесь к hguser)- запуск
su hguser -c "hg serve ..."
(в моем случае из/etc/init.d/hg.init
) changegroup = hg update -C
под[hooks]
вrepo/.hg/hgrc
как обычно
Теперь это должно сработать дальше push
PS:в моем случае я скорее обновляю до head определенной ветки, поэтому я использую hg update -C -r staging
, чтобы промежуточный сервер обновлялся только до head предполагаемой ветви, даже если tip
это из другой ветки (например development
например)
Кстати, мой hg.init
сценарий закончился примерно так:(обратите внимание на su hguser
часть)
#!/bin/sh
#
# Startup script for mercurial server.
#
# @see http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html
HG=/usr/bin/hg
CONF=/etc/mercurial/hgweb.config
# Path to PID file of running mercurial process.
PID_FILE=/etc/mercurial/hg.pid
state=$1
case "$state" in
'start')
echo "Mecurial Server service starting."
(su hguser -c "${HG} serve -d --webdir-conf ${CONF} -p 8000 --pid-file ${PID_FILE}")
;;
'stop')
if [ -f "${PID_FILE}" ]; then
PID=`cat "${PID_FILE}"`
if [ "${PID}" -gt 1 ]; then
kill -TERM ${PID}
echo "Stopping the Mercurial service PID=${PID}."
else
echo Bad PID for Mercurial -- \"${PID}\"
fi
else
echo No PID file recorded for mercurial
fi
;;
*)
echo "$0 {start|stop}"
exit 1
;;
esac
PS:причитающийся кредит http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html