2009-12-07 123 views
5

是否可以在CVS的預提交鉤子中使用提交消息? CVS服務器正在遠程運行,我使用pserver訪問它。在CVS預提交鉤子中使用提交消息

理想情況下,如果文件通過篩選器,我希望允許提交提交消息包含某些文本。

我沒有選擇使用其他版本控制系統。

回答

3

下面是一些有用的教程閱讀更多:

http://durak.org/sean/pubs/software/cvsbook/The-commitinfo-And-loginfo-And-rcsinfo-Files.html
http://durak.org/sean/pubs/software/cvsbook/The-verifymsg-And-rcsinfo-Files.html#The-verifymsg-And-rcsinfo-Files

你不能做你想做的只有一個鉤子,但是你可以用兩個鉤子, commitinfo會讓你驗證文件本身和verifymsg將讓你驗證消息。兩者都可以用來取消提交(程序只需要以狀態1退出)。如果您不知道,checkoutlist,commitinfo和'verifymsg'都可以在存儲庫的CVSROOT目錄中找到。我建議把你編寫的任何腳本作爲鉤子放在那個目錄中,但是當你指定完整路徑時它並不重要。此外,Perl是沒有必要或需要的,只是簡單的給我寫一些(傻)例子:

checkoutlist文件

# these files will be automatically checked out for you 
acceptable 

verifymsg的

# specifies which file to run as hook, %l is filename of log message 
# bar$  /path/to/repo/CVSROOT/verify_ends_in_bar %l 
DEFAULT /path/to/repo/CVSROOT/acceptable %l %s 

接受

#/usr/bin/perl -w 

use strict; 
use warnings; 

# this would be simpler if cvs passed sane arguments 
my ($logfile, $dir, @files) = @ARGV; 
my $grep = `grep -i 'accept liability' $logfile`; 
exit 0 if $grep; 

my $found = 0; 
foreach my $file (@files) { 
    my $path = join '/', $dir, $file; 
    die "Can't find file $path" if ! -e $path; 
    my $grep = `grep -i 'evidence of any deliberation' $path`; 
    $found++ if $grep; 
} 
die "You must accept liability or show evidence of deliberation" if $found < @files; 

注意力不足:我寫了大部分內容,沒有測試,所以我不能保證它能正常工作它應該讓你至少關閉。

再次編輯,我才意識到,我本來是錯了,你可以同時通過日誌文件和承諾的文件名verifymsg使答案相當簡單一點。

+0

您嘗試過使用什麼版本的CVS?用我的版本,當我在'verifymsg'文件中指定%s時,我沒有收到提交的文件,我仍然只獲取日誌文件。 – dreamlax 2010-01-18 01:12:17

+0

@dreamlax我從來沒有像需要使用'verifymsg',我只使用'loginfo'和'commitinfo',但我想我在網上發現了一些例子,顯示'verifymsg'接受日誌文件和%s。如果這對你不起作用,你可能必須退回到'commitinfo'腳本和'verifymsg'腳本之間的某種通信。 – 2010-01-18 19:52:05

+0

@dreamlax另外,你是否可以同時要求這兩個標準?然後,我使用commitinfo和verifymsg的答案的早期版本可以使用。我想這取決於你是否意味着邏輯**或**或更典型的英語**或**。 – 2010-01-18 19:56:44

1

您可以使用CVSROOT目錄中的verifymsg文件。您可以將其配置爲調用可驗證簽入註釋內容的腳本。您可以通過返回非零來拒絕提交。

默認的verifymsg文件包含更多詳細信息。

+0

我想拒絕提交如果預提交失敗*和*日誌消息不*包含「我接受責任」或任何其他。預提交鉤子確保文件是有效的,但如果提交違反規則的文件是必要的,我想確保日誌提及它。我希望能夠在允許提交之前檢查提交的消息*和*提交的文件。 – dreamlax 2009-12-07 03:27:06

+0

問題是,預提交鉤子似乎無法訪問提交消息,以確保將故障驗證記錄爲故意,並且verifymsg掛鉤無法訪問已更改的文件以驗證更改是否符合與規則。 – dreamlax 2009-12-07 03:29:15

+0

你說得對,verifymsg無法獲取正在提交的文件。你必須分開實施它們。所以如果一個失敗,整個提交將失敗。這是否做你想要的? 此外,爲了闡明,據我所知,你不能在預先提交鉤子的實際文件,你只是告訴路徑/名稱。 – 2009-12-07 03:53:32

3

CVS::Trigger Perl模塊似乎有一個實驗功能,允許在不同觸發器的調用之間緩存值。該頁面明確提到將commitinfo中的文件名傳遞給verifymsg,所以它可以幫助你實現你想要的。

+0

謝謝你。我會去回答這個問題,除非你說的是實驗性的,我需要一些更具體的東西。 – dreamlax 2010-01-18 20:09:54

0

我一直在處理同樣的問題。到目前爲止,我的最佳解決方案是獲取父進程ID(getppid())並將其用於臨時文件,我可以從commitinfo中放入文件列表。對於verifymsg進程(至少在AIX上),此父ID似乎相同。 祝你好運。