Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perforce 仅使用任务流规范在流仓库中查找文件_Perforce_Perforce Stream - Fatal编程技术网

Perforce 仅使用任务流规范在流仓库中查找文件

Perforce 仅使用任务流规范在流仓库中查找文件,perforce,perforce-stream,Perforce,Perforce Stream,为了获得任意文件的p4打印,我正在寻找一种方法,仅使用流规范而不是客户端规范来定位正确的“已解析”文件 比如说, 主流有一个文件 //toto/main/file.txt 第二个流//toto/test/是一个任务流,使用以下规范作为主流的父流 share ... 当我尝试在流test中查找并打印toto.txt时,使用 p4 print //toto/test/file.txt 我根据不同的因素接收不同的输出 如果文件从未在测试流中提交 如果我在正确流中的客户机中(使用-c cl

为了获得任意文件的p4打印,我正在寻找一种方法,仅使用流规范而不是客户端规范来定位正确的“已解析”文件

比如说,

主流有一个文件

//toto/main/file.txt  
第二个流//toto/test/是一个任务流,使用以下规范作为主流的父流

share ...
当我尝试在流test中查找并打印toto.txt时,使用

p4 print //toto/test/file.txt
我根据不同的因素接收不同的输出

  • 如果文件从未在测试流中提交

    • 如果我在正确流中的客户机中(使用-c client_Test或任何其他方式设置客户机),则该文件由p4定位并正确打印

    • 如果我没有指定客户机,或者没有给p4任何关于它应该使用哪个客户机的指示,我会收到以下错误

//toto/test/file.txt-无此类文件

  • 如果文件是在测试流上提交的,则文件的位置和打印正确
我的目标是能够在不使用工作区的情况下打印任意文件,就好像我理解正确一样,stream spec应该能够在streams层次结构中定位文件

我可以尝试使用命令递归地查看父流(如果存在文件)

p4 print //toto/main/file.txt
但是,如果文件“file.txt”来自具有以下映射的另一个流,则该解决方案将不起作用

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

如果不指定要使用的客户端(工作区)(不幸的是,这在我们的环境中不是一个可接受的解决方案),似乎无法定位此类文件,因为您最关心的是尽可能高效地执行此操作(对服务器的影响最小,脚本编写也最少),我建议采取以下措施:

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,捕获“视图”字段并将其转换为映射对象并不太困难——这就是您如何确定导入的来源,从而允许您处理您提到的异常,但有些困难

如果您甚至无法通过“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

请注意,对于实际的客户端交换机,只重写了一个数据库条目;大部分开销是与身份验证和输出相关的基本上可以忽略不计的金额(这一行告诉我它成功了)。

鉴于您主要关心的是尽可能高效地执行此操作(将对服务器的影响降至最低,并将脚本编写降至最低),我建议您执行以下操作:

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,捕获“视图”字段并将其转换为映射对象并不太困难——这就是您如何确定导入的来源,从而允许您处理您提到的异常,但有些困难

如果您甚至无法通过“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

请注意,对于实际的客户端交换机,只重写了一个数据库条目;大部分开销是与身份验证和输出相关的基本上可以忽略不计的金额(这一行告诉我它成功了)。

您能澄清一下为什么不能使用客户端规范吗?这个问题的解决方案基本上是“实现客户机规范的等价物”,即