Svn PRE-COMMIT Hook 扫描 java 类内容

ivo*_*Boy 5 java unix svn bash svn-hooks

我第一次做这样的钩子..

我需要一个预提交钩子来扫描所有要提交的 Java 类,它应该检查类中是否存在某些字符,如果发现其中的一些字符,例如 † 或 ¥ 等字符,则应避免提交,我认为进行这种动态更改的好方法可以将所有这些无效字符放入计划文件中,以便在我们需要时轻松更改它...

我从很久以前写的一个简单的钩子开始..

现在最大的问题是获取工作副本文件的位置。我应该扫描内容。

我尝试了很多 svnlook 命令,但我真的无法将这些信息捕获到预提交钩子中......

获取大量信息,但没有获取文件的本地路径。我正在使用它来扫描内容...

 OUTPUT="$($SVNLOOK changed -t $TXN $REPOS)"
 echo $SVNLOOK changed -t $TXN $REPOS 1>&2
 echo "$BASEDIR" 1>&2
 echo "${OUTPUT}" 1>&2
 echo "$TXN $REPOS" 1>&2  
Run Code Online (Sandbox Code Playgroud)

也许是我的方法不对?

非常感谢!

更新

感谢“CaffeineAddiction”,当你第一次做某事时,你知道这总是一个“大问题”。

实际上,最终真正的问题是,经过一天的尝试后,另一个与客户端字符编码相关的SVN Bug:

 Error output could not be translated from the native locale to UTF-8
Run Code Online (Sandbox Code Playgroud)

现在最后一个问题也解决了,脚本也能正常工作,你可以在下面看到它,它只需要美化,顺便感谢你,我会从你那里得到一些想法:

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

 SVNLOOK=/usr/bin/svnlook

 OUTPUT="$($SVNLOOK changed -t $TXN $REPOS | awk '{print $2}')"

 for LINE in $OUTPUT
 do
   FILE=`echo $LINE`
   MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}"`
   echo "File is: $FILE" 1>&2
   echo "${MESSAGE}" > /tmp/app.txt
   grep -P -n '[\x80-\xFF]' /tmp/app.txt | cut -f1 -d: 1>&2
 done
Run Code Online (Sandbox Code Playgroud)

Caf*_*ion 2

这不是完整的答案,但可能足以让您朝着正确的方向前进。不久前,我被要求先对 javascript 文件运行 gjslint,然后再允许它们签入 SVN。这是我用于该任务的预挂钩:

#!/bin/sh

SVNLOOK=/usr/bin/svnlook
GJSLINT=/usr/local/bin/gjslint

ECHO=$(which echo)
GREP=$(which grep)
SED=$(which sed)

## Used for Debug
#MYRUNLOG=/run/svn-pre-commit/pre-commit.log
#touch $MYRUNLOG
#echo "" > $MYRUNLOG

MYTEMPJS=/run/svn-pre-commit/temp.js
touch $MYTEMPJS
echo "" > $MYTEMPJS

MYTEMPLOG=/run/svn-pre-commit/gjslint.log
touch $MYTEMPLOG
echo "" > $MYTEMPLOG

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

FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"`
LINTERROR=0

for FILE in $FILES_CHANGED
do
    if $ECHO $FILE | $GREP "\.js$"
    then
        if ! $ECHO "$REPOS/$FILE" | $GREP "/paweb5/\|/pamc/"; then exit 0; fi
        if $ECHO "$REPOS/$FILE" | $GREP "/doc/"; then exit 0; fi
        if $ECHO "$REPOS/$FILE" | $GREP "/docs/"; then exit 0; fi
        $SVNLOOK cat -t$TXN $REPOS $FILE > $MYTEMPJS
        $ECHO "$REPO/$FILE" >> $MYTEMPLOG
        $GJSLINT --strict --disable 0001 $MYTEMPJS >> $MYTEMPLOG
        GJSL_ERROR_CODE=$?
        if [ $GJSL_ERROR_CODE != 0 ]
        then
            LINTERROR=1
        fi
        $ECHO "~~~" >> $MYTEMPLOG
    fi
done

if [ $LINTERROR != 0 ]
then
  echo "..........................................................................." >&2
  while read line; do
    if $ECHO $line | $GREP "Line\|no errors\|new errors\|paweb5\|~~~"
    then
      echo $line >&2
    fi
  done < $MYTEMPLOG
  echo "..........................................................................." >&2
  exit 1
fi

# If we got here, nothing is wrong.
exit 0
Run Code Online (Sandbox Code Playgroud)

我相信您获取工作副本文件位置的“大问题”的答案可能在于$SVNLOOK cat -t$TXN $REPOS $FILE > $MYTEMPJS

如果您对脚本有疑问,请随时询问