[轉載][SVN] 為 Subversion 的 post-commit mail 加入專案名稱

分類: 技術分享 作者: jaceju

2 10 月 2009

本文轉載自:[SVN] 為 Subversion 的 post-commit mail 加入專案名稱

問題

目前我們公司是用 Subversion 做為版本控管系統,在 commit 時都會需要把版本更新訊息寄送給相關人員,當然這就會用到 post-commit 這個 hook 指令;而在 post-commit 中,我們可以利用 bash 語法去呼叫寄信程式。

不過預設建立好的 Repository 下的 hooks 目錄並沒有這個檔案,我們可以把預設的 post-commit.tmpl 複製成 post-commit :

# cp /path-to-svn-repository/project_name/hooks/post-commit.tmpl /path-to-svn-repository/project_name/hooks/post-commit

至於寄信程式的部份,在 Subversion 的 Source code 裡就提供了一個很有用的 mailer.py ,它可以協助我們寄送 commit 後的訊息。

原來的 post-commit 內容如下:

#!/bin/sh
 
# POST-COMMIT HOOK
# (略)
 
REPOS="$1"
REV="$2"
 
commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
log-commit.py --repository "$REPOS" --revision "$REV"

將它修改為:

#!/bin/sh    
 
# POST-COMMIT HOOK 
# (略) 
 
REPOS="$1"
REV="$2"
 
/path-to-subversion-source/tools/hook-scripts/mailer/mailer.py commit "$REPOS" "$REV"
# log-commit.py --repository "$REPOS" --revision "$REV"

不過用原始的 mailer.py 有個缺點,主要是它寄送的訊息主旨範例如下:

r3214 - branches/2.0

這樣在多個專案時,我們就不容易識別這次的更新是哪個專案。

所以我就想透過修改 mailer.py ,讓它產生如下的主旨:

[project_name] r3214 - branches/2.0

修改方式

改法很簡單,有兩個地方要改: (針對 Subversion 版本 1.4.4 原始檔)

if commondir:
  self.output.subject = 'r%d - in %s: %s' % (repos.rev, commondir, dirlist)
else:
  self.output.subject = 'r%d - %s' % (repos.rev, dirlist)

改成:

if commondir:
  self.output.subject = '[%s] r%d - in %s: %s' % (repos.project_name, repos.rev, commondir, dirlist)
else:
  self.output.subject = '[%s] r%d - %s' % (repos.project_name, repos.rev, dirlist)

也就是這裡我多加了一個 repos.project_name ,讓信件主旨可以多一個專案名稱。不過 projects_name 並不是 repos 的屬性,所以我們還要再修改一個地方。

往下找到:

self.author = self.get_rev_prop(svn.core.SVN_PROP_REVISION_AUTHOR)

然後在底下加入一行:

self.project_name = repos_dir[10:]

其中 10 這個數字是指 /path-to-svn-repository/ 的長度,因為 repos_dir 的內容會是 /path-to-svn-repository/project-name ,而字串是由 0 開始算起,那麼 project_name 的起始位置就會剛好是 /path-to-svn-repository/ 的長度。 (所以請自行計算並更改之)

至於為什麼我會知道 repos_dir 的內容,這是因為我在一開始就用了以下的程式去印出它:

f = open("mailer.log", 'w')
f.write(repos_dir)
f.close()

當然這邊要注意縮排。

結論

Python 對我來說,其實是一個不熟悉的語言。不過它的語法也不是那麼難以理解,以我這種三流能力,竟然還能看懂並修改它。

而 mailer.py 也大量使用了物件導向的寫法,所以未來有機會在開發 Python 程式時,在物件導向的基礎也是不可或缺的。

就這樣啦~謝謝收看~再會~

我要留言

關於這裡

這個部落格分享了哇寶在電子商務領域的技術及資訊,希望能讓更多人一起為台灣的網路產業加油。