是否可以在CVS的預提交鉤子中使用提交消息? CVS服務器正在遠程運行,我使用pserver
訪問它。在CVS預提交鉤子中使用提交消息
理想情況下,如果文件通過篩選器或,我希望允許提交提交消息包含某些文本。
我沒有選擇使用其他版本控制系統。
是否可以在CVS的預提交鉤子中使用提交消息? CVS服務器正在遠程運行,我使用pserver
訪問它。在CVS預提交鉤子中使用提交消息
理想情況下,如果文件通過篩選器或,我希望允許提交提交消息包含某些文本。
我沒有選擇使用其他版本控制系統。
下面是一些有用的教程閱讀更多:
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是沒有必要或需要的,只是簡單的給我寫一些(傻)例子:
# these files will be automatically checked out for you
acceptable
# 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
使答案相當簡單一點。
您可以使用CVSROOT
目錄中的verifymsg
文件。您可以將其配置爲調用可驗證簽入註釋內容的腳本。您可以通過返回非零來拒絕提交。
默認的verifymsg文件包含更多詳細信息。
我想拒絕提交如果預提交失敗*和*日誌消息不*包含「我接受責任」或任何其他。預提交鉤子確保文件是有效的,但如果提交違反規則的文件是必要的,我想確保日誌提及它。我希望能夠在允許提交之前檢查提交的消息*和*提交的文件。 – dreamlax 2009-12-07 03:27:06
問題是,預提交鉤子似乎無法訪問提交消息,以確保將故障驗證記錄爲故意,並且verifymsg掛鉤無法訪問已更改的文件以驗證更改是否符合與規則。 – dreamlax 2009-12-07 03:29:15
你說得對,verifymsg無法獲取正在提交的文件。你必須分開實施它們。所以如果一個失敗,整個提交將失敗。這是否做你想要的? 此外,爲了闡明,據我所知,你不能在預先提交鉤子的實際文件,你只是告訴路徑/名稱。 – 2009-12-07 03:53:32
CVS::Trigger Perl模塊似乎有一個實驗功能,允許在不同觸發器的調用之間緩存值。該頁面明確提到將commitinfo中的文件名傳遞給verifymsg,所以它可以幫助你實現你想要的。
謝謝你。我會去回答這個問題,除非你說的是實驗性的,我需要一些更具體的東西。 – dreamlax 2010-01-18 20:09:54
我一直在處理同樣的問題。到目前爲止,我的最佳解決方案是獲取父進程ID(getppid())並將其用於臨時文件,我可以從commitinfo中放入文件列表。對於verifymsg進程(至少在AIX上),此父ID似乎相同。 祝你好運。
您嘗試過使用什麼版本的CVS?用我的版本,當我在'verifymsg'文件中指定%s時,我沒有收到提交的文件,我仍然只獲取日誌文件。 – dreamlax 2010-01-18 01:12:17
@dreamlax我從來沒有像需要使用'verifymsg',我只使用'loginfo'和'commitinfo',但我想我在網上發現了一些例子,顯示'verifymsg'接受日誌文件和%s。如果這對你不起作用,你可能必須退回到'commitinfo'腳本和'verifymsg'腳本之間的某種通信。 – 2010-01-18 19:52:05
@dreamlax另外,你是否可以同時要求這兩個標準?然後,我使用commitinfo和verifymsg的答案的早期版本可以使用。我想這取決於你是否意味着邏輯**或**或更典型的英語**或**。 – 2010-01-18 19:56:44