( Bash - Mercurial ) Проблема с выполнением сценария bash, позволяющим использовать его с помощью Mercurial Hook?

ОПИСАНИЕ

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

Меркуриал Настройка

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

Идея скрипта bash.

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

коды ниже.

1. Зацепите меркуриальный сервер (/var/hg/repository/.hg/hgrc)

    [hook]
     incoming=/home/user/incomming
  1. Bash-скрипт 1 (/home/user/incomming)

     nohup /usr/bin/sudo -i -u user /home/user/bin/changelog.sh $HG_NODE &>/dev/null &
    
  2. 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.

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


person Subha    schedule 29.11.2018    source источник


Ответы (1)


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

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

"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 в качестве прямого ввода, чтобы ему не нужно было запрашивать репозиторий (снова).

person planetmaker    schedule 29.11.2018
comment
Спасибо за ответ @planetmaker, теперь я использую changegroup - hook с идеей, которую вы предложили, чтобы получить $HG_NODE_LAST. Однако фактическая проблема заключалась в том, что между репозиторием сервера и репозиторием Sand-box использовался неправильный адрес. На самом деле это не проблема Mercurial. - person Subha; 06.12.2018