Как создать черный или ветвистый список веток для git hooks?

Я пытаюсь добавить некоторую функциональность в ловушку git post-recieve-email, чтобы либо игнорировать определенные ветки, либо отправлять только электронные письма по определенным веткам (очевидно, эти опции будут взаимоисключающими). Я не хотел бы жестко закодировать список ветвей в саму ловушку, а вместо этого использовать секцию [hooks] файла конфигурации репозитория.

Я борюсь за то, чтобы поддерживать совместимость оболочки shell-bourne, при этом все еще имея возможность видеть, является ли имя ветви частью белого или черного списка.

Я думаю, что я мог бы сделать что-то вроде этого:

whitelist=$(git hooks.branch_whitelist)
while read oldrev newrev refname
do
  branch_name=${refname#refs/heads/}
  for wl_branch in $whitelist
  do
    if [ $branch_name = $wl_branch ] 
      ... send email ...
      break # prevents multiple emails on malformed whitelist string
  done
done

По какой-то причине вышеприведенное выглядит просто неправильно. У кого-нибудь есть лучший способ проверить, является ли строка членом списка (не поддерживается структура данных в bourne, если я правильно понимаю)?

Изменить: Было бы также неплохо иметь возможность выполнять частичное сопоставление строк (например, черный список всех ветвей -dev), но единственный ответ, который я нахожу снова и снова, это метод двойных скобок из bash.

1 ответ

Это скорее проблема оболочки, чем проблема мерзавца, но я уже писал такую ​​вещь. Вот функция:

# Is $1 in a list?
in_list()
{
        local match i

        match="$1"
        shift
        set -- $(echo "$@" | sed 's/,/ /g')
        for i do
                [ "$i" = "$match" ] && return 0 # i.e., "true"
        done
        return 1 # i.e., "false"
}

и пример его использования:

if in_list $branch_name $(git config --get hooks.foo); then ...

Форма списка - записи, разделенные пробелами и / или запятыми:

git config hooks.foo eh,bee,sea,de,e

или же:

git config hooks.foo 'eh bee sea de e'

(или любое сочетание двух).

Если вы хотите поддерживать какое-то регулярное выражение или глобализацию оболочки, должно быть довольно очевидно,1 как изменить in_list сделать это.

Обратите внимание, что новейший и лучший хук post-receive-email теперь является скриптом Python, а не скриптом оболочки.


1 Если это не очевидно, в конце концов: [ на самом деле команда (также пишется test), так что вы можете запустить любую команду для сравнения $match против $i, expr может делать (базовые) регулярные выражения:

expr "$match" : "${i}$" >/dev/null && return 0

увидит, если $match (имя ветви) соответствует любому регулярному выражению в списке. Причина использования ${i}$ в том, что expr левый якорь тест (а-ля питон re.match()) но не ставит якорь, так .*-dev Матчи x-devote так же как x-dev, что может быть не то, что вы имели в виду. С этим вы можете установить hooks.foo в .*-devНапример, (или включить это в список значений).

Для оболочки оболочки /bin/sh), используйте case вместо test / [:

case "$match" in
$i) return 0;;
esac

Здесь вы бы установить hooks.foo в *-devили что-то в том числе *-dev,

Другие вопросы по тегам