簡體   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