在提交前通过Perforce触发器更新文件

1 投票
3 回答
1410 浏览
提问于 2025-04-18 09:21

我知道这个问题其实已经被问过了,但之前的问题没有明确的答案,所以请耐心听我说。

背景:在我们公司,我们使用Perforce的提交编号来进行版本管理。不管这种方法是否正确,反正就是这样。目前,很多开发者会分别提交代码和文档:先提交代码,然后再提交文档,以更新客户端的文档,告诉用户新版本的编号。我想简化这个过程。

我的想法是:创建一个Perforce触发器(在服务器端运行),它会扫描提交的文档文件(比如.txt),寻找一个独特的词(比如#####PERFORCE##CHANGELIST##NUMBER###ROFL###LOL###WHATEVER#####),然后把它替换成提交时的变更列表编号。我已经知道如何确定这个值。我现在搞不清楚的是,如何或者在哪里更新这些文件。

我已经确定使用change-content触发器(不管是否可行),它是在

"变更列表创建和文件传输后,但在提交到数据库之前触发的",

这是正确的方向。在这个时候,文件需要在服务器上存在。我该如何从一个Python脚本中确定这些文件的(临时?)位置,以便我可以更新或使用sed来替换占位符值为实际值?我找到的Perforce在线文档并没有明确说明这是否可能,或者在这个阶段提交的机制是如何工作的。

编辑

基本上,我想要的是类似RCS的功能,但没有那些难看的特殊字符序列。经过更多的挖掘,我发现我问的其实和这个问题是一样的。不过我相信这是可能的,因为触发器是在服务器端运行的,而文件已经被传输到服务器。因此,脚本应该能够访问这些文件。

示例

考虑以下来自发布说明文档的片段:

[#####PERFORCE##CHANGELIST##NUMBER###ROFL###LOL###WHATEVER#####] Added a cool new feature.  Early retirement is in sight.
[52702] Fixed a really annoying bug.  Many lives saved.
[52686] Fixed an annoying bug.

这就是用户提交的内容。我希望触发器在提交过程中拦截这个文件(如前所述,在change-content阶段),并将其修改,使得最终存储在Perforce中的内容看起来像这样:

[52738] Added a cool new feature.  Early retirement is in sight.
[52702] Fixed a really annoying bug.  Many lives saved.
[52686] Fixed an annoying bug.

其中52738是用户提交的最终变更列表编号。(如前所述,我已经可以确定这个编号,所以请不要纠结于这一点。)也就是说,用户在Perforce客户端控制台上看到的是。

Changelist 52733 renamed 52738.
Submitted change 52738.

3 个回答

0

我在编程的早期就学到了一件事,那就是尽量避免在中断级别(也就是系统处理紧急任务的状态)下进行操作,尤其是不要在中断中做那些可能会让系统卡住的事情。我完全理解你想要按顺序处理内部标记,但更好的方法可能是在触发事件时先设置好编辑,然后让一个后续的工具来进行文件修改。

如果我理解错了,请纠正我,但在提交文件更改的过程中试图进行文件修改,这似乎有点自相矛盾,或者说是递归的感觉。也许更好的做法是准备一个单独的更改列表,用来记录日志。这样你总是能知道那个文件在你本地文件空间的哪个位置。话虽如此,ktext 文件和 $ 字段可能会有所帮助。

0

99w,

我已经把你加入到一个已有的功能改进请求中,内容是关于可自定义的RCS关键字,还有你提供的例子。

除了使用一个后命令触发器直接编辑存档内容,然后在数据库中更新校验和,目前没有其他方法可以用自定义的最终变更列表编号来更新文件内容。

1

我想更清楚地了解你想要实现的目标,以便看看是否有其他方法可以做到你想要的事情。

根据你想做的事情,你可能需要考虑使用“暂存”( http://www.perforce.com/perforce/doc.current/manuals/p4guide/chapter.files.html#d0e5537 )。

另外,我可以把你的信息添加到一个现有的Perforce增强请求中,这个请求是关于在提交之前修改客户端文件的客户端触发器。如果这个功能实现了,你会收到邮件通知。

撰写回答