1

私の目標は、POST 応答で指定された changenumbers の範囲の「p4 changes」から changenumber/date/time/description を抽出することです。必要なシェル コマンドを解析し (ハックですが動作します)、JSON 配列を設定する単純な PHP スクリプトを作成しました。

'p4 describe -s' を調べて、changenum に関連付けられたバグを一覧表示する特別なフィールドを解析するまでは、問題なく動作します。次のようにします。

bug2342 の状態が修正されました。

bug2343 の状態が修正されました。

スクリプトは、changenum ごとに個別の 'p4 describe' を実行する必要がありますが、もちろん時間がかかります。~1000 の変更番号の範囲で 30 秒以上の応答時間が見られます :(

物事をスピードアップするためにできることはありますか? フロント エンドで 2 パスを実行することも考えています。最初にすべての changenum を取得し、それらを表示し (バグ ID を空白のままにします)、次に非同期でバグ番号を ~10 程度のバッチで取得し、不足しているデータを繰り返し埋めます。

$cmd = 'p4 changes -t -s submitted -l //depot/...@' . $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 user@client\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);
4

1 に答える 1