在预提交钩子中 - 如何访问/比较当前和以前版本的文件

Eth*_*nML 2 python svn pre-commit-hook

我正在尝试添加到我们现有的预提交 SVN 挂钩,以便它检查并阻止特定目录中文件的文件大小增加。

我编写了一个 python 脚本来比较两个文件大小,它以两个文件作为参数并使用 sys.exit(0) 或 (1) 返回结果,这部分似乎工作正常。

我的问题是在从批处理文件调用python脚本时,如何引用每个文件的新提交和以前的版本?现有的代码对我来说是新的,还有一堆 %REPOS%、%TXN%s 等等,我不知道如何去使用它们。有没有一种简单、标准的方法来做到这一点?

它还包含使用 svnlook changed 循环遍历已更改文件的代码,因此该部分不应该成为问题。

非常感谢

gva*_*kov 5

如果您只需要比较文件大小,只需查看svnlook filesize命令即可。默认调用 -svnlook filesize repo path将为您提供 HEAD 修订版的大小path。要获取传入提交中路径的大小,请使用svnlook filesize repo path -t argv[2].

尽管如此,这里还是一个列出版本化路径的所有修订的示例(传入的除外,因为这是预提交挂钩)。

#!/usr/bin/env python

from sys import argv, stderr, exit
from subprocess import check_output

repo = argv[1]
transaction = argv[2]

def path_history(path, limit=5):
    path = '/%s' % path
    cmd = ('svnlook', 'history', '-l', str(limit), repo, path)
    out = check_output(cmd).splitlines()[2:]

    for rev, _path in (i.split() for i in out):
        if _path == path:
            yield rev

def commit_changes():
    cmd = ('svnlook', 'changed', repo, '-t', transaction)
    out = check_output(cmd).splitlines()

    for line in out:
        yield line.split()

def filesize(path, rev=None, trans=None):
    cmd = ['svnlook', 'filesize', repo, path]
    if rev:     cmd.extend(('-r', str(rev)))
    elif trans: cmd.extend(('-t', str(trans)))

    out = check_output(cmd)
    return out.rstrip()

def filesize_catwc(path, rev=None, trans=None):
    '''A `svnlook filesize` substitute for older versions of svn. 
    Uses `svnlook cat ... | wc -c` and should be very inefficient
    for large files.'''

    arg = '-r %s' % rev if rev else '-t %s' % trans
    cmd = 'svnlook cat %s %s %s | wc -c' % (arg, repo, path)

    out = check_output(cmd, shell=True)
    return out.rstrip()


for status, path in commit_changes():
    if status in ('A', 'M', 'U'):
        # get the last 5 revisions of the added/modified path
        revisions = list(path_history(path))
        headrev = revisions[0]

        oldsize = filesize(path, rev=headrev)
        newsize = filesize(path, trans=transaction)
Run Code Online (Sandbox Code Playgroud)