使用Perforce触发器拒绝带Windows行结束符的文件

2 投票
1 回答
508 浏览
提问于 2025-04-16 00:15

我在使用Perforce这个工具,想要拒绝那些包含Windows换行符的文件提交(换行符是\r\n,可能也只是\r,因为我们其实只想要Unix格式的换行符)。

与其使用dos2unix这样的工具来转换文件格式,或者其他类似的方法,我希望能添加一个触发器,来拒绝那些包含非Unix换行符的文本提交,这样可以更好地追踪用户提交Windows格式文件的情况。

有没有人能演示一下这个触发器该怎么写,可能用bash或者python?

谢谢!

1 个回答

4

这是我能想到的关于bash示例的最简单修改,来自于p4文档

#!/bin/sh
# Set target string, files to search, location of p4 executable...
TARGET='\r\n'
DEPOT_PATH="//depot/src/..."
CHANGE=$1
P4CMD="/usr/local/bin/p4 -p 1666 -c copychecker"
XIT=0
echo ""
# For each file, strip off #version and other non-filename info
# Use sed to swap spaces w/"%" to obtain single arguments for "for"
for FILE in `$P4CMD files $DEPOT_PATH@=$CHANGE | \
  sed -e 's/\(.*\)\#[0-9]* - .*$/\1/' -e 's/ /%/g'`
do
  # Undo the replacement to obtain filename...
  FILE="`echo $FILE | sed -e 's/%/ /g'`"
# ...and use @= specifier to access file contents:
  # p4 print -q //depot/src/file.c@=12345
  if $P4CMD print -q "$FILE@=$CHANGE" | fgrep "$TARGET" > /dev/null
  then 
      echo "Submit fails: '$TARGET' not found in $FILE"
      XIT=1
  else
      echo ""

  fi
done
exit $XIT

原来的例子在目标缺失时会出错,而这个修改后的例子在目标存在时会出错——这只是把if语句中的thenelse部分调换了一下。当然,你还可以进一步修改它(比如给grep或者fgrep加上-q这个选项来抑制输出,如果你的grep支持这个选项,比如GNU的版本就支持)。

撰写回答