PerforceSourceControlについて、非排他binary(例:binary+w)ファイルを他ユーザーがチェックアウト中にISourceControlState::CanCheckout() がfalseを返す件について

概要

Perforceのtypemapで排他ロック(+l)なしのバイナリファイルを運用しています。Perforceの仕様上は、+lが付いていなければ複数ワークスペースから同時にp4 editが可能です。

しかしSourceControlモジュールのPerforce実装では、他ユーザーがチェックアウト中(CheckedOutOther)のとき、該当ファイルがbinaryであるだけでISourceControlState::CanCheckout()(実装は FPerforceSourceControlState::CanCheckout())がfalseを返しチェックアウトできません。これは意図した制限でしょうか?

該当コード

PerforceSourceControlState.cpp の FPerforceSourceControlState::CanCheckout() 内に if (!bBinary && !bExclusiveCheckout) という分岐があり、binaryであるだけでelseの分岐に入るため、CheckedOutOtherの時にbCanDoCheckoutがfalseとなります。

テキストファイルは+l修飾が付いていないファイルタイプの場合 !bBinary && !bExclusiveCheckout に該当するため、CheckedOutOtherでもtrueが返されますが、非排他的なバイナリは常にfalseになります。

運用上の背景

該当の .abc は 自動生成バイナリファイルで、常に最新で上書きされても問題ありませんが、CIからUEコマンドレット経由でSourceControlモジュールのAPIを呼び出しチェックアウトしようとすると失敗します。

質問

binaryかつ非排他(+l なし)の場合でも、他ユーザーがチェックアウト中は CanCheckout() がfalseにするというのは意図した設計でしょうか?

もし意図した設計であれば、自動生成バイナリのように「排他不要・常に上書き可」のファイルをUEのSourceControlで扱うための推奨設定/ワークフローはありますか?(例:特定拡張子を非排他バイナリとして扱うオプションや、CanCheckout()の判定を上書きする拡張など)

意図したものではない場合、!bExclusiveCheckout を優先する(+l でなければ CheckedOutOther でも許可する)等の修正は検討可能でしょうか?あるいはエディタ側からこの挙動を設定で切り替えられるようにする予定はありますか?

ご確認のほど、よろしくお願いいたします。

再現手順
typemap に以下のような非排他のバイナリ型を設定

binary+S8w //…/project/…/*.abc

クライアントワークスペースAで当該ファイルをチェックアウト。

クライアントワークスペースBでUSourceControlHelpers::CheckOutFileで同ファイルのチェックアウトを試行。

実際の結果:CanCheckout() が false を返し、チェックアウトできない。

期待する結果:+l が付いていないため、Perforce の仕様どおりクライアントワークスペースでチェックアウト中でもチェックアウト可能。

お世話になっております。

UEのPerforceプラグインは、すべてのバイナリファイルをシングルライターとして扱います。他のユーザーがすでにバイナリをチェックアウトしている場合、ファイルタイプに+lが付与されていなくてもCanCheckout()はfalseを返します。これは意図的な安全策であり、バイナリはマージできないためです。この挙動は、+lが付与されていないファイルに対して複数のオープンを許可する素のPerforceよりも厳格です。

もし本当にPerforce本来の挙動が必要であれば、Unrealのレイヤーではなく、直接Perforce/P4Vを使用することを推奨します。

お手数ですが、よろしくお願いします。

承知しました。

回答ありがとうございます。