Тим:
Вы могли бы попробовать этот скрипт ловушки Python. Он (свободно) основан на приведенном выше, но допускает шаблоны регулярных выражений для путей отклонения и позволяет переопределить проверку, имея строку, которая начинается
Overide:
в сообщении журнала. В нем используется новый синтаксис печати python, поэтому требуется довольно свежая версия python (2.6 +?).
from __future__ import print_function
import sys,os
import subprocess
import re
#this is a list of illegal patterns:
illegal_patterns = [
'\.exe$',
'\.dll$',
'[\^|/]bin/',
'[\^|/]obj/',
]
# Path to svnlook command:
cmdSVNLOOK=r"{}bin\svnlook.exe".format(os.environ["VISUALSVN_SERVER"])
print(illegal_patterns, file=sys.stderr)
print("cmdSVNLook={}".format(cmdSVNLOOK), file=sys.stderr)
def runSVNLook(subCmd, transact, repoPath):
svninfo = subprocess.Popen([cmdSVNLOOK, subCmd, '-t', transact, repoPath],
stdout = subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = svninfo.communicate()
if len(stderr) > 0:
print("svnlook generated stderr: " + stderr, file=sys.stderr)
sys.exit(1)
return [ line.strip() for line in stdout.split("\n") ]
def findIllegalPattern(fileName):
for pattern in illegal_patterns:
if re.search(pattern, fileName):
print("pattern: {} matched filename:{}".format(pattern, fileName))
return pattern
return None
def containsOverRide(logOutput):
retVal = False
for line in logOutput:
print("log line: {}".format(line), file=sys.stderr)
if re.match("^override:", line.lower()):
retVal = True
break
print("contiansOverRide={}".format(retVal), file=sys.stderr)
return retVal
def findIllegalNames(changeOutput):
illegalNames = []
prog = re.compile('(^[ACUDRM_])[ACUDRM]*\s+(.+)') # regex for svnlook output
for line in changeOutput:
print("processing:{}".format(line), file=sys.stderr)
if (line != ""):
match=re.search(prog, line.strip())
if match:
mode = match.group(1)
ptFilename = match.group(2)
if mode == 'A':
pattern = findIllegalPattern(ptFilename)
if pattern:
illegalNames.append((pattern, ptFilename))
else:
print("svnlook output parsing failed!", file=sys.stderr)
sys.exit(1)
return illegalNames
######### main program ################
def main(args):
repopath = args[1]
transact = args[2]
retVal = 0
overRidden = containsOverRide(runSVNLook("log", transact, repopath))
illegalFiles = findIllegalNames(runSVNLook("changed", transact, repopath))
if len(illegalFiles):
msg = "****************************************************************************\n"
if len(illegalFiles) == 1:
msg += "* This commit contains a file which matches a forbidden pattern *\n"
else:
msg += "* This commit contains files which match a forbidden pattern *\n"
if overRidden:
msg += "* and contains an Override line so the checkin will be allowed *\n"
else:
retVal = 1
msg += "* and is being rejected. *\n"
msg += "* *\n"
msg += "* Files which match these patterns are genreraly created by the *\n"
msg += "* built process and should not be added to svn. *\n"
msg += "* *\n"
msg += "* If you intended to add this file to the svn repository, you neeed to *\n"
msg += "* modify your commit message to include a line that looks like: *\n"
msg += "* *\n"
msg += "* OverRide: <reason for override> *\n"
msg += "* *\n"
msg += "****************************************************************************\n"
print(msg, file=sys.stderr)
if len(illegalFiles) == 1:
print("The file and the pattern it matched are:", file=sys.stderr)
else:
print("The files and the patterns they matched are:", file=sys.stderr)
for (pattern, fileName) in illegalFiles:
print('\t{}\t{}'.format(fileName, str(pattern)), file=sys.stderr)
return retVal
if __name__ == "__main__":
ret = main(sys.argv)
sys.exit(ret)