本系列目前有四篇文章,建議依照以下順序閱讀:
wcfind - avoid find(1) into subversion meta directories
use grep(1) accompany with my wcfind via xargs(1)
Setting svn:keywords in many files simultaneously
再探 wcfind — 用 find2perl 實作
因為同事「發現」了 Visual SourceSafe 的 keyword expansion 的功能,很開心地要用在「檔頭註解」[1]裡,於是我就推薦他使用 Id、Date、Revision 與 Author 這四個 keyword,因為這四個 keyword 在 VSS、CVS 與 Subversion 裡都可以用,且用法一樣。既然終於要正式用了,那我寫的那些程式早已經在用的「檔頭註解」,也要跟著對應過去才行。在剛開始的時候,Subversion (SVN) 只可以使用 Id、LastChangedDate、LastChangedRevision/Rev 與 LastChangedBy 等,所以我也都是用這幾個一直到現在。不過既然後來較通用的 Id、Date、Revision 與 Author 也可以用了[2],就趁此機會換回來。
理論上,我自己在 SVN 這邊用的時候,這些 keywords [...]
要開始來在 ADE 裡寫點 javascript 了,第一個碰到的問題就是,在 javascript 裡怎麼做 include guard?搜尋 Google 沒找到答案,只好自己來。靠《JavaScript - a free online quick reference by VisiBone》找到這條語法:
var u; /* not assigned */ assert(typeof(u) == "undefined"); /* not defined */ assert(typeof(x) == "undefined");
正好適合來做 javascript 版的 include guard。為了測試,寫了一個 js_inc_guard.js 檔如下:
if (typeof(JS_INC_GUARD_JS_INCLUDED) == "undefined") { var JS_INC_GUARD_JS_INCLUDED [...]
就在前幾天,Subversion version 1.2.0 終於 release 了,於是我就在等 Ports,兩天後,devel/subversion 總算升到 1.2.0 了,趁著今天空閒,我做了升級。畢竟,我需要的 Issue 2065、2099 和 2134 都是修正於 1.2 版,要升上去才能用。
升級之後,一切順利,唯一要注意的是,svnadmin create 的 --fs-type 的預設值從原先的 bdb 改為 fsfs。我比較喜歡 bdbfs,至少因為 bdbfs 在 Subversion 裡的歷史比較悠久,應該會比較保險一些。所以我一併把我的 svn-newrepo.sh 修改了一下,強制預設使用 bdbfs,只要我都是用 svn-newrepo.sh 建立 repository,便不會因為忘記這個預設值改變的事情,而設錯了 --fs-type。
不過,我還是發現了另外一個問題。也就是新的 Subversion 1.2.0 和 Trac 0.8 並不相容,進 Timeline 區時,便會顯示如下的錯誤:
Traceback (most recent call last):
File "/usr/bin/trac-admin", line 34, in [...]
基本上,我是用 FreeBSD 的,而 FreeBSD 本就已經有內建一個 indent(1)。不過可惜的是,正如其 man-page 的 BUGS 這節所述:"The indent utility has even more switches than ls(1)." 其複雜簡潔的設定,使其設定檔 ~/.indent.pro 如天書一般難解。因此,衝著 gindent 的 ~/.indent.pro 可以使用 C/C++/Java 註解的特性,我選擇改用 gindent。
Indent 的設定,正代表著設定者對於 C/C++ 程式的排版風格的喜好。為了調整 gindent 的設定檔至我所喜好的模樣,當年亦花了不少時間作實驗。看了 s88 兄的《gnu’s indent》後,我亦有感而發,拿出我的 ~/.indent.pro 來陷醜:
// ---------------------------------------------------------------------// gindent options// ---------------------------------------------------------------------
// ---------------------------------------------------------------------// -bad, --blank-lines-after-declarations// Force blank lines after the declarations.// See BLANK LINES.-bad
// [...]