我正在尝试用python编写一个svn预提交钩子。其中一部分涉及检查diff文件,看看是否有任何实际的文件更改(而不仅仅是属性更改)。
我有一个正在工作的grep命令,我可以在shell 上很好地执行它
grep "^(Added: |Modified: |Deleted: )" diff filename | grep -v 'svn:'
然而,当我把它通过子流程时。POpen它转义了我所有的反斜杠,这会破坏正则表达式。
Executing command: ['grep', '"^\Added: \|Modified: \|Deleted: \)", ...]
我该如何避免这种情况?
注意:我知道我可以在子流程之间传输结果,并且我可以用这种方式完成两个grep。不过,我需要帮助让第一个先工作:/
NB2:我也尝试过使用filterdiff——clean,但无法使其工作。搜索添加的、修改的或删除的行,删除那些带有"svn:"的行,并检查我是否有一些结果,似乎是可行的。
Python代码:
command = ['grep', '"^(Added: |Modified: |Deleted: )"', filename]
sys.stdout.write('Executing command: %sn' % (command))
p = subprocess.Popen(command,
stdin = subprocess.PIPE
stdout = subprocess.PIPE
stderr = subprocess.STDOUT
shell = True)
data = p.stdout.read()
if len(data) == 0:
sys.stdout.write("Diff does not contain any file modifications./n")
exit(0)
您需要考虑您希望grep
在其命令行参数中看到什么。
第一个参数需要是文字字符串"^(Added: |Modified: |Deleted: )"
,这意味着它不应该包含双引号,但应该包含反斜杠。
表达这种字符串的方法是使用Python原始字符串:
command = ['grep', r'^(Added: |Modified: |Deleted: )', filename]
检查实际运行的内容的一个好方法是用echo
替换grep
,这样您至少可以看到传递给命令的内容。