Tim*_*ong 13 svn permissions visualsvn
我有一个顽固的用户,他固执地坚持将他的二进制文件(可执行文件,DLL)提交到我们的subversion存储库中.我会进去删除它们,但当然没有任何东西可以从subversion中删除.
虽然有时我们需要提交二进制文件,但我不希望用户这样做是例行公事.我可以设置一个ignore属性,但如果真的确定它们,则不会阻止用户提交二进制文件.我想做的是能够在逐个目录的基础上控制提交指定文件类型的能力,特别是.exe和.dll文件.
在SVN中有没有办法做到这一点?如果它有任何不同,我们使用VisualSVN服务器和TortoiseSVN.
这是一个小钩子脚本,它正在做你想要的:你必须配置两件事:
import sys
import subprocess
import re
#this is a list of illegal suffixes:
illegal_suffixes = ['.exe','.dll']
# Path to svnlook command:
cmdSVNLOOK="/usr/bin/svnlook";
def isIllegalSuffix(progname):
for suffix in illegal_suffixes:
if (ptFilename.endswith(suffix)):
return True
return False
######### main program ################
repopath = sys.argv[1]
transact = sys.argv[2]
retVal = 0
svninfo = subprocess.Popen([cmdSVNLOOK, 'changed', '-t', transact, repopath],
stdout = subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = svninfo.communicate();
prog = re.compile('(^[ACUDRM_])[ACUDRM]*\s+(.+)') # regex for svnlook output
for line in stdout.split("\n"):
if (line.strip()!=""):
match=re.search(prog, line.strip())
if match:
mode = match.group(1)
ptFilename = match.group(2)
if mode == 'A' and isIllegalSuffix(ptFilename):
retVal = 1
sys.stderr.write("Please do not add the following ")
sys.stderr.write("filetypes to repository:\n")
sys.stderr.write(str(illegal_suffixes)+"\n")
break
else:
sys.stderr.write("svnlook output parsing failed!\n")
retVal = 1
break
else:
# an empty line is fine!
retVal = 0
sys.exit(retVal)
Run Code Online (Sandbox Code Playgroud)
小智 5
蒂姆:
你可以尝试这个python钩子脚本.它(松散地)基于上面的那个,但允许拒绝路径的正则表达式模式,并允许通过开始一行来覆盖检查
此改变:
在日志消息中.它使用新的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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5377 次 |
| 最近记录: |