훅을 처음 써보면서, shell script도 제대로 쓸줄몰라 엄청 해멨으나 일단 원하는걸 하나 구현해놨기에 기록해둔다.
원하는건 코드 컨벤션을 맞추기 위해 설정한 문구 중
모든 코드 스타일을
void foo()
{
codes;
}
방식으로 픽스하기 위한 조건이었다.
그걸 위해, 검색해서 pre-commit 을 수정해보려고 하니... 에러가 뜬다.
error: cannot spawn .git/hooks/pre-commit: No such file or directory
대충 이런 문구다.
요약하면 pre-commit이라는 hook이 없다는 얘긴데...
정확한 이유는 파악하지 못했으나, git 용 hook에 필수적으로 포함되어야 하는 문구들이 있는 모양이었다.
해서, 검색을 통해 어떤 문구가 있어야하는지 파악을 해두고, 문구 적용을 시켜보도록 했다.
#단순히 ") {" 스타일이 들어오면 밴 먹임
disallowed="){"
git diff --cached --name-status | while read x file; do
if ["$x" == 'D']; then continue; fi #뭔 의미지? 'D'가 뭐지?
if grep ')\s{' $file ; then
echo "ERROR: 코드 스타일 에러입니다."
exit 1
fi
for word in "$disallowed"
do
if egrep $word $file ; then
echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
exit 1
fi
done
done || exit $?
완성된건 이런 스타일인데, 정리하면 다음과 같다.
1. disalowed에 "없어야 될 문자열"을 기록한다.
2. git에서 수정된 사항을 읽는다.
3 (은 이해를 못했습니다...)
4. 파일을 전체 검색하며, 조건에 맞는 문자열이 있는지 검사후, 조건에 만족하면 echo 메시지를 띄운 후 에러를 리턴한다.
5. 정상 통과 하면 while문을 종료시키고 끝낸다.
의 구조이다.
웃긴점은, 이를 좀 "있어보이게" / "다른 사용자들이 큰 수정할 필요없이" 적용을 시키기 위해 core.hooksPath를 수정해줬더니 저 hook 조차 에러를 검사하여 리턴해버리는게 아닌가...
이거 뭔... 제 발등 찍기도 아니고
해서, 이런 경우에는 hookspath를 임의로 수정해준 뒤, 커밋 갱신을 해줘야 하는 소소한 불편함(?)이 발생하고 있다.