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);
爲什麼你需要運行一個單獨的'p4 describe'? 「p4變更-l」是否已經在輸出中包含整個描述? –
是的,這是問題所在。 「bug」部分沒有出現在描述中,這是一些內部增加的功能,我只能用'p4 describe'來獲取。 –
Glebbb
爲什麼你必須在每個更改號碼上調用'p4 describe'? 'p4 describe'接受多個變化數字作爲參數。你應該只能調用一次。 – jamesdlin