顯示具有 Trac 標籤的文章。 顯示所有文章
顯示具有 Trac 標籤的文章。 顯示所有文章

2011/07/23

Can't remove 'db/transactions/1-1.txn'

老闆交辦一個新的案子,按慣例,先匯入 Subversion 好讓組員可以協同開發。原廠給的 SDK 接近 3G,很好奇要花多少時間才可以完成匯入? 半小時後還在進行... 卻猛然想起,svn import 時忘了加 --no-ignore,這會讓 svn 跳過 .a 和 .o 之類的檔案。只好按 ^C 煞車重來。

第二次重作忘了量時間,但一兩個小時跑不掉。看起來似乎 import 成功,但卻有一個錯誤訊息:
Can't remove 'db/transactions/1-1.txn'
svnadmin lstxns 去看,確實有一個 outstanding transaction,而且用 svnadmin rmtxns 也砍不掉。只好手動去砍掉 db/transactions/1-1.txn 這個目錄。

這樣做似乎不影響 Subversion 的使用,但連結的 Trac 好像受到影響而不能使用。解決方法是用以下指令重新同步 Trac 的 repository 資料 (也要等很久):
trac-admin $YOUR_TRAC_ENV repository resync ""



2011/04/02

手動修改 Python Egg 的克難方法

Trac 是相當好用的專案管理系統,非常值得推薦。不過,畢竟是免費的 open source project,有時候遇到問題必須自己想辦法克服。 聽起來有點可怕?放心啦,以下的案例是我使用 Trac 五年多來第一次必須自己想辦法解決。

簡單說,有一個我很常用的功能在升級到 Trac 0.12.2 之後,變得不能用了。本著 open source 的精神,我找到問題的所在,也大約知道應該如何修正。然後,我就到該 project 的 ticket system 回報問題的症狀和可能解法。結果,兩個月過去了,這個回報如石沉大海... (也許我沒仔細遵循他們的回報規範吧?)

雖然我知道如何解這問題,但 Trac 包裝成 Python egg,我不知道如何去修正裡面的程式。後來發現 egg 其實是 .zip 的壓縮檔,用 unzip 便可解開:
mkdir trac-egg
cd trac-egg
unzip ../Trac-0.12.2-py2.5.egg
很容易就可以在解開後的檔案內找到並修正問題點。然後,應該就是用 zip 再打包回去吧?
zip -r -9 ../Trac-0.12.2-py2.5.egg *
檔案大小的差異讓我有點遲疑,但還是將這個修正後的 egg 取代舊的:
cp ../Trac-0.12.2-py2.5.egg /usr/lib/python2.5/site-packages/Trac-0.12.2-py2.5.egg
初步以 trac-admin 來測試 OK,但從 Web 去存取就有錯了。錯誤訊息大約是無法解開 egg 檔,所以用 zip 打包的方法應該有錯。偏偏網路上又找不到如何包裝 Python egg 的方法 (我承認,第一眼看起來有點複雜的資料,我就放棄不看)。

就在我想放棄的時候,發現 zip 有一個參數可以只更新修改過的檔案:
zip -f ../Trac-0.12.2-py2.5.egg
這個指令只換掉我剛剛修改過的檔案,而克難修正後的 egg 檔果然能夠動作。

2009/11/18

Subversion 的 Log

使用 Subversion 之類的 version control system 時,commit log 是非常重要的一項資訊。在你追查歷史時,可以幫助你回復記憶或幫助別人迅速理解 changeset 的目的。

但人吃五穀雜糧長大,打字難免會錯。因此,就有修改 commit log 的需求產生。Subversion 安裝預設是無法修改 commit log 的。以下是開放此項功能的方法 ($REPOS 代表 repository 的目錄):
cd $REPOS/hooks
mv pre-revprop-change.tmpl pre-revprop-change
chmod +x pre-revprop-change
若設定正確,就可以用以下指令來修改任一版本的 log:
svn pe -r 1234 --revprop svn:log $REPOS

svn ps -r 1234 --revprop svn:log "New commit log" $REPOS
若你恰好跟我一樣,也用 Trac 搭配 Subversion 時,正確的 log 更重要。因為 log 可用來搜尋 changeset。不過 Trac 上的 log 是你 commit 時,Trac 偷偷複製的。你改了 Subversion 的 log,Trac 並不知道,所以 Trac 上的 log 還是舊的。

解決方法是要求 Trac 重新校正 log:
# Trac 0.12 以前
trac-admin $PROJENV resync 1234
# Trac 0.12 及以後
trac-admin $PROJENV repository resync "" 1234
其中 $PROJENV 是 Trac 的 environment 位置;1234 是 revision number,若你改了很多 log,省略這個參數就可以全部一起校正。

每次手動校正 log 很麻煩,管理也不方便。所以可以將上述指令寫在另外一個 Subversion 的 hook script -- post-revprop-change:
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
TRAC_ENV="..."

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then
PYTHON_EGG_CACHE=/tmp trac-admin $TRAC_ENV repository resync "" $2
# 若你的 Trac 比 0.12 版舊,請改用以下這一行
# PYTHON_EGG_CACHE=/tmp trac-admin $TRAC_ENV resync $2
exit 0;
fi
注意!上面的 TRAC_ENV 要設定到對應此 repository 的 Trac environment。