使用Python寫(xiě)服務(wù)器端的SVN Hook

什么是SVN Hook

SVN hook 腳本,大都譯為SVN鉤子,提供了一種非常強(qiáng)大而且靈活的方式把代碼庫(kù)的各種事件與自定義操作聯(lián)系起來(lái)。舉個(gè)例子來(lái)說(shuō),代碼提交到服務(wù)器以前要進(jìn)行基于自定義規(guī)則的審查和檢查,審查通過(guò)則繼續(xù)提交,審查失敗則拒絕提交。

客戶(hù)端Hook VS 服務(wù)器端Hook

服務(wù)器端Hook

服務(wù)器端Hook腳本程序在服務(wù)器上執(zhí)行,鉤子可以調(diào)用bat批處理文件(在Windows系統(tǒng)中)、bash腳本、可執(zhí)行文件或者一些類(lèi)似于perl、python等的腳本,一共提供了一下9種情況來(lái)實(shí)現(xiàn)不同階段的自定義操作:

  • 關(guān)于鎖定的2種

    • pre-lock
    • post-lock
  • 關(guān)于解鎖的2種

    • pre-unlock
    • post-unlock
  • 關(guān)于提交的3種

    • start-commit
    • pre-commit
    • post-commit
  • 關(guān)于屬性的2種

    • pre-revprop-change
    • post-revprop-change

使用svn admin create命令創(chuàng)建出來(lái)的代碼倉(cāng)庫(kù),根目錄下面有個(gè)hooks文件夾,里面已經(jīng)預(yù)置了上述幾種鉤子腳本的模板,看了一下里面是bash腳本,如下圖所示。如果要自定義其中的某一個(gè),比如pre-commit.tmpl,把該文件拷貝一份并且重命名為pre-commit,注意要有可執(zhí)行權(quán)限!

svn hooks 文件夾

客戶(hù)端Hook

svn的客戶(hù)端也具備Hook的功能,比如windows上常用的TortoiseSVN,可以在設(shè)置的界面中設(shè)置腳本程序的類(lèi)型、工作目錄、執(zhí)行命令等內(nèi)容。如下圖所示。

TortoiseSVN Hooks 腳本配置界面

兩者對(duì)比

對(duì)比兩者的作用、功能以及實(shí)現(xiàn)方式,大概有下面幾點(diǎn)不同:

  1. 作用范圍不同:服務(wù)器端的hook作用于所有提交到svn server上面的代碼;而客戶(hù)端只是在本機(jī)上進(jìn)行檢查;
  2. 提供的鉤子類(lèi)型不同:從上述圖片中可以看到兩者所提供的鉤子類(lèi)型存在差別;
  3. 執(zhí)行環(huán)境不同:客戶(hù)端的環(huán)境復(fù)雜多樣,Windows、Linux、Mac OS X都有,每個(gè)系統(tǒng)上執(zhí)行hook腳本的環(huán)境是不同的,所以客戶(hù)端腳本很難做到統(tǒng)一。并且,不同公司出品的客戶(hù)端可能在hook的功能上還會(huì)有所差別(沒(méi)仔細(xì)研究其他SVN客戶(hù)端產(chǎn)品,純屬猜測(cè))。服務(wù)器雖然也有不同的操作系統(tǒng),不過(guò)定下系統(tǒng)之后,svn服務(wù)器端hook腳本的執(zhí)行環(huán)境相對(duì)單一。
  4. hook腳本實(shí)現(xiàn)方式不同:SVN客戶(hù)端的代碼庫(kù)是以文本形式存儲(chǔ)的源代碼,想要進(jìn)行什么操作都可以,自由度很高;上傳到服務(wù)器上的代碼都是二進(jìn)制文件,存儲(chǔ)在代碼庫(kù)的DB中,需要配合svnlook等命令來(lái)使用。

實(shí)戰(zhàn)一下

下面記錄了本次使用Python腳本做pre-commit鉤子的示例,在該示例中展示了幾種主要的功能,svnlook log, svnlook changed, svnlook cat三個(gè)命令的使用方法。注意,該示例摘自完整腳本,只是示意用法,不能直接運(yùn)行。

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import sys
import os
import re

def main(argv):
    # 從參數(shù)中取出來(lái)代碼庫(kù)和事務(wù)信息
    (repos, txn) = argv
    # svnlook log拿到的是用戶(hù)提交時(shí)填寫(xiě)的log信息,然后隨便你想做什么
    message = "".join(os.popen("svnlook log '%s' -t '%s'" % (repos, txn)).readlines()).strip()      

    # svnlook changed拿到的是用戶(hù)提交的文件,這個(gè)列表中有文件的狀態(tài)(A,U,D之類(lèi)的)和文件名
    changelist = os.popen("svnlook changed '%s' -t '%s'" % (repos, txn)).readlines()

    # svnlook cat能讀出用戶(hù)提交文件的內(nèi)容
    fileContent = "".join(os.popen("svnlook cat -t %s %s %s" % (txn, repos, filename)).readlines()).strip()
    
    # 返回
    if msg == '':
        sys.exit(0)
    else:
        # 輸出返回信息
        sys.stderr.write(msg)
        sys.exit(1) 

if __name__ == "__main__":
    # sys.stderr.write(os.getcwd())
    # 發(fā)現(xiàn)默認(rèn)的工作目錄竟然是跟目錄“/”,這里要換一下當(dāng)前工作目錄
    os.chdir(sys.path[0])
    # sys.stderr.write(os.getcwd())
    main(sys.argv[1:])

有幾點(diǎn)要交代:

  1. 腳本返回0的話(huà),svn客戶(hù)端會(huì)提交成功;腳本返回非0,客戶(hù)端提交代碼失敗;
  2. 返回給客戶(hù)端的錯(cuò)誤信息,需要腳本輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出;
  3. 如果跟執(zhí)行環(huán)境配置有關(guān)的話(huà),工作目錄要切換;
  4. svnlook命令有很多,可以參考5。

參考4是Github上的一個(gè)完整的示例,感謝作者,供參考。

參考

  1. https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html#tsvn-dug-settings-hooks
  2. https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-repository-hooks.html
  3. http://wordaligned.org/articles/a-subversion-pre-commit-hook
  4. https://github.com/lisijie/python-svn-hook/blob/master/pre-commit.py
  5. http://svnbook.red-bean.com/nightly/en/svn.ref.svnlook.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,957評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,248評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,356評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,081評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,485評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,720評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,263評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,025評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,204評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,461評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,874評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,105評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,945評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,205評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容