2009-09-28 101 views
4

是否可以在mercurial中編寫某種鉤子方式來拒絕會影響存儲庫中特定命名分支的變更集?阻止對單個mercurial存儲庫中特定分支的寫入訪問

我們有一個託管項目,並希望允許任何開發人員將其更改推送到我們的存儲庫,只要他們位於其自己的命名分支中。這使我們能夠管理同一個存儲庫中的單個buildbot和共享沙箱(通過保持分支不同)。我們想阻止任何企圖從外部人員寫入默認分支(我們會在內部合併他們的分支)。

我們正在使用pretxnchangegroup掛鉤,但是這2個擔憂:

1)用戶可以使用推任何用戶名的變化;我們基本上只有一個http-auth通過要求任何用戶名或密碼實際連接到repo來保護存儲庫,但它不檢查提交中的用戶名以確保它們與用於推送的帳戶相匹配。

2)讓我們說一個用戶已經完成了並且在一個分支中開發完成,然後他們在默認分支上做了最後一次提交。 hg push失敗。開發人員現在在做什麼來解決他們的問題?

有什麼想法?

回答

2

是的,你可以很容易地用pretxnchangegroup這樣做,就像你想的那樣。我會在shell中執行它,但如果你在python中執行它,它會在進程中(並且因此更快)。

設置這樣的事情作爲你的pretxnchangegroup:

#!/bin/sh 
for thenode in $(hg log -r $HG_NODE:tip --template '{node}\n') ; do 
    if [ $(hg id --branch -r $thenode) = "default" ] ; then 
      echo Commits to default branch are not allowed -- bad changeset $thenode 
      exit 1 
    fi 
done 

這使得確保沒有到達的變更是在分支「默認」。

關注點1:如果你運行在Apache後面,你將可以訪問通常的CGI變量,所以你可以檢查$ REMOTE_USER以確保它匹配分支名稱,如果這是你想要實施的東西。

關注問題2:如果用戶看到他們正在推送無效更改集的消息,則他們只需使用push -r即可推遲其餘部分,稍後他們可以在默認情況下刪除或修改其更改集。

最後,你有沒有考慮過爲自動構建/主分支設置一個單獨的克隆?讓所有人都進入升級回購協議,並且讓只有buildmaster pull在從他們對他們滿意的時候批准變更集從自動構建到自動構建?你現在擁有相同的工作流程(等待構建器合併),但它不那麼麻煩。

相關問題