1

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

例如,

主流有文件

//toto/main/file.txt  

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

share ...

当我尝试在流测试中使用

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 之一,捕获“视图”字段然后将其转换为 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

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

于 2015-06-03T15:21:47.693 回答