コミットメッセージが特定のスタイルガイドに準拠していることを確認するプロジェクト用のcommit-msg
フックを作成しようとしています。git
しかし、正規表現の場合、別の方法で動作するものがあるようですbash
。私の目標をどのように達成できますか?
#!/usr/bin/env bash
read -r -d '' pattern << EOM
(?x) # Enable comments and whitespace insensitivity.
^ # Starting from the very beginning of the message
(feat|fix|docs|style|refactor|test|chore) # should be a type which might be one of the listed,
:[ ] # the type should be followed by a colon and whitespace,
(.{1,50})\n # then goes a subject that is allowed to be 50 chars long at most,
(?:\n((?:.{0,80}\n)+))? # then after an empty line goes optional body each line of which
# may not exceed 80 characters length.
$ # The body is considered everything until the end of the message.
EOM
message=$(cat "${1}")
if [[ ${message} =~ ${pattern} ]]; then
exit 0
else
error=$(tput setaf 1)
normal=$(tput sgr0)
echo "${error}The commit message does not accord with the style guide that is used on the project.${normal}"
echo "For more details see https://udacity.github.io/git-styleguide/"
exit 1
fi
私もこの正規表現を次のようにオンラインで書いてみました。
pattern="^(feat|fix|docs|style|refactor|test|chore):[ ](.{1,50})\n(?:\n((?:.{0,80}\n)+))?$"
\n
交換しようとしましたが、$'\n'
役に立ちませんでした。
ベストアンサー1
BashはPOSIX拡張正規表現(ERE)をサポートしますが、Perl互換正規表現(PCRE)はサポートしません。特に(?x)
PCRE(?:...)
です。
(?:...)
に変更すると、1行のバージョンを簡単に確認できます(...)
。 Perlx
修飾子が提供する「空白を無視する」機能は、拡張正規表現では使用できません。