Я пишу файл git hook. У меня есть следующее условие:

current_branch_name=$(echo $(git branch | grep "*" | sed "s;* ;;"))
merged_branch_name=$(echo $(git reflog -1) | cut -d" " -f 4 | sed "s;:;;")
release_branch_name="release"
develop_branch_name="develop"
master_branch_name="master"
hotfix_branch_name="hotfix/*"

if [[ ($current_branch_name == $release_branch_name  && $merged_branch_name == $develop_branch_name) 
        || ($current_branch_name == $master_branch_name && $merged_branch_name == $hotfix_branch_name) ]] ; then
#do something
fi

Я хотел бы переместить условия из оператора if в переменную. Я сделал:

current_branch_name=$(echo $(git branch | grep "*" | sed "s;* ;;"))
merged_branch_name=$(echo $(git reflog -1) | cut -d" " -f 4 | sed "s;:;;")
release_branch_name="release"
develop_branch_name="develop"
master_branch_name="master"
hotfix_branch_name="hotfix/*"
is_merge_from_develop_to_release=$(($current_branch_name == $release_branch_name  && $merged_branch_name == $develop_branch_name))
is_merge_from_hotfix_to_master=$(($current_branch_name == $master_branch_name && $merged_branch_name == $hotfix_branch_name))

if [[ $is_merge_from_develop_to_release || $is_merge_from_hotfix_to_master ]] ; then
#do something
fi

Это дает мне ошибку для hotfix/*, но это работает, если все условие вставлено в оператор if. Как правильно отделить условия от if?

ОТРЕДАКТИРОВАНО (окончательная версия):

function checkBranches {
    local current_branch=$(echo $(git branch | grep "*" | sed "s;* ;;"))
    local merged_branch=$(echo $(git reflog -1) | cut -d" " -f 4 | sed "s;:;;")
    hotfix_branch_name="hotfix/*"

    [[ $current_branch == "release"  && 
        $merged_branch == "develop" ]] && return 0
    [[ $current_branch == "master" &&
        $merged_branch == $hotfix_branch_name ]] && return 0
    return 1
}

if checkBranches ; then
#do something
fi
1
user3529850 7 Авг 2018 в 13:11

3 ответа

Лучший ответ

На самом деле не сохраняя ваши строки, но вы можете использовать функцию:

check_branch () {
    local current_branch=$(echo $(git branch | grep "*" | sed "s;* ;;"))
    local merged_branch=$(echo $(git reflog -1) | cut -d" " -f 4 | sed "s;:;;")
    local release_branch_name="release"
    local develop_branch_name="develop"
    local master_branch_name="master"
    local hotfix_branch_name="hotfix/*"
    [[ "$current_branch" == "$release_branch_name"  && 
        "$merged_branch" == "$develop_branch_name" ]] && return 0
    [[ "$current_branch" == "$master_branch_name" &&
        "$merged_branch" == "$hotfix_branch_name" ]] && return 0
    return 1
}

if check_branch; then
    #something
fi

Будут ли часто меняться названия ваших филиалов? Если нет, то было бы разумнее просто сравнить переменные со строками: release, develop, master, hotfix/*.

3
jesse_b 7 Авг 2018 в 04:23
Спасибо, хорошие моменты. Я обновил свой вопрос окончательной версией. Мне также пришлось удалить " и оставить строку hotfix/ в переменной, чтобы она работала.
 – 
user3529850
7 Авг 2018 в 13:09

С $(( )) вы можете выполнять арифметические действия, а не для сравнения строк.

В общем можно конвертировать

if cmd; then ...

К

var=$(cmd; echo $?)
if [[ $var ]]; then

Это выполнит cmd, а затем выведет статус возврата cmd, назначив его var.

0
RalfFriedl 7 Авг 2018 в 08:45
Нет, вам придется использовать if [[ $var = 0 ]]; then.... Попробуйте var=$(false; echo $?); if [[ $var ]]; then echo hello; fi И если вам не нужно указывать разницу между разными ложными значениями (например, 2, что часто указывает на ошибку), хранить значение выхода не очень полезно. Просто поместите код в функцию и вызовите ее из if.
 – 
ilkkachu
7 Авг 2018 в 15:12
case $(git branch   |sed -nes/*\ //p
)$(    git -reflog 1|cut -d\  -f4
)  in      release:develop\
|          master:hotfix/*\
)          : hooray!
esac
-1
mikeserv 7 Авг 2018 в 03:45