Perforceの絡むバッチ処理を書いていると特定のチェンジリストが空かを確認したい場合が多々発生します。
特に下記のように特定の処理後の生成物をreconcileでチェンジリストに追加してsubmitすることが多いです。
<何かしらのビルド処理>
p4 reconcile
p4 submit
しかし、定期実行を行っていると生成物の変化がなくreconcileの実行結果で
no file(s) to reconcile.
となる場合があります。
p4 reconcileはそれで問題なく通過できるのですが、チェンジリストが空の状態でp4 submitを実行すると
No files to submit from the default changelist.
と表示されエラーとなってしまいます。
エラーを握りつぶすこと自体は可能なのですが、このエラー以外の発生も握りつぶしてしまうため、チェンジリストが空でない場合のみsubmitを実行したいです。
p4コマンドで素直に確認する方法が調べた感じ見つからなかったので何かしら工夫が必要そうです。
(スクリプト言語などで解析する方法が楽ではあるかもしれないのですが、今回は実行環境に出来るだけ依存しない形にしたかったのでbatのみで対応しています)
対応してみたコードは下記になります。
<何かしらのビルド処理>
p4 reconcile
for /f %%A in('p4 -ztag opened -c default -m 1') do set aaa=%%A
if "%aaa%" == "" (
echo "Skip submit."
) else (
echo "Execute submit."
p4 submit
)
p4 openedで指定のチェンジリストに含まれるファイルの情報を取得します。
内容は特に全チェックは不要で1ファイルでも含まれているか確認したいので-m 1
で個数を制限します。
通常だと、チェンジリストが空の場合、
File(s) not opened on this client.
とログが表示されます。
-ztag
を付与すると空の場合は何も表示されません。
(そのため、ログのチェックが楽になります)
そのログをfor文で変数取得することで文字列が空かどうかでチェンジリストの状況を確認することが出来ます。
これでなんとかエラー回避ができました。
p4コマンドでスマートに確認する方法ってあるんでしょうかね?