繁体   English   中英

尝试创建一个预提交的挂钩来验证外部

[英]Trying to create a pre-commit hook that verify 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命令一起显示,但是我需要在预提交中了解当前事务,如果此外部不是Tag之外。

任何帮助将很高兴得到。

TNX

好吧,我真的看不到你的麻烦点

  • 可以使用svnlook执行带有事务(和本地回购)的预提交挂钩中的任何(几乎任何)操作
  • svnlook具有子命令propget,具有可以在事务级别操作并从repo内的任何路径(在这种情况下为事务处理)中提取任何属性的方法,并且您必须已经知道,在那里可以在repo-tree内遇到外部对象
  • 您可以从repo内的任何先前版本中识别出正确的外部格式。

编辑

好的,我知道了:这里需要其他详细信息。 为了进行测试和实验,我在Assembla上使用了开放式存储库Provision Ground for Externals ,该外部存储库在标签中进行了PEG版本的修改,而在主干中未进行PEG版本的修改。 为了在本地使用svnlook,我只是将其svnrdump's到了本地存储库中。

  • 与从事务中获取属性最接近的是从已提交的修订中获取属性。

标记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是修订,我要测试

标签是从主干创建的,其中外部未绑定到特定版本

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

您现在必须看到规格差异

警告 :如果使用旧版(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:别忘了在生产中用-t替换-r并存储transaction-id + repo-path,您将获得它作为钩子的参数

这对我有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM