SVN预提交挂钩最大大小文件



我有一个预提交挂钩的问题。脚本的前半部分有效,但检查最大大小的后半部分无效。有人知道问题出在哪里吗?

#!/bin/bash
REPOS=$1
TXN=$2
MAX_SIZE=10
AWK=/bin/awk
SVNLOOK="/usr/bin/svnlook";
#Put all banned extensions formats in variable FILTER
FILTER=".(iso|exe)$"
# Figure out what directories have changed using svnlook.
FILES=`${SVNLOOK} changed ${REPOS} -t ${TXN} | ${AWK} '{ print $2 }'` > /dev/null
for FILE in $FILES; do
#Get the base Filename to extract its extension
NAME=`basename "$FILE"`
#Get the extension of the current file
EXTENSION=`echo "$NAME" | cut -d'.' -f2-`
#Checks if it contains the restricted format
if [[ "$FILTER" == *"$EXTENSION"* ]]; then
echo "Your commit has been blocked because you are trying to commit a restricted file." 1>&2
echo "Please contact SVN Admin. -- Thank you" 1>&2
exit 1
fi
#check file size
filesize=$($SVNLOOK cat -t $TXN $REPOS $f|wc -c)
if [ "$filesize" -gt "$MAX_SIZE" ]; then 
echo "File $f is too large(must <=$MAX_SIZE)" 1>&2
exit 1
fi
done
exit 0

好的,我做了一个小脚本,只检查的文件大小

#!/bin/bash
REPOS=$1
TXN=$2
MAX_SIZE=10
AWK=/bin/awk
SVNLOOK="/usr/bin/svnlook";

#check file size
filesize=`${SVNLOOK} changed ${REPOS} -t ${TXN} | wc -c`
if [ "$filesize" -gt "$MAX_SIZE" ]; then 
echo "File $filesize  is too large" 1>&2
exit 1
fi
echo "File $filesize" 1>&2
exit 0

当我尝试共同提交文件有25,5MB,在输出中只看到20

File 20 is too large

为什么只有20?我认为输出必须像26826864字节一样

好的,这个脚本的最后一个警告是

#!/bin/bash
REPOS=$1
TXN=$2
MAX_SIZE=10
svnlook="/usr/bin/svnlook";
size=$($svnlook filesize -t $TXN $REPOS $file)
if [[ "$size" -gt "$MAX_SIZE" ]] ; then 
echo "File is too large" 1>&2
exit 1
fi
exit 0

但它仍然没有起作用。有人能写出正确的变体吗?

在这种情况下,正如我正确理解的那样,scrypt必须如下所示。但它仍然不起作用,也许有人知道问题出在哪里?然后我可以添加任何大小的文件。

#!/bin/bash
REPOS=$1
TXN=$2
maxsize=-1
svnlook="/usr/bin/svnlook";
svnlook -t $TXN changed | while read status file
do
[[ $status == "D" ]] && continue  # Skip Deletions
[[ $file == */ ]] && continue     # Skip directories
size=$(svnlook filesize -t $TXN $REPOS $file)
if [ $size -gt $maxsize ]]
then
echo "File '$file' too large to commit" >&2
exit 2
fi
done
exit 0

您在代码之外至少犯了2个错误:

  • 在使用in hook之前,没有手动验证|wc -c的输出(我无法从内存中回忆起格式(
  • RTFM没有仔细:$SVNLOOK cat的管道是不必要的过度复杂,而您有子命令文件大小

添加

在我的评论主题中引用的代码(仔细阅读,不要错过获取事务中每个文件的周期(

svnlook -t $TXN changed | while read status file
do
[[ $status == "D" ]] && continue  # Skip Deletions
[[ $file == */ ]] && continue     # Skip directories
size=$(svnlook filesize -t $TXN $REPOS $file)
if [ $size -gt $maxsize ]]
then
echo "File '$file' too large to commit" >&2
exit 2
fi
done
exit 0

这个wariant为我工作:(

#!/bin/bash
REPOS=$1
TXN=$2
MAX_SIZE=20971520
svnlook=/usr/bin/svnlook
AWK=/bin/awk
FILES=`${svnlook} changed -t ${TXN} ${REPOS} | ${AWK} '{print $2}'`
for FILE in $FILES; do
size=`${svnlook} filesize -t ${TXN} ${REPOS} ${FILES}`
if [[ "$size" -gt "$MAX_SIZE" ]] ; then 
echo "Your commit has been blocked because you are trying to commit a too large file." 1>&2
exit 1
fi
done
exit 0

最新更新