svn - 如何防止用户将二进制文件提交到颠覆?

标签 svn permissions visualsvn

我有一个任性的用户,他顽固地坚持将他的二进制文件(可执行文件、DLL)提交到我们的 subversion 存储库中。我会进去删除它们,但当然没有什么东西真的从颠覆中删除了。

虽然有时我们需要提交二进制文件,但我不希望用户将其作为例行公事。我可以设置一个忽略属性,但这不会阻止用户提交二进制文件,如果他们真的确定的话。我想做的是能够逐个目录地控制提交指定文件类型的能力,特别是 .exe 和 .dll 文件。

有没有办法在 SVN 中做到这一点?如果有什么不同,我们使用的是 VisualSVN 服务器和 TortoiseSVN。

最佳答案

蒂姆:

你可以试试这个 python 钩子(Hook)脚本。它(松散地)基于上面的那个,但允许拒绝路径的正则表达式模式,并允许通过有一个开始的行来覆盖检查

覆盖:

在日志消息中。它使用新的 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)

关于svn - 如何防止用户将二进制文件提交到颠覆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165720/

相关文章:

svn - 支持 SVN 的 UBUNTU 上的 PHP/JS/HTML/CSS IDE

Django检查用户组权限

svn - Visual SVN - 获取所有存储库的总大小

svn - 如何在 Vista 上的 VisualSVN Server 上迁移所有源代码并迁移到 Windows 7?

svn - WAN 上的 tfs 与 svn 性能

git - 多个 Gitlab 项目可以使用同一个 Git 存储库吗?

SVN 修改 svn :mergeinfo property on files with no change

javascript - 网络共享 API : Permission Denied on certain file type

c# - ASP.NET 如何从 PostgreSQL 数据库中检查用户角色?

visual-studio-2010 - 每次在 VS 2010 上发布之前如何提交 SVN