Для упрощения работы с Jira я подготовил для коммита следующую функцию:
commit() {
BRANCH=$(git branch --show-current)
REPOSITORY=$(git rev-parse --show-toplevel)
IFS='-' read -r -A BRANCH_PARTS <<<"$BRANCH"
NUM_REGEX='^[0-9]+$'
JIRA_ID_DEFINITION="${REPOSITORY}/.jira"
PROJECT_PREFIX=$(cat $JIRA_ID_DEFINITION)
if [[ ${BRANCH_PARTS[1]} == 'dev' ]] && [[ ${PROJECT_PREFIX} != "" ]]; then
# If branch has a format: dev-{projectId}-{taskId}
if [ "${#BRANCH_PARTS[@]}" -ge 3 ] && ! [[ ${BRANCH_PARTS[2]} =~ $NUM_REGEX ]] && [[ ${BRANCH_PARTS[3]} =~ $NUM_REGEX ]]; then
COMMIT_MSG="${BRANCH_PARTS[2]:u}-$(printf %03d ${BRANCH_PARTS[3]})"
# If branch has a format: dev-{taskId}
elif [[ ${BRANCH_PARTS[2]} =~ $NUM_REGEX ]]; then
COMMIT_MSG=$PROJECT_PREFIX
for part in "${BRANCH_PARTS[@]}"; do
if [[ ${part} =~ $NUM_REGEX ]]; then
COMMIT_MSG+="-$(printf %03d $part)"
fi
done
fi
COMMIT_MSG+=": $1"
else
COMMIT_MSG=$1
fi
if ask "[VRS-Env] Skip CI process?" N; then
COMMIT_MSG+=" [skip-ci]"
fi
echo -e "n::> $COMMIT_MSG"
if ask "Is that correct?" Y; then
git commit -m "$COMMIT_MSG"
fi
}
Идея проста:
Если текущий корень проекта (корень Git) содержит файл .jira, получаем его контент (он содержит только Jira ID, т.е. PROJ).
Затем мы проверяем, начинается ли имя ветки с dev — если нет, имя фиксации будет «чистым» (без префикса), но если ветка, например, dev-13, то перед фиксацией будет стоять префикс PROJ-13: [rest of commit message].
Но у нас могут быть ветки для других проектов, например dev-proj2-22, так что мы тоже обработаем его ‘в формат PROJ2-22: [rest of commit message].
Он работает так, как я хочу, но я думаю, что есть код, который может выглядеть лучше.
Что вы думаете? Что я могу сделать лучше?
