1

任意のファイルの p4 プリントを取得するために、クライアント スペックではなくストリーム スペックのみを使用して、正しく「解決された」ファイルを見つける方法を探しています。

例えば、

メインストリームにはファイルがあります

//toto/main/file.txt  

2 番目のストリーム//toto/test/は、次の仕様を使用してメイン ストリームを親とするタスク ストリームです。

share ...

を使用してストリームテストでtoto.txtを見つけて印刷しようとすると

p4 print //toto/test/file.txt

さまざまな要因に応じて、さまざまな出力を受け取ります。

  • ファイルがテスト ストリームで送信されなかった場合

    • 適切なストリームで (-c Client_Test またはクライアントを設定する他の方法を使用して) クライアントにいる場合、ファイルは p4 によって検索され、正しく出力されます。

    • クライアントを指定していない場合、または使用するクライアントに関する指示を p4 に与えていない場合、次のエラーが表示されます。

//toto/test/file.txt - そのようなファイルはありません。

  • ファイルがテスト ストリームで送信された場合、ファイルは正しく検索され、印刷されます。

私の目標は、ワークスペースを使用せずに任意のファイルを印刷できるようにすることです。私が正しく理解したように、ストリーム仕様はストリーム階層内のファイルを見つけることができるはずです。

ファイルがそこに存在する場合、コマンドを使用して、親ストリームを再帰的に調べることができます

p4 print //toto/main/file.txt

ただし、ファイル「file.txt」が次のマッピングを持つ別のストリームから来ている場合、そのソリューションは機能しません。

import file.txt //toto/otherTaskStream/file.txt

作業するクライアント (ワークスペース) を指定せずにこの種のファイルを見つける方法はないようです (残念ながら、これは私たちの環境では受け入れられる解決策ではありません)。

4

1 に答える 1

0

あなたの主な関心事は、これを可能な限り効率的に行うこと (サーバーへの影響を最小限に抑え、スクリプトを最小限に抑えること) であることを考えると、次のことをお勧めします。

p4 -c Client_Test client -s -S //toto/test
p4 -c Client_Test print //Client_Test/file.txt

「client -s」コマンドは、ファイルの内容やファイルのメタデータを操作しないため、サーバーのオーバーヘッドはほとんどありません。ストリームがテンプレートを形成する「ビュー」を作成するだけであり、そのストリームのコンテキストで作業しているデポファイルを定義することにより、他のコマンドを実行するためのコンテキストを提供します。これにより、"//Client_Test/file.txt" 構文が、タスク ストリームの "シャドウ テーブル"、デポの公開部分、または別のストリームからのインポートのいずれにあるかに関係なく、正しいファイルにマップされます。親ストリーム内の再マップされたパスなど。

哲学的な理由でクライアント仕様を使用しないことに決めた場合は、次のようにすることができます。

p4 -c nonexistentclientspec client -o -S //toto/test

これにより、実際にデータベースにクライアント仕様を作成せずにクライアント ビューが表示されます。PerforceスクリプトAPIの1つを使用すると、「View」フィールドをキャプチャしてMapオブジェクトに変換するのはそれほど難しくありません.いくつかの困難を伴います。

「p4 client」コマンドを使用して架空のクライアント ビューを表示することさえ哲学的に禁止されている場合、次善の策はストリーム仕様自体を解析することです。もちろん、ストリーム スペックからビューを生成するための決定論的システムがあるため、このシステムを自分で再実装することもできますが、かなりの困難が伴います。

ただし、主な関心事が効率と使いやすさである場合は、クライアント仕様の使用をお勧めします。サーバーのオーバーヘッドについてまだ懐疑的である場合は、「-Ztrack」を指定してこれらのコマンドを実行し、実行する必要がある作業がどれだけ少ないかを確認してください。

C:\p4\test>p4 -Ztrack -c Client_Test client -s -S //stream/task
Client Client_Test switched.
--- lapse .015s
--- rpc msgs/size in+out 0+1/0mb+0mb himarks 2000/2000 snd/rcv .000s/.000s
--- db.user
---   pages in+out+cached 3+0+2
---   locks read/write 1/0 rows get+pos+scan put+del 1+0+0 0+0
--- db.group
---   pages in+out+cached 3+0+2
---   locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.stream
---   pages in+out+cached 7+0+2
---   locks read/write 5/0 rows get+pos+scan put+del 1+11+11 0+0
--- db.domain
---   pages in+out+cached 14+8+2
---   locks read/write 8/2 rows get+pos+scan put+del 10+0+0 2+0
--- db.template
---   pages in+out+cached 8+0+2
---   locks read/write 6/0 rows get+pos+scan put+del 0+6+12 0+0
--- db.view
---   pages in+out+cached 6+4+2
---   locks read/write 2/1 rows get+pos+scan put+del 0+2+4 1+1
--- db.have
---   pages in+out+cached 3+0+2
---   locks read/write 0/0 rows get+pos+scan put+del 0+1+1 0+0
---   peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
--- db.working
---   pages in+out+cached 5+0+2
---   locks read/write 2/0 rows get+pos+scan put+del 0+3+3 0+0
---   peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
--- db.trigger
---   pages in+out+cached 3+0+2
---   locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.bodtext
---   pages in+out+cached 3+0+2
---   locks read/write 1/0 rows get+pos+scan put+del 2+0+0 0+0
--- db.protect
---   pages in+out+cached 3+0+2
---   locks read/write 1/0 rows get+pos+scan put+del 0+1+3 0+0
--- db.monitor
---   pages in+out+cached 6+6+2
---   locks read/write 0/2 rows get+pos+scan put+del 0+0+0 2+0

実際のクライアント スイッチでは、データベース エントリが 1 つだけ書き換えられていることに注意してください。オーバーヘッドの大部分は、認証と出力に関連する基本的に無視できる量です (成功したことを示す 1 行)。

于 2015-06-03T15:21:47.693 に答える