CVS Log Report

pynoos의 이미지

cvs repository 를 운영할 때 도움이 되는 tip 입니다.

 준비물
* CVS Repository
* cvsweb 혹은 viewcvs

------------------------------------------------------------------------------------------------
* CVSROOT 둘러보기

cvs repository 를 init 로 Repository를 하나 만들게 되면, 환경변수 $CVSROOT 를
CVS Root라고 할 때, 그 하위에 CVSROOT 라는 디렉토리가 하나 생깁니다. 이
디렉토리($CVSROOT/CVSROOT)는 cvs에 commit 할 때 여러가지 훅(?) 등을 설치할 수
있게 됩니다. 그리고 그 안의 파일들을 보면 아래와 같은 모습으로 되어 있는데,
",v" 파일들은 cvs,rcs에서 사용하는 버전 control 용 정보가 들어 있는 파일들이며,
개정이력들이 그대로 들어 있는 파일이지요.

checkoutlist
checkoutlist,v
commitinfo
commitinfo,v
config
config,v
cvsignore
cvsignore,v
cvswrappers
cvswrappers,v
editinfo
editinfo,v
loginfo
loginfo,v
modules
modules,v
notify
notify,v
rcsinfo
rcsinfo,v
taginfo
taginfo,v
verifymsg
verifymsg,v

CVSROOT도 하나의 모듈로써 관리를 할 수 있습니다. kldp.net에서 cvs를 사용해
보셨다면, 각 project의 CVSROOT 만들어지고, 기본적으로 CVSROOT라는 디렉토리와
project name에 해당하는 디렉토리 두 개가 기본적으로 주어지게 될 것입니다.

http://cvs.kldp.net/cgi-bin/cvsweb.cgi/?cvsroot=hserver

이 때 CVSROOT/* 의 파일들을 수정하려면

cvs checkout CVSROOT

라는 방법으로 가져오고 다시 commit 하면 되는 것입니다. 하지만 여기에서 주의할
것은, commit 하면, 모든 파일들은 단지 "*,v" 파일로 올라가게 되는데,
CVSROOT에서만큼은 기본적인 파일들은 $CVSROOT/CVSROOT 즉, 같은 위치에 바로
checkout 을 해놓기 때문에 ,v 없는 즉 working directory에 있는 꼴의 마지막
버전이 존재하게 됩니다.

따라서 만일 CVSROOT에 어떤 파일들을 추가할 경우 그 파일도 ",v"로 올라가게되므로
원하는 것을 하려면, 같은 자리에 checkout 되도록 해야하는데, 이때 넣어 주는
것이 checkoutlist 라는 파일을 편집해야하는 것입니다.

예를 들어 cvsreport 라는 shell script를 하나 추가한다면

$ cat checkoutlist

# The "checkoutlist" file is used to support additional version controlled
# administrative files in $CVSROOT/CVSROOT, such as template files.
#
# The first entry on a line is a filename which will be checked out from
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
# The remainder of the line is an error message to use if the file cannot
# be checked out.
#
# File format:
#
#       [<whitespace>]<filename><whitespace><error message><end-of-line>
#
# comment lines begin with '#'
cvsreport               Check error message

와 같은 형태로 한 줄 추가해야하는 것입니다.

------------------------------------------------------------------------------------------------
* Web base CVS viewer

이런 종류의 module에는 cvsweb (perl), viewcvs (python) 등이 있습니다.

http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi/
http://viewcvs.sourceforge.net/

viewcvs 가 cvsweb의 interface를 그대로 받았기 때문에 외관으로 보이는 것은 거의
같습니다. 이 들을 선택하는 기준은 여러가지가 있겠습니다만, 논외로 하고, 둘
중하나가 설치되었다고 가정하겠습니다.

제가 선호하는 것은 viewcvs + enscript + cvsgraph 조합입니다.
syntax coloring과 revision tree를 graph로 보이는 기능이 들어가죠.

------------------------------------------------------------------------------------------------
* Loginfo

이 툴에서 제공하는 것 중에, revision diff 가 있습니다. 두 버전의 차이를 웹
상에서 비교해주는 것입니다.

http://cvs.kldp.net/cgi-bin/cvsweb.cgi/hserver/src/hserverstd.h.diff?r1=1.1&r2=1.2&cvsroot=hserver

이 URL이 cvs commit 할 때 자동으로 메일로 전송되면, 같은 프로젝트팀원들이
조금만 관심을 가져주게 되면, 소스의 변경을 계속 추적할 수 있게 됩니다. loginfo
를 다음과 같이 수정하고 cvsreport를 CVSROOT에 추가하는 것으로 가능하게 됩니다.

loginfo

DEFAULT         $CVSROOT/CVSROOT/cvsreport %{sVv}

cvsreport

#!/bin/sh
# viewcvs diff url reporter.
# Made by Hojin Choi
# Last modified: 2003. 8.

#--System configuration..
CVSURL="http://172.16.100.111/cgi-bin/viewcvs.cgi"

#--viewcvs--
CVSDIFFOPTION="diff_format=l"
CVSMARKUPCONTENTTYPE="text/vnd.viewcvs-markup"

#--cvsweb--
#CVSDIFFOPTION="f=H"
#CVSMARKUPCONTENTTYPE="text/x-cvsweb-markup"

#--Multi rooted environment
SUBROOT=

if [ -z "${SUBROOT}" ]; then
SUBROOTENC=""
else
SUBROOTENC="cvsroot=${SUBROOT}&"
fi

#--Mail sender (in HP, MAILER=mailx)
MAILER=mail

#--Temporary file format
TMPCVSREPORT="${CVSROOT}/tmpcvsreport.$$"

rm -f ${TMPCVSREPORT}

echo "Committed by ${USER}" >> ${TMPCVSREPORT}
echo "--------------------------------------------------------" >> ${TMPCVSREPORT}
#Append cvs orginal log
cat >> ${TMPCVSREPORT}
module=

report_file()
{
        file="$1"
        old="$2"
        new="$3"
        if [ "${old}" = "NONE" ]; then
                printf "N %-15s: %s\n" "${file}" "${CVSURL}/${module}/${file}?${SUBROOTENC}rev=${new}&content-type=${CVSMARKU
PCONTENTTYPE}" >> ${TMPCVSREPORT}
        elif [ "${new}" = "NONE" ]; then
                printf "D %-15s: %s\n" "${file}" "${CVSURL}/${module}/${file}?${SUBROOTENC}rev=${old}&content-type=${CVSMARKU
PCONTENTTYPE}" >> ${TMPCVSREPORT}
        else
                printf "M %-15s: %s\n" "${file}" "${CVSURL}/${module}/${file}.diff?${SUBROOTENC}r1=${old}&r2=${new}&${CVSDIFF
OPTION}" >> ${TMPCVSREPORT}
        fi
}

for filerev in $@
do
        if [ -z "${module}"  ];
        then
                module=${filerev}
                echo "Module    : ${filerev}" >> ${TMPCVSREPORT}
                if [ -z "${SUBROOTENC}" ]; then
                        echo "Module url: ${CVSURL}/${module}/" >> ${TMPCVSREPORT}
                else
                        echo "Module url: ${CVSURL}/${module}/?${SUBROOTENC}" >> ${TMPCVSREPORT}
                fi
                echo "" >>${TMPCVSREPORT}
                continue
        fi
        if [ "${filerev}" = "-" ];
        then
                break
        fi
        SAVEIFS="$IFS"
        IFS=,
        report_file ${filerev}
        IFS="${SAVEIFS}"
done

subject="CVS REPORT: '${module}' update"

case "${module}" in
CVSROOT*)
        receiver="userid(AT)domain.ccom"
        ;;
*)
        receiver="userid(AT)domain.ccom"
        ;;
esac

receiver="`echo ${receiver} | sed -e 's/(AT)/@/g'`"
${MAILER} -s "${subject}" ${receiver} < ${TMPCVSREPORT}
rm -f ${TMPCVSREPORT}

------------------------------------------------------------------------------------------------

이상으로 설정해 놓고, 윗부분에 해당하는 환경설정과 mail 수신할 수신자를
수정하시면, 원하는 report를 받을 수 있을 것입니다. 제가 사용하는 것을
kldp.net에 맞게 수정하느라 많이 고친 곳이 있는데, 지금은 거의 일반화 되어
아무데서나 사용할 수 있을 모양으로 되었습니다.
노파심에서 강조합니다만, Repository의 CVSROOT 에 직접들어 가서 파일 수정하지 마시고,
checkout 한 CVSROOT 를 수정하여 올리시길 바랍니다.

즐거운 CVS Life가 되시길 바랍니다.
코드 수정이나 의견은 항상 환영합니다.

------------------------------------------------------------------------------------------------
이런 일을 하는 공개 소스가 더러 있더군요. 많이 찾아 보질 않아서 얼마나 있는지는 잘 모르겠습니다만,
viewcvs 를 개발하는 곳의 CVS만 해도 log_accum.pl 이라는 것을 사용합니다.

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/viewcvs/CVSROOT/log_accum.pl?rev=1.2&content-type=text/vnd.viewcvs-markup

------
약간 스크립트를 수정하였습니다.

Forums: 
송지석의 이미지

저는 pserver를 이용하는데 변수를 USER로 하면 메일로 보내질 때 cvs로 보내집니다. cvs 사용자 id로 보내려면 CVS_USER로 하면 됩니다.

아래 패치는 행번호는 조금 틀릴 듯..

===================================================================
RCS file: /home/cvs/test/CVSROOT/cvsreport,v
retrieving revision 1.4
retrieving revision 1.5
diff -c -r1.4 -r1.5
*** CVSROOT/cvsreport	2004/01/16 02:49:16	1.4
--- CVSROOT/cvsreport	2004/01/16 04:22:59	1.5
***************
*** 32,38 ****
  
  rm -f ${TMPCVSREPORT} 
  
! echo "Committed by ${USER}" >> ${TMPCVSREPORT} 
  echo "--------------------------------------------------------" >> ${TMPCVSREPORT} 
  #Append cvs orginal log 
  cat >> ${TMPCVSREPORT} 
--- 32,38 ----
  
  rm -f ${TMPCVSREPORT} 
  
! echo "Committed by ${CVS_USER}" >> ${TMPCVSREPORT} 
  echo "--------------------------------------------------------" >> ${TMPCVSREPORT} 
  #Append cvs orginal log 
  cat >> ${TMPCVSREPORT} 

그리고 파일 이름에 빈칸이 들어가면 헤매는 것 같습니다. 어떻게 해결할 지 모르겠네요.

Quote:

Committed by cvs
--------------------------------------------------------
Update of /home/cvs/test/mytest1
In directory team1cvs:/tmp/cvs-serv29328

Added Files:
새 텍스트 문서.txt
Log Message:
ddd added
Module : mytest1
Module url: http://192.168.1.51/viewcvs/viewcvs.cgi/mytest1/?cvsroot=test&

M 새 : http://192.168.1.51/viewcvs/viewcvs.cgi/mytest1/새.diff?cvsroot=test&r1=&r2=&diff_format=l
M 텍스트 : http://192.168.1.51/viewcvs/viewcvs.cgi/mytest1/텍스트.diff?cvsroot=test&r1=&r2=&diff_format=l
N 문서.txt : http://192.168.1.51/viewcvs/viewcvs.cgi/mytest1/문서.txt?cvsroot=test&rev=1.1&content-type=text/vnd.viewcvs-markup


이렇게 나옵니다..
송지석의 이미지

빈칸문제 해결하긴 했습니다. 대신에 변수 이름등은 좀... 고쳐야 할 듯. indentation도 tab이랑 스페이스랑 뒤섞여서 좀 그렇네요.
혹시 써보실 분 있으시면(있으시려나..) 사용해보시고 문제점이 있으면 말씀해주세요.

===================================================================
RCS file: /home/cvs/test/CVSROOT/cvsreport,v
retrieving revision 1.8
retrieving revision 1.40
diff -c -r1.8 -r1.40
*** CVSROOT/cvsreport	2004/01/16 04:46:14	1.8
--- CVSROOT/cvsreport	2004/01/17 00:06:17	1.40
***************
*** 40,48 ****
  
  report_file() 
  { 
          file="$1" 
          old="$2" 
!         new="$3" 
          if [ "${old}" = "NONE" ]; then 
                  printf "N %-15s: %s\n" "${file}" "${CVSURL}/${module}/${file}?${SUBROOTENC}rev=${new}&content-type=${CVSMARKUPCONTENTTYPE}" >> ${TMPCVSREPORT} 
          elif [ "${new}" = "NONE" ]; then 
--- 40,58 ----
  
  report_file() 
  { 
+         echo "$@" >> /tmp/args
+ 		if [ "$#" = 1 ]; then
+ 		        MY_RESULT=failed;
+ 				return
+ 		fi
+ 		if [ "$#" = 2 ]; then
+ 		        MY_RESULT=failed;
+ 				return
+ 		fi
          file="$1" 
          old="$2" 
!         new="$3"
! 		MY_OLD_ARGS= 
          if [ "${old}" = "NONE" ]; then 
                  printf "N %-15s: %s\n" "${file}" "${CVSURL}/${module}/${file}?${SUBROOTENC}rev=${new}&content-type=${CVSMARKUPCONTENTTYPE}" >> ${TMPCVSREPORT} 
          elif [ "${new}" = "NONE" ]; then 
***************
*** 70,78 ****
          then 
                  break 
          fi 
!         SAVEIFS="$IFS" 
!         IFS=, 
!         report_file ${filerev} 
          IFS="${SAVEIFS}" 
  done 
  
--- 80,103 ----
          then 
                  break 
          fi 
! 		SAVEIFS="$IFS" 
!         IFS=,
! 
! 		if [ "${MY_RESULT}" = "failed" ]; then   
!                 MY_RESULT=success
!                 MY_ARG=${MY_OLD_ARG}' '${filerev}
!                 report_file ${MY_ARG}
! 		else
! 		        MY_RESULT=success 
!         		report_file ${filerev}
! 		fi
! 		if [ "${MY_RESULT}" = "failed" ]; then
! 		          if [ "${MY_OLD_ARG}" = "" ]; then
! 				      MY_OLD_ARG=${filerev}
! 			      else
!     		          MY_OLD_ARG=${MY_OLD_ARG}' '${filerev}
! 				  fi
! 		fi
          IFS="${SAVEIFS}" 
  done 
  

pynoos의 이미지

빈칸이 들어간 파일명을 다루는 문제는 알고 있었습니다만, UNIX 환경에서만 사용하다보니 빈칸없는 파일에 익숙해서 고칠 생각은 안했습니다... ^^

테스트 해보고 알려드리겠습니다. :D

송지석의 이미지

어. 지금 확인해보니 처음에 올리셨던 소스하고 지금의 소스하고 버전이 틀리군요. 많이 바뀌어서 패치까지 메일로 보내시게 되어있는 것 같군요. 제 패치가 예전 소스 보고 한 거라 --;; 어쩐다죠

pynoos의 이미지

저는 지금 다시 올릴 생각으로 제가 가지고 있는 최근 버전에 적용하고 있는 중입니다. 패치 내용을 보고 적절히 반영하겠습니다.

^^; 그런데 파일 이름에 ","가 들어가 있는것도 처리해야할 것 같더군요. 이번에 새롭게 적용하겠습니다.

요거 그냥 KLDP 프로젝트로하나 등록할까도 생각중입니다.

pynoos의 이미지

소스코드를 보니..

cvs-1.12.5/src/logmsg.c

title_proc, logfile_write 함수에서 loginfo 프로그램에 넘기는 방식이 영 맘에 들지 않습니다.

633 (void) strcat (str_list, " ");

일단 두개 이상의 파일을 동시에 commit하면 구분자로 " "가 hard-coding 되어 있습니다.

    649                 case 's':
    650                     str_list =
    651                         xrealloc (str_list,
    652                                   strlen (str_list) + strlen (p->key) + 5);
    653                     (void) strcat (str_list, p->key);
    654                     break;

여기에서는 file 명(p->key)을 단지 붙이기만합니다. file 명과 버전 앞뒤로 \" 라도 감싸면 좋겠습니다만...
일단 이 patch를 만들어 cvs 개발쪽에 보내야할 것 같은걸요.

이름에 공백이 들어가거나 ","가 들어가는 것에 대하여 따옴표로 구별하여 넘겨주지 않으니
shell 프로그램이 $* $@ 등의 인자취급방식의 이점을 전혀 사용할 수 없는 방식으로 되어 있습니다.

현상황:

"abc def.txt" (공백이 들어간 파일)
"x,y,z.txt" (쉼표가 들어간 파일)
"ab,de fg.txt" (쉼표와 공백이 들어간 파일)
"gh ij.txt" (공백이 두개연속으로 들어간 파일)

라는 네 개의 파일을 수정하여 commit 할 경우

DEFAULT $CVSROOT/CVSROOT/cvsreport %{sVv}

라는 loginfo 에 대하여
"cvsreport abc def.txt,1.1,1.2 x,y,z.txt,1.1,1.2 ab,de fg.txt,1.1,1.2 gh ij.txt,1.1,1.2"

라는 형태로 호출 string이 만들어지는 군요.

사실상 공백이 두개 연속으로 들어간 파일은 인자를 따옴표로 묶지 않는한 복원할 방법이 없습니다.

우아한 cvsreport를 만들기에 앞서 cvs 자체를 수정해야할 것 같네요.

현재 간단한 hack으로는

공백하나가 들어간 파일명 (쉼표없이)
쉼표가 들어간 파일명 (공백없이)

만 제대로 처리가 가능할 것 같습니다.

pynoos의 이미지

cvsreport 파일을 두 부분으로 나누었습니다.
configuration을 cvsreport.conf 로 나눕니다.

cvsreport

#!/bin/sh
# viewcvs diff url reporter.
# Made by Hojin Choi
# Last modified: 2004. 1.

if [ -f "$0.conf" ]; then
        . "$0.conf"
else
        echo "No configuration file. ($0.conf)"
        exit 1
fi

if [ -z "${SUBROOT}" ]; then
SUBROOTENC=""
else
SUBROOTENC="cvsroot=${SUBROOT}&"
fi

COMMITTER=${CVS_USER}
if [ -z "${COMMITTER}" ]; then
        COMMITTER=${USER}
fi

rm -f ${TMPCVSREPORT} ${TMPATTACH}

echo "Committed by ${COMMITTER}" >> ${TMPCVSREPORT}
echo "-------------------------------------------------------------------------" >> ${TMPCVSREPORT}
#Append cvs orginal log
while [ 1 ]; 
do 
        read line || break; 
        case $line in 
        "Log Message:") 
                break
                ;;
        esac
done
cat >> ${TMPCVSREPORT}
echo "-------------------------------------------------------------------------" >> ${TMPCVSREPORT}
module=

escape_url()
{
        echo "$@" | sed "s/ /%20/g" | sed "s/,/%2C/g"
}

report_file()
{
        file= old= new=
        for arg in $@
        do
                if [ -z "$file" ]; then file=$arg; continue; fi
                if [ -z "$old" ]; then old=$arg; continue; fi
                if [ -z "$new" ]; then 
                        new=$arg
                        continue
                else
                        file="$file,$old"
                        old=$new
                        new=$arg
                fi
        done
        urlfile=`escape_url "$file"`

        if [ "${old}" = "NONE" ]; then
                printf "N %-15s: %s\n" "${file}" "${CVSURL}/${module}/${urlfile}?${SUBROOTENC}rev=${new}&content-type=${CVSMARKUPCONTENTTYPE}" >> ${TMPCVSREPORT}
        elif [ "${new}" = "NONE" ]; then
                printf "D %-15s: %s\n" "${file}" "${CVSURL}/${module}/${urlfile}?${SUBROOTENC}rev=${old}&content-type=${CVSMARKUPCONTENTTYPE}" >> ${TMPCVSREPORT}
        else
                printf "M %-15s: %s\n" "${file}" "${CVSURL}/${module}/${urlfile}.diff?${SUBROOTENC}r1=${old}&r2=${new}&${CVSDIFFOPTION}" >> ${TMPCVSREPORT}
        fi

        if [ "${new}" != "NONE" ]; then
                case "${file}" in
                NEWS)
                        echo "${file} (ver. ${new})" >> ${TMPATTACH}
                        echo "-------------------------------------------------------------------------" >> ${TMPATTACH}
                        cvs -d ${CVSROOT} checkout -p ${module}/${file} >>${TMPATTACH} 2>/dev/null
                        ;;
                esac
        fi
}

report_filerev=
for filerev in $*
do
        if [ -z "$module" ]; then
                module=$filerev
                echo "Module           : ${module}" >> ${TMPCVSREPORT}
                if [ -z "${SUBROOTENC}" ]; then
                        echo "Module url       : ${CVSURL}/${module}/" >> ${TMPCVSREPORT}
                else
                        echo "Module url       : ${CVSURL}/${module}/?${SUBROOTENC}" >> ${TMPCVSREPORT}
                fi
                echo "" >> ${TMPCVSREPORT}
                continue
        fi

        if [ "${filerev}" = "-" ]; then break; fi

        report_filerev="$report_filerev$filerev"

        words=`echo "$report_filerev" | tr -cd , | wc -c` 
        if [ $words -gt 1 ]; then
                SAVEIFS="$IFS"
                IFS=,
                report_file ${report_filerev}
                IFS="${SAVEIFS}"
                report_filerev=
        else
                report_filerev="$report_filerev "
        fi
done

prepare_email "$module"

from="`echo ${from} | sed -e 's/(AT)/@/g'`"
receiver="`echo ${receiver} | sed -e 's/(AT)/@/g'`"

( cat <<EOT
Subject: ${subject}
From: ${from}
To: ${receiver}

EOT
cat ${TMPCVSREPORT}
test -f ${TMPATTACH} && (
        echo "" && echo "Automatic notice :"
        cat ${TMPATTACH}
)
echo "-------------------------------------------------------------------------"
echo "End."
) | ${SENDMAIL} -t

rm -f ${TMPCVSREPORT} ${TMPATTACH} 2>/dev/null

#$Id: cvsreport,v 1.16 2004/01/17 18:19:11 pynoos Exp $

다음은 hserver proj.에서 사용하는 configuration sample 입니다.

cvsreport.conf

#--System configuration..
CVSURL="http://cvs.kldp.net/cgi-bin/cvsweb.cgi"

#--viewcvs--
#CVSDIFFOPTION="diff_format=l"
#CVSMARKUPCONTENTTYPE="text/vnd.viewcvs-markup"

#--cvsweb--
CVSDIFFOPTION="f=H"
CVSMARKUPCONTENTTYPE="text/x-cvsweb-markup"

#--Multi rooted environment
SUBROOT=hserver

SENDMAIL="/usr/sbin/sendmail"
TMPCVSREPORT="${CVSROOT}/$$.tmpcvsreport"
TMPATTACH="${CVSROOT}/$$.tmpattach"

prepare_email()
{
#INPUT : module
#OUTPUT: subject, from, receiver

        module="$1"

        case "${module}" in
        CVSROOT*)
                receiver="cvsreport"
                ;;
        hserver|hserver/*)
                receiver="hserver-cvsreport(AT)lists.kldp.net"
                ;;
        *)
                receiver="pynoos(AT)users.kldp.net"
                ;;
        esac

        subject="CVS REPORT: '${module}' update"
        from="${COMMITTER}(AT)users.kldp.net"
}

#$Id: cvsreport.conf,v 1.1 2004/01/17 18:18:32 pynoos Exp $

위 코드는

공백하나가 들어간 파일명 (쉼표없이) 
쉼표가 들어간 파일명 (공백없이) 

처리된 파일입니다.

송지석의 이미지

그렇군요. 감사. 많이 수고하셨습니다. 다른분들도 고맙게 잘 쓰실 것 같습니다.
저는 사실 빈칸까지는 가끔 쓰겠지만 ,까지는 설마 안하겠지 하고 생각해서 별로 생각을 하지 않았습니다..
kldp.net에서 사용하는 펄 스크립트는 그 문제가 해결된 것일까요? 나중에 확인해봐야겠네요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.