0

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

我只是想找出一种方法来获取事务中指定的外部但无法弄清楚如何。命令 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 命令显示,但如果此外部不是标签,我需要在预提交中了解当前事务。

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

肿瘤坏死因子

4

2 回答 2

1

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

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

编辑

好的,我明白了:这里需要额外的细节。对于测试和实验,我在 Assembla 上使用了开放存储库 Proving Ground 用于外部组件,它在标签中具有 PE​​G-ed 修订版,而在主干中没有 PEG-ed。为了在本地使用 svnlook,我只是将它 svnrdump'ed 到本地存储库中。

  • 从事务中获取属性最接近的等价物是从提交的修订中获取它。

标签 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 客户端的情况下,外部定义的格式会有所不同,并且在使用 SVN 的 CLI 版本或来自 IDE 的 SVN 集成的情况下可能会略有不同(无法回忆确切的细节) (上面我用 TortoiseSVN 创建的定义),但这将是你工作的一部分

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

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,您将获得作为 hook 的参数

于 2014-04-12T10:18:58.160 回答
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
于 2015-01-22T09:40:18.353 回答