CVS Commit and Auto-indentation
CVS Commit and auto-indent
----------------------------
http://bbs.kldp.org/viewtopic.php?t=24058
글과 이어서, CVS를 사용하여 공동 작업할 때, 도움이 되는 설정법에 대해 소개할 까합니다.
http://bbs.kldp.org/viewtopic.php?t=24117
에서 떵개cho 님께서 올리신다고 하였는데, 그래서 안올릴까도 생각해보다가 각자의 작업을 올리면 읽는 사람들에게는 많은 샘플이 생기는 것이므로 더 유익할 것이라 생각하여 올립니다.
* indent
indent 라는 것은 GNU 사이트에서 구할 수 있습니다. gnu에서 나오는 대부분의 source indentation이 이 툴을 이용하여 맞추어집니다. default 설정이 아마 gnu indent guide에 맞게 되어 있는 것으로 알고 있는데요. 상당히 흥미로운 option들이 많이 있습니다.
그리고, 주로 C 언어에 맞게 되어 있어서, C++를 사용할 경우, template이나 public, private 등의 예약어 주위에서 깨지는 경향이 있습니다. C++에 대한 지원이 어느정도 내부적으로 이루어지고 있고 아직 공식적으로 지원한다는 말은 없지만, 비교적 최근 버전의 소스를 보면, C++관련된 option들이 몇개 들어가고 있는 것을 확인할 수 있습니다.
http://yaimma.co.kr/GNU_Source/indent-2.2.6/args.c
--tab-size8 --use-tabs --line-length120 --indent-level8 --brace-indent0 --declaration-indentation10 --case-brace-indentation1 --braces-after-struct-decl-line --struct-brace-indentation0 --dont-cuddle-else --no-blank-lines-after-commas --no-blank-lines-after-declarations --blank-lines-after-procedures --no-space-after-function-call-names --no-space-after-parentheses --continue-at-parentheses --dont-break-procedure-type --comment-indentation0 --start-left-side-of-comments --declaration-comment-column60 --swallow-optional-blank-lines --c-plus-plus -T regex_t -T FILE -T pair -T vector -T set -T map -T list -T string -T string::size_type -T StringSet -T StringSet::iterator -T StringSet::const_iterator -T StringVector -T StringVector::iterator -T StringVector::const_iterator -T StringStringMap -T StringStringMap::iterator -T StringStringMap::const_iterator -T iterator -T const_iterator
회사에서 저희 팀이 사용하는 indent option은 위와 같습니다. 이 옵션으로 cvs가 commit 되면, .c, .h, .cc 에 해당하는 소스에 강제로 indent를 설정하는 예제를 보여드릴까합니다.
* commitinfo
위의 예제는 사실. $HOME/.indent.pro 에 들어 있는 indent 설정파일이라고 보시면 됩니다. 따라서 원리는, CVSROOT의 commitinfo를 수정하여, commit 되는 파일이 해당 확장자이면, indent에 .indent.pro를 읽도록 설정하는 것으로 구현하면 됩니다.
CVSROOT 설정에 대한 것은 http://bbs.kldp.org/viewtopic.php?t=24058 에서 소개하였으므로, 간단하게 넘어가겠습니다.
CVSROOT에 추가할 script와 파일은
indent.sh
.indent.pro
입니다. 그리고 당연히 indent 라는 패키지 아니면, source tar ball을 통한 설치가 선행되어야합니다.
* checkoutlist
우선 두개의 파일이 $CVSROOT/CVSROOT에 추가되어야하므로,
checkoutlist 를 다음과 같이 추가합니다.
indent.sh indentation help tool .indent.pro indentation help tool
* commitinfo
commitinfo 는 다음과 같이 수정합니다.
DEFAULT $CVSROOT/CVSROOT/indent.sh
* indent.sh
.indent.pro 는 위와 같은 예로 만드시면 되구요.
indent.sh 는
#!/bin/sh PATH=$PATH:/usr/local/bin:/usr/bin ABSDIR=$1 INDENT=indent HOME=$CVSROOT/CVSROOT export HOME dir=$1 shift for file in $@ do if [ -f "$file" ]; then case $file in *.hxx | *.h | *.cpp| *.cc | *.cxx | *.c) $INDENT ${INDENT_OPT} $file sed -e "s/( )/()/g" $file > $file.tmp mv $file.tmp $file ;; esac fi done
와 같이 하면됩니다. 잠시 스크립트에 주의해야할 부분은, .indent.pro가 $CVSROOT/CVSROOT 디렉토리에 추가되므로, HOME의 위치를 그곳으로 바꾸어 indent가 참조하는 .indent.pro가 제대로 동작하도록 하는 것과,
그리고, commitinfo에서 넘어오는 인자의 순서가 다음과 같다는 것을 염두에 두고, 해석하시면 됩니다.
indent.sh <module name> <file1> <file2>
와 같이 실행되므로, 처음 인자를 무시하고, 다음 파일부터 case 문에 넣어 비교하면 됩니다.
그리고, sed 문이 들어 있는 것은 indent 옵션중에, 함수 호출시, 인자사이를 띄게 하는 것이 있는데, 이 경우 아무 인자도 없으면, 참 보기 흉하게 됩니다. 이런경우를 모아주는 옵션이 없어서 꽁수를 넣었습니다.
-------------------------------------------------------------------------
참조하실 만한 예제는
http://cvs.kldp.net/cgi-bin/cvsweb.cgi/CVSROOT/?cvsroot=hserver
입니다.
댓글 달기