(Bash - Mercurial) Проблема с выполнением bash-скрипта, включающего его с Mercurial Hook? - PullRequest
0 голосов
/ 29 ноября 2018

ОПИСАНИЕ

Я хочу отправлять сообщения журнала изменений всем коллегам, когда в определенном филиале (test-branch) в ртутном хранилище делается push.

Mercurial Setup

  1. Локальный клонированный репозиторий (локальный компьютер пользователя)
  2. Серверный репозиторий (на сервере пользователи могут выдвигать или извлекать изменения здесь из своего локальногорепозитории на их компьютерах)
  3. репозиторий песочницы (обновляется параллельно с сервером для отслеживания и получения ссылки)

Идея, стоящая за сценарием bash.

  1. incomming-hook в репозитории сервера. Он запускает скрипт bash (bash-script1), который запускает другой скрипт bash (bash-script2), который проверяет некоторые условия и отправляет электронные письма.bash-скрипт 1 имеет две переменные $ HG_NODE9set by mercurial) и вывод stderr из него.

коды приведены ниже.

1.Прицепить на ртутном сервере (/var/hg/repository/.hg/hgrc)

    [hook]
     incoming=/home/user/incomming

Bash-скрипт 1 (/ home / пользователь / входящий)

 nohup /usr/bin/sudo -i -u user /home/user/bin/changelog.sh $HG_NODE &>/dev/null &

Bash скрипт 2 (/home/user/bin/changelog.sh)

#we go to the sandbox repository directory
cd /home/user/hg/repository
L_BRANCH_SANDBOX=$($HG branches | $GREP testbranch | $SORT -Vr |$AWK '{print $1}')
P_BRANCH=$($HG log -r $HG_NODE | $HEAD -n 4   | $GREP branch: | $AWK '{print $2}')
if [[ "$L_BRANCH_SANDBOX" == "$P_BRANCH" ]] ; then
Some commands and send mail
fi

РЕЗУЛЬТАТ

Я вижу, что ловушка срабатывает, когда мой BASH-SCRIPT1 выдает выходной сигнал, если я помещаю эхо-сигналы сверху и снизу, но мой BASH-SCRIPT2 даже неначать, поскольку это даже не отголосок в самом начале.Но мой BASH_SCRIPT2 запускается, если я запускаю его вручную с известным $ HG_NODE.

Спасибо за вашу поддержку

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что в входящем транзакции транзакция еще не выполнена, поэтому $HG_NODE еще не является действительным набором изменений в репозитории - который необходим вашему сценарию 2 для работы(передача все еще выполняется, поэтому доступна только в скрипте ловушек, script1).

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

"hooks.txnclose"
  Run after any repository transaction has been committed. At this point,
  the transaction can no longer be rolled back. The hook will run after
  the lock is released. See 'hg help config.hooks.pretxnclose' for details
  about available variables.

"hooks.pretxnclose"
  Run right before the transaction is actually finalized. Any repository
  change will be visible to the hook program. This lets you validate the
  transaction content or change it. Exit status 0 allows the commit to
  proceed. A non-zero status will cause the transaction to be rolled back.
  The reason for the transaction opening will be in "$HG_TXNNAME", and a
  unique identifier for the transaction will be in "HG_TXNID". The rest of
  the available data will vary according the transaction type. New
  changesets will add "$HG_NODE" (the ID of the first added changeset),
  "$HG_NODE_LAST" (the ID of the last added changeset), "$HG_URL" and
  "$HG_SOURCE" variables.  Bookmark and phase changes will set
  "HG_BOOKMARK_MOVED" and "HG_PHASES_MOVED" to "1" respectively, etc.

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

...