2015-06-02 30 views
1

爲了獲得任意文件的p4打印,我正在尋找一種方法來僅使用流規範找到正確的「已解析」文件,而不是客戶端之一。只使用任務流規範在流庫中找到文件

例如,

主要流有一個文件

//toto/main/file.txt 

二流// TOTO /測試/是使用以下規格

share ... 
父到主要流的任務流

當我試圖找到並打印流中的toto.txt 測試使用

p4 print //toto/test/file.txt 

根據不同的因素我收到不同的輸出。

  • 如果文件從未被測試流

    • 如果我在一個客戶端提交(使用-c Client_Test或任何其他方式來設置客戶端)的權利流,該文件位於p4並正確打印。

    • 如果我不指定客戶端,或者不給P4關於它應該使用的客戶端的任何指示,我收到以下錯誤

// TOTO /測試/ file.txt - 沒有這樣的文件。

  • 如果文件提交關於測試流,該文件位於和正確地打印。

我的目標是能夠在不使用工作區的情況下打印任意文件,就像我理解正確一樣,流規格應該能夠在流層次結構中找到文件。

我可以嘗試一下遞歸父流中,如果該文件是存在那裏,用命令

p4 print //toto/main/file.txt 

但這種解決辦法將不會在文件「文件的情況下。TXT」從另一個流來與以下映射

import file.txt //toto/otherTaskStream/file.txt 

似乎沒有辦法以找到此類型的文件,而無需指定的客戶機(工作區)一起工作(不幸的是未處於可接受的解決方案我們的環境在)

+1

你能否澄清爲什麼你無法使用客戶端規範?這個問題的解決方案基本上是「實現客戶端規範的等價物」,這是可行的......但考慮到Perforce已經實現了這個東西(即客戶端規範),那麼使用它會更容易。 –

+0

由於您知道任務流的名稱,您嘗試打印的文件的名稱可能只有您用於此打印工具的客戶端工作區,然後執行'p4 client -s -S // toto/test'或'p4 client -s -S // tot/otherTaskStream',然後再運行'p4 print'。 –

+0

@SamStafford在持續集成系統中,我希望服務器不需要工作空間就可以查看文件。即使我使用工作區,「切換流 - 查看文件」週期至少會浪費時間,最壞的情況是將無用的壓力施加到P4服務器上。 – Jibai

回答

0

鑑於你最關心的是儘可能有效地做到這一點越好(服務器和最小腳本的影響最小),我建議做以下幾點:

p4 -c Client_Test client -s -S //toto/test 
p4 -c Client_Test print //Client_Test/file.txt 

的「客戶-s 「命令沒有可觀的服務器因爲它不處理任何文件內容甚至任何文件元數據;它只是創建流形成模板的「視圖」,然後通過在該流的上下文中定義您正在使用的庫文件來提供運行其他命令的上下文。這是什麼使得「//Client_Test/file.txt」語法映射到正確的文件,無論它是在任務流的「影子表」中,還是在depot的公共可見部分,或從另一個流導入,或者父流中的重映射路徑等。

如果出於哲學的原因,你堅決不使用客戶端的規格,你可以這樣做:

p4 -c nonexistentclientspec client -o -S //toto/test 

這將告訴你,而不實際創建數據庫中的客戶端規格的客戶視圖。使用其中一個Perforce腳本API,捕獲「視圖」字段並將其轉換爲Map對象並不困難 - 這就是您如何確定導入來自哪裏,允許您處理您提到的異常,有一些困難。

如果您在哲學上阻止通過「p4 client」命令查看假想客戶端視圖,那麼您的下一個最佳選擇是解析流規範本身;當然有一個確定性的系統可以從流規格中產生一個視圖,所以你可以自己重新實現這個系統,而且難度更大。但是,如果主要問題是效率和易用性,我會建議使用客戶端規格。如果你還在懷疑的服務器開銷,運行帶有「-Ztrack」這些命令,看看他們需要做的多麼少的工作,如:

C:\p4\test>p4 -Ztrack -c Client_Test client -s -S //stream/task 
Client Client_Test switched. 
--- lapse .015s 
--- rpc msgs/size in+out 0+1/0mb+0mb himarks 2000/2000 snd/rcv .000s/.000s 
--- db.user 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 1+0+0 0+0 
--- db.group 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0 
--- db.stream 
--- pages in+out+cached 7+0+2 
--- locks read/write 5/0 rows get+pos+scan put+del 1+11+11 0+0 
--- db.domain 
--- pages in+out+cached 14+8+2 
--- locks read/write 8/2 rows get+pos+scan put+del 10+0+0 2+0 
--- db.template 
--- pages in+out+cached 8+0+2 
--- locks read/write 6/0 rows get+pos+scan put+del 0+6+12 0+0 
--- db.view 
--- pages in+out+cached 6+4+2 
--- locks read/write 2/1 rows get+pos+scan put+del 0+2+4 1+1 
--- db.have 
--- pages in+out+cached 3+0+2 
--- locks read/write 0/0 rows get+pos+scan put+del 0+1+1 0+0 
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms 
--- db.working 
--- pages in+out+cached 5+0+2 
--- locks read/write 2/0 rows get+pos+scan put+del 0+3+3 0+0 
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms 
--- db.trigger 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0 
--- db.bodtext 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 2+0+0 0+0 
--- db.protect 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+3 0+0 
--- db.monitor 
--- pages in+out+cached 6+6+2 
--- locks read/write 0/2 rows get+pos+scan put+del 0+0+0 2+0 

請注意,只有一個單一的數據庫條目被改寫爲實際客戶端切換;大量的開銷是基本上可以忽略的與認證和輸出相關的數量(單行告訴我它成功了)。

+0

非常感謝您的確切答案。我將研究在API解決方案中創建地圖。避免使用客戶端的主要原因正如我在Continuous Build System上下文中所說的,服務器可能負責在多線程環境中以高頻率檢查給定文件。我想我可以想出一個方法來完成純粹的服務器端操作,以避免在切換流時出現爭用條件或鎖定,然後只在一個工作區中查找文件。 (並且避免創建數十個未初始化的工作空間,僅用於定位和打印/格式化文件)。 – Jibai

+0

在你描述的情況下,我只在每個流上有一個專用(空)客戶端 - 「p4 print」命令不會影響客戶端狀態,所以多個用戶/線程可以針對一個客戶端運行「p4 print」命令彼此踩着。空客戶非常小,因此每個流有一個用於此目的沒有太多的開銷(顯然,與流本身相比,它是微不足道的)。您可能也對「sync -p」命令感興趣,該命令專門用於您描述的用例... –