Svn 尝试创建验证外部的预提交挂钩

Svn 尝试创建验证外部的预提交挂钩,svn,svn-externals,pre-commit-hook,externals,Svn,Svn Externals,Pre Commit Hook,Externals,我目前正在尝试创建一个预提交钩子,以防止用户使用非标记的外部代码标记代码版本 我只是想找出一种方法来获取在事务中指定的外部数据,但无法找到方法。命令svnlook似乎无法返回任何远程看起来像外部修改的内容。使用svn命令,似乎是我无法指定的事务。我不知道在预提交钩子中使用什么命令。我目前在windows中,但正在制作一个python脚本,以便能够在我们的linux服务器上进行测试 到目前为止,我测试的内容如下: svnlook propget C:\TestReposLocal svn:exte

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

我只是想找出一种方法来获取在事务中指定的外部数据,但无法找到方法。命令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.

svnlook propget C:\TestReposLocal svn:externals好吧,我看不出你的问题所在

  • 可以使用
    svnlook
  • svnlook有子命令propget,with可以在事务级别上操作,并从repo(本例中为事务)中的任何路径提取任何属性,您必须已经知道,在repo树中可以遇到外部属性
  • 您可以从repo内部的任何先前版本中确定正确的所需外部格式
编辑

好的,我明白了:这里需要更多的细节。对于测试和实验,我使用了OpenRepository,它将修订钉在标记中,而不是钉在主干中。为了在本地使用svnlook,我只是将它转储到本地存储库中

  • 从事务中获取属性最接近的等价物是从提交的修订中获取属性
标签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
其中:

  • rep
    是本地文件系统上存储库的相对路径
  • tags/1.0.1/
    是存储库中的路径,我以前知道它应该有定义
  • -r7
    是修订版,我想测试一下
  • 标签是从主干创建的,在主干中外部未绑定到特定版本

    >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创建的),外部定义的格式可能会略有不同(记不起确切的细节),但这将是您工作的一部分

    • 我命令只在需要时应用钩子的业务逻辑(仅适用于提交/标记),并更快地完成提交,您还需要签入钩子(在早期阶段)附加条件-此提交标记是否相关。它再次是svnlook和
      dirs更改的子命令
    更改了提交到标记的目录

    >svnlook dirs-changed rep -r 7
    tags/
    tags/1.0.1/
    
    dirs已更改
    以提交到其他位置

    >svnlook dirs-changed rep -r 6
    trunk/
    
    你可以在好的操作系统中
    | grep标签
    ,在Windows中做一些小动作,根据结果进行操作

    PS:别忘了在生产和存储事务id+repo路径上用
    -t
    替换
    -r
    ,这对我来说很有用

    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
    
    REPOS=“$1”
    TXN=“$2”
    SVNLOOK=SVNLOOK
    Grep_In_List()
    {
    EX_状态=1
    读行时
    做
    echo“$line”| grep“$1”>/dev/null
    如果[[$?==0]]
    然后
    回音“$line”
    EX_状态=0
    fi
    完成
    退出$EX_状态
    }
    更改的路径=$($SVNLOOK dirs CHANGED-t“$TXN”$REPOS”| Grep_在列表“^tags”中)
    如果[[$?!=0]]
    然后
    #没有标签
    出口0
    fi
    CHANGED_SUB_path=$(echo$CHANGED_path | xargs-I{}$SVNLOOK树“$REPOS”“{}”--完整路径-t“$TXN”| sort | uniq | xargs-I{}echo”{}\n)
    CHANGED_EXTERNALS=$(echo$CHANGED_SUB_path | xargs-I{}$SVNLOOK pg“$REPOS”svn:EXTERNALS{}”-t“$TXN”2>/dev/null | xargs-I{}echo{}”)
    读外部
    做
    echo“$external”| grep'-r'>/dev/null
    如果[[$?!=0]]
    然后
    echo“$external没有明确的修订号”1>&2
    出口1
    fi
    
    解决问题的真正方法是从摆脱svn开始:因为你遇到的(以及更多)困难的原因而使用外部语言。我们是一家公司,我们每个部门都有一个存储库来存放我们的资料。我们每个人都有一个版本的存储库,并且经常被修改。我们的SDK是compagny正在开发的每个部分的熔炉。当我们发布一个标签时,我们会标记每个外部标签,并发布一个只包含标签的版本。这就是为什么我需要有一个预提交来验证外部是标记。@KBB-不要“修复”没有损坏的东西!!!不要为你不拥有的公司口授政策我不是在口授政策——只是观察到svn:外部语言很少以一种使事情更容易的方式使用。如果不知道更多,就很难推荐一个替代方案。。。尽管OP确实提到了SDK,但需要SDK的源代码似乎有些奇怪。我的问题是,我似乎不知道如何为事务正确编写命令行。在我上面的例子中,我写到:
    svnlook propget C:\testreposolcal svn:externals
    I在末尾缺少/trunk。这是为了能够验证存储库中已经存在的路径。我想做的是能够看到事务中正在提交哪些外部,我想这行应该是
    svnlook propget C:\testreposloc svn:externals-t 12-2c
    或任何事务号。但这是行不通的。它总是说缺少属性名。