config 파일에 사용할 플러그 인들에 대한 정보를 작성해 준다. 활용할 플러그인은 총 세개이다.
black : 코드 포멧팅 / flake8 : 코드 린트 / isort : 파이썬 import 정리
포멧팅을 하는데 굳이 린팅을 할 필요가 있나 싶긴한데, 찾아보니 py파일 말고 문서같은 것들을 위해 린트가 필요하다고 하긴하는데,
자바같은 경우 말고도 꼭 필요한진 잘모르겠다. 그리고, black의 경우 따로 configuration을 제공하진 않는데(yapf는 어느정도 제공해주긴함) 근데 formatting 자체가 일관된 코드 스타일을 맞추기 위해서 하는 것이고, python의 경우 PEP8이라는 확고한 스타일이 있다보니 딱히 필요없긴 한 것 같다. 어쨋든 각 플러그인의 설정을 위해 setup.cfg 파일도 작성해 준다.
마지막으로 아래 명령어를 작성하면 .git/hook 경로에 pre-commit 파일이 생기고,
커밋메시지 제목의 시작부분이 [이슈번호] 인지 체크하고, 아닐 경우 이슈번호인지 체크하고 [이슈번호]로 포멧팅 해주도록 작성했다. 사실 이슈번호 자체가 오타일 경우를 대비해서 정규표현식으로 체크해주면 어느정도 오타도 체크할 수 있을 것 같은데 오타라는게 어떻게 나올지도 모르고, 경우의 수를 모두 체크하기 복잡할 것같아서 커밋할 때 그냥 이슈번호를 아예 작성안하기로 스스로 결심했다. 그래서 사실 이슈번호로 시작하는 지 체크하는 것도 필요없을 것 같긴하다.
# Subject line should be contain Issue Number.
if ! [[ "$(head -n 1 $COMMIT_EDITMSG)" =~ ^"[$BRANCH_NAME]" ]]
then
if [[ "$(head -n 1 $COMMIT_EDITMSG)" =~ ^"$BRANCH_NAME" ]]
then
echo -e "\033[40;33mCommit warning:\033[0m The Issue Number should be expressed in the form of [Jira Issue Number]."
echo -e "\033[40;33mCommit warning:\033[0m Converted to the form of [Issue Number]."
echo "$(sed -i -e "1s|$BRANCH_NAME|[$BRANCH_NAME]|g" $COMMIT_EDITMSG)"
else
echo -e "\033[40;33mCommit warning:\033[0m Subject line should be contain Issue Number."
echo -e "\033[40;33mCommit warning:\033[0m Added [Issue Number].."
echo "$(sed -i -e "1s/^/[$BRANCH_NAME] /" $COMMIT_EDITMSG)"
fi
fi
2) 제목에 Type이 명시되어야함
간단하다. 커밋메시지 파일의 첫번째 줄에 type에 해당하는 것이 몇 개(?) 들어있는지 체크하여 0 이면 에러 발생시켰다.
# Subject line should be contain what Type it is.
if [ "$(head -n 1 $COMMIT_EDITMSG | egrep -c '(\[+[feat|fix|docs|style|refactor|test|chore|etc]+\])' )" -eq 0 ]
then
echo -e "\033[40;31mCommit failed:\033[0m Subject line should be contain what Type it is."
exit 1
fi
3) 제목의 길이는 50자를 초과하면 안됨
간단히 wc를 통해 character 숫자를 체크했다.
# Subject line should be less than 50 characters.
if [ "$(head -n 1 $COMMIT_EDITMSG | wc -L)" -gt 50 ]
then
echo -e "\033[40;31mCommit failed:\033[0m Subject line should be less than 50 characters."
exit 1
fi
4) 제목 다음엔 공백이 필수적으로 와야함 요게 좀 문제라면 문제인데, 커멧 메시지 파일의 2번째 줄이 공백이 아니면, 두번째 줄에 공백 삽입으로 하고 싶었는데 왜인지모르게 sed로 공백을 넣으면 아예 안들어가거나 두 줄씩 들어가길래, 아예 두 줄이 들어가게 두고 세번째 줄을 삭제하였다.
# After subject line, line space is required.
if [ -n "$(sed -n '2p' $COMMIT_EDITMSG)" ]
then
echo -e "\033[40;33mCommit warning:\033[0m After subject line, line space is required."
echo -e "\033[40;33mCommit warning:\033[0m A line space is inserted after the subject line."
echo "$(cat $COMMIT_EDITMSG | sed '1 a\\n')" > $COMMIT_EDITMSG
echo "$(cat $COMMIT_EDITMSG | sed '2d')" > $COMMIT_EDITMSG
fi
5) 본문의 길이는 72자를 초과하면 안됨
마찬가지로 wc 통해서 character 숫자 체크했다. 어쩌피 제목 50자는 위에서 체크했으니 그냥 커밋메시지 모든 라인에 대해서 수행했다.
# Every single description should be less than 72 characters.
if [ "$(wc -L < $COMMIT_EDITMSG)" -gt 72 ]
then
echo -e "\033[40;31mCommit failed:\033[0m Every single description should be less than 72 characters."
exit 1