我第一次做这样的钩子(Hook)..
我需要一个预提交钩子(Hook)来扫描所有要提交的 java 类,它应该检查类中是否存在某些字符,如果发现其中一些字符,则避免提交,如 † 或 ¥ 等字符,我认为进行此动态更改的一个好方法是将所有这些无效字符放入计划文件中,以便在我们需要时轻松更改它...
我从很久以前写的一个简单的钩子(Hook)开始..
现在最大的问题是获取工作副本文件的位置.. 我应该扫描内容的那个。
我尝试了很多 svnlook 命令,但我真的无法将这些信息捕获到预提交 Hook 中....
获取了很多信息,但没有获取文件的本地路径。我正在使用它来扫描内容...
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 Bug:
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
最佳答案
这不是一个完整的答案,但可能足以让您朝着正确的方向前进。不久前,我被要求在允许将它们 checkin SVN 之前对 javascript 文件运行 gjslint。这是我用于该任务的预 Hook :
#!/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
如果您对脚本有任何疑问,请随时提问
关于java - svn PRE-COMMIT Hook 扫描java类内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280732/