SVN预提交钩子扫描Java类内容

5

这是我第一次写这样的挂钩...

我需要一个预提交挂钩来扫描所有要提交的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  

也许是我的方法不对了吗?
非常感谢!
更新
感谢"CaffeineAddiction",第一次做某件事情总是一个“大问题”。
实际上,在一天的尝试之后,真正的问题是另一个问题,即与客户端字符编码相关的SVN错误。
 Error output could not be translated from the native locale to UTF-8

现在这个最后的问题也得到了解决,脚本也能正常工作,您可以在下面看到它,只需要美化一下即可,顺便感谢您的帮助,我会从中汲取一些灵感:
 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

1
重复的问题,https://dev59.com/jkrSa4cB1Zd3GeqPUC20。 - vzamanillo
1个回答

2

这不是一个完整的答案,但它可能足以让你朝着正确的方向前进。一段时间以前,我被要求在允许将JavaScript文件检入SVN之前运行gjslint。以下是我用于此任务的预钩子:

#!/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

我相信你“重大问题”中获取工作副本文件位置的答案可能在$SVNLOOK cat -t$TXN $REPOS $FILE > $MYTEMPJS中。如果对脚本有疑问,请随时提问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接