Не может извлечь подстроку с помощью регулярного выражения
Я пытаюсь написать обработчик prepare-commit-msg для git. Сценарий должен выполнить следующие шаги:
- Получить текущее имя ветки git (работает)
- Извлечь
issue-id
(не работает) - Проверьте, если
issue-id
уже в сообщении коммита - Если нет, вставьте
[issue-id]
перед сообщением фиксации
issue-id
имеет этот шаблон [a-zA-Z]+-\d+
и название ветки должно быть что-то вроде feature/issue-id-my-small-description
,
Но сейчас часть извлечения не в порядке...
Вот мой сценарий prepare-commit-msg:
# Regex used to extract the issue id
REGEX_ISSUE_ID="s/([a-zA-Z]+-\d+)//"
# Find current branch name
BRANCH_NAME=$(git symbolic-ref --short HEAD)
# Extract issue id from branch name
ISSUE_ID= $BRANCH_NAME | sed -r $REGEX_ISSUE_ID
# Check if the issue id is already in the msg
ISSUE_IN_COMMIT=$(grep -c "\[$ISSUE_ID\]" $1)
# Check if branch name is not null and if the issue id is already in the commit msg
if [ -n "$BRANCH_NAME" ] && ! [[ $ISSUE_IN_COMMIT -ge 1 ]]; then
# Prefix with the issue id surrounded with brackets
sed -i.bak -e "1s/^/[$ISSUE_ID] /" $1
fi
Изменить, чтобы добавить пример ввода / вывода
вход $1
это сообщение git commit, что-то вроде
fix bug on login
или же
fix MyIssue-234 which is a bug on login
Выходные данные должны быть входными данными с идентификатором проблемы, т.е.
[MyIssue-123] fix bug on login
1 ответ
Я не уверен, что и почему вы делаете, как делаете, но это самое близкое, что я получил, исправляя то, что, как я думал, должно быть исправлено в вашем коде:
# Regex used to extract the issue id
REGEX_ISSUE_ID="s/\[([a-zA-Z]+-[0-9]+)\].*/\1/"
# Find current branch name
BRANCH_NAME=$(git symbolic-ref --short HEAD)
if [[ -z "$BRANCH_NAME" ]]; then
echo "No brach name... "; exit 1
fi
# Extract issue id from branch name
ISSUE_ID=$(echo "$BRANCH_NAME" | sed -r "$REGEX_ISSUE_ID")
# Check if the issue id is already in the msg
ISSUE_IN_COMMIT=$(echo "$@" | grep -c "^\[*$ISSUE_ID\]*")
# Check if branch name is not null and if the issue id is already in the commit msg
if [[ -n "$BRANCH_NAME" ]]; then
if [[ $ISSUE_IN_COMMIT -gt 0 ]]; then
shift # Drop the issue if from the msg
fi
# Prefix with the issue id surrounded with brackets
MESSAGE="[$ISSUE_ID] $@"
fi
echo "$MESSAGE"
где $@
это все слова, которые вы предоставляете после "исправить" (напр. "$@" = "bug" "on" "login"
). Остальное, надеюсь, вы поймете после того, как сравните его с исходным кодом.