CVS Commit and Auto-indentation

pynoos의 이미지

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

입니다.

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.