2013-10-22 63 views
1

我的目標是從'p4變更'中爲POST迴應中的給定變更編號提取變更編號/日期/時間/描述。我做了一個簡單的PHP腳本,用於分析必要的shell命令(hacky,但它工作)並填充JSON數組。我可以加快解析perforce變更/描述輸出嗎?

事情做工精細,直到我開始看「P4描述-s」,並在那裏解析出一個特殊的領域,我們列出與changenum相關的錯誤,像這樣:

bug2342狀態固定;

bug2343 state fixed;

腳本必須對每個changenum做一個單獨的'p4 describe',這當然需要一段時間。我看到的響應時間爲30秒以上,範圍爲〜1000個變化號碼:(

我能做些什麼來加速速度? 我甚至想過在前端做兩件事:先把所有changenums,顯示它們(留下錯誤號爲空)然後異步獲取的bug數量在10〜左右的批次中的丟失數據反覆填寫。

$cmd = 'p4 changes -t -s submitted -l //depot/[email protected]' . $changenum1 . ',' . $changenum2 . ' 2>&1 | 
    awk \'BEGIN { RS = "^Change |\n^Change "; FS = "^Change |\n^Change " } {print $1 "::::"}\''; 
$output = shell_exec($cmd); 
$changes = split("::::", trim($output)); 
$cc = array(); 
$i = 0; 
foreach ($changes as $change) { 
if (empty($change)) { 
    continue; 
} 

//example here: '3193358 on 2012/10/08 11:05:42 by [email protected]\n "some lengthy multiline description"' 
$change = trim($change); 
$c = array(); 
$basics = preg_split("/(|\n)/", $change); 
$c["cnum"] = $basics[0]; 
$c["date"] = $basics[2]; 
$c["time"] = $basics[3]; 
$user = $basics[5]; 
$c["user"] = preg_replace('/@.*/', "", $user); 
//echo "cnum: $c["cnum"], date: $c["date"]], time: $c["time"], user: $c["user"]"; 

//THIS IS VERY SLOW 
$cmd2 = 'p4 describe -s ' . $c["cnum"] . ' 2>&1 | egrep "^bug[0-9]+" | sed -re "s/bug([0-9]+).*/\1/"'; 
$output2 = shell_exec($cmd2); 
$bugs = split("\n", trim($output2)); 
$c["bugs"] = $bugs; 

$pos = strpos($change, "\n"); //remove first line 
if ($pos !== false) { 
    $description = substr($change, $pos +1); 
} else { 
    $description = $change; 
} 
//remove multiple whitespace 
$description2 = preg_replace('/\s+/', ' ', $description); 
//remove blank new lines etc 
$description3 = preg_replace('/^\n+|^[\t\s]*\n+/m', "", $description2); 

$c["desc"] = trim($description3); 
$cc[$i++] = $c; 
} 

$output = __json_encode($cc); 
+0

爲什麼你需要運行一個單獨的'p4 describe'? 「p4變更-l」是否已經在輸出中包含整個描述? –

+0

是的,這是問題所在。 「bug 」部分沒有出現在描述中,這是一些內部增加的功能,我只能用'p4 describe'來獲取。 – Glebbb

+2

爲什麼你必須在每個更改號碼上調用'p4 describe'? 'p4 describe'接受多個變化數字作爲參數。你應該只能調用一次。 – jamesdlin

回答

2

你不應該需要分別援引p4 describe每個變化號碼(從而進行多次往返Perforce服務器); p4 describe命令接受多個更改號作爲參數,因此您應該能夠調用它只有一次,例如:

p4 describe -s 100 101 102 103 
相關問題