试图创建一个验证外部的预提交钩子

时间:2014-04-11 13:25:10

标签: svn svn-externals pre-commit-hook externals

我目前正在尝试创建一个预提交挂钩,阻止用户使用非标记的外部标记代码版本。

我只想找到一种方法来获取在事务中指定的外部但却无法弄清楚如何。命令svnlook似乎无法返回任何远程看起来像外部修改的东西。使用svn命令,它似乎是我无法指定的事务。我不知道在我的预提交钩子中使用什么命令。我目前在Windows中,但制作了一个python脚本,能够在我们的linux服务器上测试它。

到目前为止我测试的内容如下:

svnlook propget C:\TestReposLocal svn:externals <== Give me error something is missing

svn propget svn:externals C:\Test    <== Give me externals but I cant figure out how to get this from a transaction to place in a pre-commit hook.

在我的存储库(C:\ TestReposLocal)中,我有一个外部是另一个存储库的主干。此存储库与svn propget命令一起显示,但如果此外部不是标记,则我需要知道预先提交中的当前事务。

任何帮助都会很乐意接受。

TNX

2 个答案:

答案 0 :(得分:1)

好吧,我在这里看不到你的麻烦点

  • 可以使用svnlook
  • 执行事务(和本地 repo)的预提交挂钩中的任何(几乎任何)操作
  • svnlook有子命令propget,可以在事务级别上操作并从repo中的任何路径中提取任何属性(本例中是事务),你必须已经知道,在那里你可以遇到repo-tree里面的外部。
  • 您可以从repo中的任何先前版本中识别出正确的外部格式

修改

好的,我明白了:这里需要更多细节。对于测试和实验,我使用了开放式存储库Proving Ground for externals on Assembla,它在标签中具有PEG修订版,而不是在主干中进行PEG编辑。为了在本地使用svnlook,我只需将svnrdump用于本地存储库。

  • 最近等同于从事务中获取属性是从承诺修订中获取它。

标签1.0.1是使用r7

创建的
>svnlook pg rep svn:externals tags/1.0.1/ -r 7
-r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib@2 lib

其中:

  1. rep是本地文件系统上存储库的相对路径
  2. tags/1.0.1/是存储库中的路径,我之前知道它应该有定义
  3. -r 7是修订版,我想测试
  4. 标签是从主干创建的,其中外部未绑定到特定版本

    >svnlook pg rep svn:externals trunk/ -r 6
    https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib
    

    您现在必须看到规格上的差异

    警告:externals-definition 的格式在使用古代(1.4之前的)SVN客户端时会不同 如果使用CLI版本的SVN或IDE的SVN集成(上面我用TortoiseSVN创建的定义),则不同(不能回忆确切的细节),但这将是你的工作的一部分

    • 我命令只在需要时应用钩子的业务逻辑(仅用于/ tags中的提交)并更快地完成提交,你还检查钩子(在早期阶段)附加条件 - 是否与此提交标签相关。它又是svnlook和dirs-changed子命令

    dirs-changed用于提交标签

    >svnlook dirs-changed rep -r 7
    tags/
    tags/1.0.1/
    

    dirs-changed用于提交到其他位置

    >svnlook dirs-changed rep -r 6
    trunk/
    

    你可以|grep tags在良好的操作系统中,在Windows中做一些技巧,根据结果进行操作

    PS:不要忘记将-r替换为-t生产和存储transaction-id + repo-path,你将获得它作为钩子的参数

答案 1 :(得分:0)

这对我有用

REPOS="$1"
TXN="$2"

SVNLOOK=svnlook

Grep_In_List()
{
    EX_STATUS=1

    while read line
    do
        echo "$line" | grep "$1" > /dev/null
        if [[ $? == 0 ]]
        then
            echo "$line"
            EX_STATUS=0
        fi
    done

    exit $EX_STATUS
}


CHANGED_PATHS=$($SVNLOOK dirs-changed -t "$TXN" "$REPOS" | Grep_In_List "^tags")

if [[ $? != 0 ]]
then
# no tags
    exit 0
fi

CHANGED_SUB_PATHS=$(echo $CHANGED_PATHS | xargs -I {} $SVNLOOK tree "$REPOS" "{}" --full-paths -t "$TXN" | sort | uniq | xargs -I {} echo "{}\n")
CHANGED_EXTERNALS=$(echo $CHANGED_SUB_PATHS | xargs -I {} $SVNLOOK pg "$REPOS" svn:externals "{}" -t "$TXN" 2>/dev/null | xargs -I {} echo "{}")

while read external
do
    echo "$external" | grep ' -r' > /dev/null
    if [[ $? != 0 ]]
    then
        echo "$external does not have an explicit revision number" 1>&2
        exit 1
    fi
done <<<"$CHANGED_EXTERNALS"

# all tags correct
exit 0