2011-12-21 2 views
0

사전 커밋하면 그것을 실행하는 데 실패없이 comments.but와 CPP 파일을 커밋 제한해야 내 후크 스크립트 ...SVN 스크립트 실행 여기

 #!/bin/bash 

     REPOS="$1" 
     TXN="$2" 

     SVNLOOK="/usr/bin/svnlook" 
     AWK="/usr/bin/awk" 
     GREP="/bin/egrep" 
     SED="/bin/sed" 

     CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print     
     $2}' | $GREP \\.cpp$` 

     for FILE in $CHANGED 
     do 
     MESSAGE=`$SVNLOOK log -t "$TXN" "$REPOS" "$FILE" | sed 's/ *//g' |$GREP ".\    
     {16,\}"` 
     if [ $? -ne 0 ] 
     then 
     echo 1>&2 
     echo "***********************************" 1>&2 
     echo `echo "$MESSAGE"` 1>&2 
     echo "***********************************" 1>&2 
     exit 1 
     fi 
     done 
+0

사전 커밋 후크처럼 보입니다 (질문에 언급되지 않음). 그것은 서버 사이드 훅 스크립트인가요? 왜 'tortoisesvn'이라는 레이블을 추가 했습니까? 적어도 호출 자체를 기록하려고 했으므로 스크립트가 전혀 호출되지 않았는지 확인할 수 있습니다. – mliebelt

+0

나중에 그것은 서버 쪽 hook.that 클라이언트 쪽에서 결과를 생산해야합니다 – shaggy

답변

0

스크립트를 미리 커밋해야합니다 어떤 아이디어입니다 실행 권한이 있습니다 (chmod +x pre-commit)

또한 실제로 스크립트가 실행되고 있는지 확인하지 못합니다. 에코 메시지는 오류가 있고 0이 아닌 오류 코드로 종료 할 때만 클라이언트에 표시됩니다. 모든

0

첫째 : STDERR에

  • 메시지 만 인쇄 미리 커밋 스크립트의 종료는 제로 이외의 경우에만 있습니다. 그렇지 않으면 인쇄가 전혀 없습니다.
  • 커밋 메시지는 커밋 전체에 대한 메시지입니다. 즉, 모든 단일 파일의 커밋 메시지를 확인하지 마십시오. 그들 모두에게 똑같습니다.
  • 리비전 등록 정보 svn:log을보고 커밋 메시지를 찾을 수 있습니다. 당신은 메시지를 볼 필요가 없습니다.

이 완전히 검증되지 않은 재 시도 :

당신이 있었다 :

CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print $2}' | $GREP \\.cpp$` 

당신은을 통해하는 그렙을 통해 밀어를 여기

#!/bin/bash 

REPOS="$1" 
TXN="$2" 

SVNLOOK="/usr/bin/svnlook" 
AWK="/usr/bin/awk" 
GREP="/bin/egrep" 
SED="/bin/sed" 

if "$SVNLOOK" changed -t $TXN | grep -q "^ *[UAM].*\.cpp$" 
then 
    MESSAGE=$("$SVNLOOK" pget -t $TXN --revprop "$REPOS" svn:log) 
    if [ -z ${MESSAGE:16} ] 
    then 
     echo "Committing a *.cpp file, but didn't put a comment!" >&2 
     exit 1  #CPP, but message too short 
    else 
    exit 0 #CPP Files but message is long enough 
fi 
exit 0  #No CPP files 

을 변경 중 일부입니다 awk 그리고 다른 grep을 통해. 대신, 한 번에 전체 라인을 보지 않으시겠습니까? [UAM] 수단

"$SVNLOOK" changed -t $TXN "$REPOS" | $GREP -q "^ *[UAM].*\.cpp$" 
  • 중 하나 또는 UM 또는 A. 각각 사이에 |이 필요하지 않습니다.
  • $GREP -q은 grep을 조용히합니다. 무언가를 찾으면 0을 반환하고 그렇지 않으면 1을 반환합니다. [...] 테스트 중괄호없이 if 문에 직접 입력 할 수 있습니다.
  • .*\.cpp$은 나머지 줄을보고 그것이 끝나는 지보고있는 것을 의미합니다 .\.cppgrep|awk|grep 파이프가 필요 없습니다.
  • 로그 메시지가 하나뿐이므로 한 번 확인하면됩니다. 루프가 필요 없습니다.
  • 알림 다시 진드기 대신 $(...)을 사용합니다. 똑같은 일을하지만보기가 더 쉽습니다.
  • 나는 ${MESSAGE:16}을 사용합니다. BASH에서 이것은 내 메시지의 16 문자 오프셋을 수행합니다. 내 메시지가 16 자보다 짧으면 ${MESSAGE:16}이 비어 있습니다. 그런 다음 -z을 사용하여 오프셋 문자열이 비 었는지 여부를 확인할 수 있습니다. 파이프를 sed에 저장하고 grep을 저장합니다.

이 기능이 약간 개선되었는지 확인하십시오. 실제로 이것을 훅 외부의 일반 셸 스크립트로 실행하십시오. -t-r으로 변경하고 다양한 개정 번호를 입력 할 수 있습니다.이렇게하면 스크립트를 후크로 시도하기 전에 먼저 스크립트를 확인할 수 있습니다. 그런 다음 pre-commit이라고하고 사용 권한을 rwxr-xr-x으로 설정했는지 확인하십시오.

심지어 더 나은, 내 pre-commit hook보십시오. 전투 테스트를 거쳐 더 많은 일을 할 수 있습니다. Perl 스크립트이지만 5.8 이상의 Perl 버전에서 실행해야하며 시스템에 Perl이 이미 설치되어있을 것입니다. svn : log의 길이를 확인할 수는 있지만, 내 후크 스크립트는 커밋 된 내용을 기반으로 지정할 수 없습니다. 그러나 어쨌든 *.cpp 파일이 커밋되었는지 여부와 상관없이 어떤 빈 커밋 메시지도 허용해야하는 이유는 무엇입니까?