CVS進階功能

自動通知開發團隊

當有人commit了程式後,大家怎麼會知道呢,所以CVS內可以自動在特殊事件後 ,做些特殊的動作。在server那端,$CVSROOT/CVSROOT下面有一些檔案

CVS管制檔案

commitinfo

這是CVS正式執行commit前的先行檢查程式,定義在這裡面。

loginfo

當有人寫了log message之後就執行裡面定義的命令。通常是commit後 執行。

editinfo

這已經不再用了

verifymsg

檢查commit進來後的log message,可以用個script來檢查。因為 可能一個group裡面對於你的log message有格式的規定,例如一定 要有bug ID,一定要有人名name:的字眼,如果log message不合 團隊的規定,可以把他踢回去。

要修改這些檔案也請先用cvs來存取這些檔案。 其檔案內容格式是
regular-express command
	
regular-express是emacs裡的基本regular express只要符合這個 regular express的模組名稱都會執行後面的命令。 例如有這行在loginfo
^study mail -s "information" < info.file
	
如果repository裡面有study_computer,study,computer_study這三個模組, 則只有study_computer,study這兩個模組當有人commit 時會去執行mail的動 作。當然也可以用script作為執行命令。
DEFAULT /usr/bin/cvs-log
	
表示說如果沒有模組名符合regular express搜尋,則自動用cvs-log這隻程式。

有些字串是相對於版本有所變化的,例如版本號碼,你可以有3種format字串來 代表他們
%s	檔案名
%V	舊的版本號碼
%v	新的版本號碼
	
如果有兩個以上要一起用,要用{}括起來 例如我有下面這行在loginfo內
study mail -s "%{sVv}" nick@debian.comc.com
	
表示只要送交進study這個專案模組的檔案,則會送出這個檔的名字, 舊版本號碼,新版號碼放在mail的subtitle裡面送給nick。

版本編號標籤(tag)與branch Merge

通常我們程式開發時,會有莫名的想法,可能是改進的演算法, 可能是其他的新功能。但是可能不是完全定案,這時我們可以另外 開一支分支來測試我們的新idea程式版本。如圖

Figure 3-2. CVS分支示意圖

原本的就是叫mainline branch

對於每次的release,可能我們要給一個tag來做識別,一個tag可以給 某個特定檔案,也可以給整個專案。將來要存取時也可以用tag來做辨認。
$ cvs tag tag_name .                  建立一個tag叫tag_name給所有檔案
$ cvs co -r tag_name module_name      從module_name下取出tag_name的所有檔
$ cvs status -v                       看目前檔案的status可以看出有什麼tag
	

$ cvs status -vl [files]
$ cvs log -l [files]
	
檢查。 tag還有更有用的作用就是來建立branch,建立branch用 cvs tag -b來為branch建立一個tag。
$ cvs tag -b r-1-0-patches
$ cvs rtag -b -r r-1-0 r-1-0-patches myproj
$ cvs checkout -r r-1-0-patches myproj
$ cvs update -r r-1-0-patches myproj
	
存取branch不管用commit,update...都要用symbol tag名稱了。

其中r-1-0-patches是有名字的tag(symbolic tag)。
tag -b    是說相對於目前local工作目錄下的版本給一個分支
rtag -b   是相對於r-1-0這個版本給一個分支r-1-0-patches
	
checkout -r 也可以checkout -D用日期

Branch 的Merge

當嘗試完branch覺得不錯想要merge進原有的mainline版本, 先用
cvs update -j branch_tag 
	  
再用cvs commit建立新版本。 以上面例子言就是把1.2.2.2跟1.2的差異先merge到目前工作目錄, 然後下次用commit時,就會產生新的mainline 版本1.5了。

Lock檔案與送交衝突(conflict)

基本上cvs是架在另一個古早的版本控制叫rcs上的,這裡面有一種機制 是可以lock檔案的,也就是只有你可以編輯別人不能編輯,
$ cvs admin -l file.c
	
就可以了

不過這不是好方法,因為當初cvs設計哲學就是要讓大家同時發展程式, 不過有時你改改我改改,程式送交時會發生衝突(conflict)的狀況, 也就是兩個人同時對同一行code修改,而且送交後這有點像race condition。 這時你必須要確定這段相衝的程式是被允許的,修改完後,才能再送交。 當用cvs update時, 如下
#include <stdlib.h>
#include <stdio.h>
	      
int main(int argc,
         char **argv)
{
  init_scanner();
  parse();
  if (argc != 1) {
    fprintf(stderr, "tc: No args expected.\n");
    exit(1);
  }
  if (nerr == 0)
    gencode();
  else
    fprintf(stderr, "No code generated.\n");
<<<<<<< driver.c
    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
=======
    exit(!!nerr);
>>>>>>> 1.6
}
	
表示在exit(nerr == 0......這一行同時兩個人做了修改, 後來的這個人必需解決conflict的問題才行cvs commit。 減少conflict的狀況可以用watch edit機制,在程式發展時,可以知道 有誰同時在寫某個檔案,這樣就降低conflict的機會。用
$ cvs watch on [files]
	
這個在自己工作目錄的檔案將被標為read-only,files沒給的話內定為整 個repository。
$ cvs edit [files]
	
自己的工作目錄下的檔案將被標為read-write,而且通知所有watch檔案的 人,我要開始改了。
$ cvs watch add
	
將會把自己放到通知的名單上去,這樣有人用cvs edit就會通知我了。

通知的Administration file是$CVSROOT/CVSROOT/notify notify內的%s是watch user的意思,跟前面loginfo的%s不一樣,所以應該是
study mail %s -s "I am editing" < info.file
	
表示在study這個模組下watch的user會被通知info.file的內容。

CVS Client GUI介面

CVS有Client的GUI介面,有了以上的觀念,你可以輕易的設定CVS Client GUI了。

Gnome

在Gnu/Linux下用gtk這個interface函式庫寫成的,這個我就不多加介紹了。 秀一下ScreenShot

Figure 3-3.

MS Windows

在windows下有個WinCVS,請到www.cvsgui.org/download.html 在選單裡面
	    Admin -> Preference設定CVSROOT  以及"passwd" 這個方法
	    Admin -> Login
	    選擇一個目錄
	    Create -> Import module  這邊會問一些問題,其實就是Unix命令列下的
	    那些欄位。
	    Create -> Chekcout module
	  
秀一下ScreenShot

Figure 3-4. WinCVS

CVSWeb

把你的CVS倉庫丟到網路上去用Web的方式呈現出來。這在做code review是很有用的,只要買一台infocus之類可以接電腦螢幕的投影機, 或者講好時間大家都在電腦前面, 用X 視窗把netscape或emacs丟到每個人的螢幕前面,就可以code review了。 請在 http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi/ 捉cvsweb。解開後2個perl檔

把cvsweb.conf拷到apache web server裡面的conf目錄, 改%CVSROOT這個hash,你可以有很多個repository被管理,

將cvssweb.cgi 放到apache的cgi-bin alias目錄下, 改$config讓它指到cvsweb.conf的路徑,

http://xxx.xxx.com/cgi-bin/cvsweb.cgi, 就會執行cvsweb CGI程式了。

秀一下screenshot

Figure 3-5. CVSWeb

Figure 3-6. CVSWeb的diff

CVSWeb只能做讀,沒法做commit的動作,不過另外有可以commit的Web介 面的程式,另外還有corss reference的web 介面,也就是每個symbol 都有一個超連結, 可以想看那個function call就看那個function call,看那個變數就 看那個變數。目前都是在一個叫 lxr(linux Cross Reference) 的基礎上發展出很多分支,最有名的是bonsai(日本話的園丁, 因為是個source "tree"嘛), 另外有一個可以看Java C/C++...的叫 doxygen 的。

sourceforge.net與gnome web site可以看到相當嘆為觀止的展示。 annotated表示有每次版本改變的紀錄在source code 上。cross reference表示可以有超連結。請看

http://cvs.gnome.org/bonsai/

http://sourceforge.net

稍微介紹一下CVS有沒有覺得太不可思議了,最不可思議的是這些通通 是不用錢的。我記得以前我在台灣工作時,好像大家還在你copy給我, 我copy給你,想想open source的威力實在太不可思議了,這種程 式的品質,不是兩三天就建立的起來的。想想。想完後,將 帶你進入最不可思議的大驚奇。GNU Compiler Collection。