2008-10-02 155 views
7

Perforce允許人們檢查未更改的文件。爲什麼任何版本控制系統都會允許這超出我的範圍,但這是另一個問題的話題。我想創建一個觸發器來拒絕提交未更改的文件。但是,我沒有使用Perforce觸發器的經驗。從我讀過的內容來看,我猜這將是一個「更改內容」的觸發器,因爲提交的文件必須根據它們將要替換的相應頭部修訂版進行區分。我需要迭代傳入的文件並確保它們確實已經改變了。問題是,我不知道如何去做。Perforce觸發器拒絕提交未更改的文件?

任何有Perforce觸發體驗的人都可以提供一個例子,或者至少讓我指出正確的方向嗎?

+2

嗨,我偶然發現你去年的問題。只是一個評論:在我看來,創建一個文件的「空白三角洲」(即文件的不變版本)以使p4相信分支上的合併已經通過集成命令發生(即使你沒有合併任何東西,並保持你的分支版本的方式),以便隨後使用integ命令繼續從分支合併到分支不會檢​​測到文件上的衝突 - 因爲P4會相信它是合併過去。如果我錯了,請糾正我,但這是我從基礎培訓課程中瞭解到的。 – 2009-10-20 16:21:06

回答

1

如果您查看Perforce中的觸發器表,您將看到觸發器只是在某種事件發生時被調用的腳本。在你的情況下,更改內容事件被觸發。

您有幾種選擇來編寫與Perforce交互的腳本。 Perforce downloads page具有許多廣泛使用的語言的庫和模塊。任何這些都會幫助你,並大大簡化你需要做的事情。另外,請檢查Perforce Documentation page並下載管理員指南。它將解釋如何創建觸發器等。

基本上,您需要編寫一個腳本,它將從正在提交的更改列表中獲取信息,併爲其中的每個文件運行「diff」命令服務器。如果您發現沒有更改的文件,則需要使提交無效。

您最喜愛的語言和管理員指南上的Perforce模塊將爲您提供所需的所有答案。

5

在最新版本的Perforce公司的允許,防止提交未更改的文件在客戶端設置:

SubmitOptions: Flags to change submit behaviour. 

      submitunchanged   All open files are submitted 
      submitunchanged+reopen (default). 

      revertunchanged   Files that have content or type 
      revertunchanged+reopen changes are submitted. Unchanged 
             files are reverted. 

      leaveunchanged   Files that have content or type 
      leaveunchanged+reopen  changes are submitted. Unchanged 
             files are moved to the default 
             changelist. 

          +reopen  appended to the submit option flag 
             will cause submitted files to be 
             reopened on the default changelist. 

這可能是一個途徑進行調查,如果用戶只是檢查因冷漠不變的文件。

編輯:

既然你要強制的限制,無論用戶的工作空間的設置,那麼你就需要一個觸發在其他的答案建議。

您需要查看Perforce's documentation來了解詳細信息,但需要更改內容觸發器。

您可能想要傳遞%user%以及%change%加上可能的其他變量,以便您可以將昂貴的操作限制爲只有問題用戶。

1

您需要編寫更改內容觸發器。這些觸發器在文件傳輸到服務器之後但在它們被提交到數據庫之前運行。按照Perforce的文檔,可以使用類似於以下

p4 diff //depot/path/[email protected]=<change> 

在改變內容觸發的命令@ =(其中改變被髮送到觸發變更表號)將讓你的內容提交的文件。如果你正在尋找一種方法來檢查對服務器的版本,你也許可以做到像

p4 diff -sr //[email protected]=<change> 

的-sr命令將在打開,並且是與當前庫內容的文件報告。由於這些文件尚未提交,因此我將假定您將實際獲得已將內容傳輸到服務器的文件列表與庫中當前的修訂版本相同。如果p4 diff -sr返回任何相同的文件,則返回一個非零的退出代碼,並且提交將被暫停,用戶將不得不手動恢復其未更改的文件。

我不認爲你想通過爲他做回覆來實際修改更改列表的內容。這聽起來太危險了。

請注意,您可以使用任何有意義的語言編寫觸發器(如前面的提示符所示)。我認爲這種觸發器會變得相當重量級。您將基本上對所有提交給所有用戶的內容執行差異化操作,以便讓一名開發人員順利進行。也許這是一個可以支付的價格,但取決於用戶數量和更改列表(和文件)的大小,這種觸發器可能需要很長時間才能運行。

+0

我爲了降低成本,可以將%user%傳遞給觸發器腳本,然後僅在%user%與問題用戶匹配時才執行代價高昂的更改評估。 – 2008-10-04 11:44:22

1

而不是使用觸發器,您可以編輯他的工作區(假設您具有正確的權限)默認爲避免這種情況的提交策略。默認情況下(我不知道爲什麼)peforce會提交所有選定的文件,即使沒有改變,但可以改變這種行爲。打開他的工作區,並將SubmitOptions下拉菜單設置爲'revertunchanged',這將恢復更改列表中尚未更改的任何文件或'leaveunchanged',這將使它們保持檢出狀態但不提交它們。

如果他只希望看到「提交下拉列表」,也可以在單個更改列表中執行此操作。

我們在我們的環境中遇到了這個問題,但是一旦我向罪犯解釋發生了什麼,以及如何輕鬆地更改默認行爲而不會發生任何問題。

0

以下腳本是在Linux中使用perl腳本完成的。我相信你可以在Windows中使用Perl以外的腳本語言來適應它。

作爲admin用戶,輸入 p4 triggers

將此項添加到腳本的Triggers:行下。

Trigger_name change-content //... "/<path_to_trigger_script>/<script_name> %changelist% %serverhost% %serverport% %user%"

Trigger_name是任意的。 //...表示所有版本化文件,但您可以根據需要進行修改。任何被%包圍的東西都是Perforce特有的特殊變量名,這些將成爲腳本的參數。這些應該是你所需要的。請注意,由<>包圍的任何內容都是可變的,取決於您的環境。

現在,爲腳本本身。這是我寫的。

#!/usr/bin/perl 

# ----- CHECK 1 : Make sure files NOT identical 

# get variables passed in through triggers call 'p4 triggers' 
$ChangeNum = $ARGV[0]; #change number 
$Server = $ARGV[1]; 
$Port = $ARGV[2]; 
$User = $ARGV[3]; 
$p4 = "<path_to_p4_exec>/p4 -p $Port "; 
# get list of files opened under the submitted changelist 
@files = `$p4 opened -a -c $ChangeNum | cut -f1 -d"#"`; 

# go through each file and compare to predecessor 
# although workspace should be configured to not submit unchanged files 
# this is an additional check 
foreach $file (@files) 
{ 
    chomp($file); 
    # get sum of depot file, the #head version 
    $depotSum = `$p4 print -q $file\#head | sum`; 
    # get sum of the recently submitted file, use @=$ChangeNum to do this 
    $clientSum = `$p4 print -q $file\@=$ChangeNum | sum`; 

    chomp $depotSum; 
    chomp $clientSum; 
    # if 2 sums are same, issue error 
    if ($depotSum eq $clientSum) 
    { 
     # make sure this file is opened for edit and not for add/delete 
     if (`$p4 describe $ChangeNum | grep "edit"`) 
     { 
     printf "\nFile $file identical to predecessor!"; 
     exit(1); 
     } 
    } 

} 
0

我們有一個觸發器腳本,首先檢查submitunchanged的客戶端規範的SubmitOptions。如果不存在,則可以退出觸發器腳本,因爲用戶不能提交未更改的文件。否則,我們檢查動作被編輯的所有文件,並且文件類型尚未更改。我們將這些文件與之前的版本進行比較。

0

添加到您的triggers表:

Triggers: 
    myTrigger form-in client "sed -i -e s/submitunchanged/leaveunchanged/ %formfile%" 

這將阻止任何人節省了客戶端與submitunchanged選項,這將反過來很難讓他們提交未更改的文件。