代码之家  ›  专栏  ›  技术社区  ›  Stuart Lange

Svn pre-commit hook禁止Svn:mergeinfo在非根目录上

  •  19
  • Stuart Lange  · 技术社区  · 14 年前

    我想使用一个预提交挂钩,防止开发人员在非根目录上设置svn:mergeinfo。也就是说,我想强制执行svn:mergeinfo可以 只有 在“trunk”或“branchs/branchName”等目录上设置。有时需要“提醒”开发人员使用根目录的子目录作为合并目标(按照列出的最佳实践 here ). 有没有人有这样一个钩子脚本或知道我在哪里可以找到一个?我在一个windows环境中,所以批处理或powershell会更好,但任何东西都肯定会有帮助。

    2 回复  |  直到 13 年前
        1
  •  7
  •   pmod    14 年前

    首先,我建议使用perl或python来完成这项任务,windows批处理还有很多地方需要改进。

    您可以使用 http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ 从…开始。例如, 验证-po.py 脚本检查文件编码和 commit-access-control.pl.in中 检查作者是否具有提交权限。你可能会雇佣 svnlook差异 在脚本中(如后一个脚本中所示),获取目录的更改属性,并通过相应的路径,无论它们是分支还是使用正则表达式的标记。

    更新

    找到 enforcer pre-commit hook script 这似乎是你要找的。

    这个脚本的作用是 svnlook查看事务 是进步。当它通过 事务,它调用一组 允许存储库的钩子 管理员检查正在进行的操作 决定是否 可以接受。

    它包含几种方法和 验证属性行是否已添加() 其中,因为 为添加到文件属性的每一行调用 .

        2
  •  1
  •   Christopher Oezbek    8 年前

    如果您可以在服务器上注册:

    https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

    如果没有(基于 http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969 ):

    REPOS="$1"
    TXN="$2"
    SVNLOOK=/usr/bin/svnlook
    
    if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then
    
        # Get list of paths which have changed      
        TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS")
    
        # Filter those which are allowed: /trunk, /branches/*,...
        TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$")
    
        # Iterate over all paths, which are not allowed to have mergeinfo
        while IFS= read -r TXN_PATH; do
          ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-)
    
          MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null)
          if [ ! "$MERGEINFO" = "" ]; then 
            echo "  Cannot merge into directory that is not trunk or a branch:" >&2;
            echo "  $ELEM_PATH" >&2;
            echo "  Override by using [override]." >&2;
            exit 1;
          fi      
        done <<< "$TXN_PATHS"
    
        # echo "Merge info check: OK"
    fi