仅使用任务流规范

时间:2015-06-02 13:36:13

标签: perforce perforce-stream

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

例如,

主流有一个文件

//toto/main/file.txt  

第二个流 // 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

在没有指定要使用的客户端(工作空间)的情况下,似乎无法找到此类文件(不幸的是,这在我们的环境中不是可接受的解决方案)

1 个答案:

答案 0 :(得分:0)

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

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

"客户-s"命令没有明显的服务器开销,因为它不操纵任何文件内容甚至任何文件元数据;它只是创建了"视图"流形成模板,通过定义您在该流的上下文中使用哪些库文件来提供运行其他命令的上下文。这就是" // Client_Test / file.txt"语法映射到正确的文件是否在"影子表"任务流,或软件仓库的可公开查看部分,或从另一个流导入,或父流中的重新映射路径等等。

如果出于哲学原因,您决定不使用客户规范,您可以这样做:

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

这将显示客户端视图,而无需在数据库中实际创建客户端规范。使用其中一个Perforce脚本API,捕获" View"并不困难。字段然后将其转换为Map对象 - 这就是您如何确定导入来自哪里,允许您处理您提到的异常,但有些困难。

如果您在哲学上被阻止甚至通过" p4客户端查看假设的客户端视图"命令,你的下一个最佳选择是解析流规范本身;当然还有一个确定性的系统,用于根据流规范生成视图,因此您可以自己重新实现此系统,但难度更大。

但是,如果主要关注的是效率和易用性,我建议使用客户端规范。如果您仍然对服务器开销持怀疑态度,请使用" -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

请注意,实际客户端切换只重写了一个数据库条目;大部分开销是与认证和输出相关的基本上可以忽略的数量(单行告诉我它成功了。)