2011-10-18 33 views
1

能否寫一個perforce觸發器在提交時自動刪除空格?最好在python中?那將是什麼樣子?或者你可以不修改文件,因爲他們正在提交?觸發器自動刪除EOL空格?

+0

我不太瞭解perforce,但[文檔] (http://www.perforce.com/perforce/r10.2/manuals/cmdref/triggers.html)顯示它是可能的。你需要編寫一個調用python函數'rstrip()'[[docs](http://docs.python.org/library/stdtypes.html#str.rstrip)]的腳本,然後使用'change-content'觸發器類型。 – brc

+1

我會小心的做這樣的事情自動......你不想從任何人的意圖剝離空白。 (誠​​然,這是一個奇怪的例子,除非你用空格編程,或者熱衷於去除二進制文件)。如果你確實走這條路線,警告他們並向他們展示你所做的改變的差異,這樣他們可以驗證它是好的。 – Thanatos

回答

0

據我所知,這不能完成,因爲你不能把修改過的文件內容放回服務器。允許您使用p4 print查看文件內容的唯一兩個trigger typeschange-contentchange-commit。對於後者,這些文件已經在服務器和前者上提交,而您可以看到(未提交的)文件內容,但無法對其進行修改並將其放回服務器上。

唯一可能的觸發器是拒絕要提交EOL空白的文件,以便提交者可以自行修復文件。這裏是一個類似的檢查文件中的選項卡的摘錄,請閱讀關於觸發器的文件,並看看Perforce網站的例子:

def fail(sComment): 
    print sComment 
    sys.exit(1) 
    return 

sCmd = "p4 -G files //sw/[email protected]=%s" % sChangeNr 

stream = os.popen(sCmd, 'rb') 
dictResult = [] 
try: 
    while 1: 
    dictResult.append(marshal.load(stream)) 
except EOFError: 
    pass 

stream.close() 


failures = [] 
# check all files for tabs 
for element in dictResult: 
    depotFile = element['depotFile'] 

sCmd = "p4 print -q %[email protected]=%s" % (depotFile,sChangeNr) 
content = os.popen(sCmd, 'rb').read() 
if content.find('\t') != -1: 
    failures.append(depotFile) 

if len(failures) != 0: 
    error = "Files contain tabulators (instead of spaces):\n" 
    for i in failures: 
    error = error + str(i) + "\n" 
    fail(error) 
+0

這是我懷疑的。在這種情況下,我認爲我要做的是在運行預先提交測試的客戶端上編寫一個p4包裝器,這可以是其中之一。 –

+0

@jhwist我知道這是一個古老的問題,但我被上面的腳本弄糊塗了。它不會總是返回1,因此總是無法提交(意味着無法將文件提交到p4服務器)。你也不需要導入os,sys?還有sChangeNr被定義在哪裏? – Lorenz03Tx

+0

@ Lorenz03Tx爲了簡潔起見,我遺漏了很多樣板。 – jhwist