Как создать черный или ветвистый список веток для 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
,