java - svn PRE-COMMIT Hook 扫描java类内容

标签 java bash unix svn svn-hooks

我第一次做这样的钩子(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/

相关文章:

java - Java中枚举的每个值的键值映射

bash - 暴力破解 16 个字符的 key 需要多长时间

bash - 在 Bash 脚本中给定数组变量名称的数组,循环遍历数组元素

linux - 如何根据用户输入更新 case 语句中的变量

c++ - fseeko, fseeko64; ftello、ftello64 Visual C 等效项

java - 可以从 null 转换为 int 吗?

java - Java 中的 SonarQube Web API 身份验证

linux - 什么是/dev/windrvr6

Java Spring 急切获取 Hibernate 子类失败

Bash命令更改bash窗口的大小