Perforce触发器拒绝提交未更改的文件?

时间:2020-03-06 15:01:28  来源:igfitidea点击:

Perforce允许人们签入未更改的文件。为什么任何版本控制系统都允许这样做呢,但这是另一个问题。我想创建一个触发器,该触发器将拒绝提交未更改的文件。但是,我没有Perforce触发器的经验。根据我的阅读,我猜想这将是一个"更改内容"触发器,因为提交的文件必须与它们将要替换的相应头部修订版进行区分。我需要遍历传入的文件,并确保它们确实已更改。问题是,我不知道如何去做。

任何具有Perforce触发经验的人都可以提供示例或者至少为我指明正确的方向吗?

解决方案

如果查看Perforce中的Triggers表,我们将看到触发器不过是在发生某种事件时被调用的脚本。在情况下,更改内容事件将被触发。

我们有几种选择来编写与Perforce交互的脚本。 Perforce下载页面包含适用于多种广泛使用语言的库和模块。这些都可以为我们提供帮助,并大大简化工作。另外,请检查" Perforce文档"页面并下载管理员指南。它将说明如何创建触发器等。

基本上,我们需要编写一个脚本,该脚本将从正在提交的更改列表中获取信息,并对其中的每个文件在服务器上运行" diff"命令。如果找到未更改的文件,则需要使提交无效。

我们喜欢的语言上的Perforce模块和《管理员指南》将为我们提供所需的所有答案。

在最新版本的perforce中,允许进行客户端设置,以防止提交未更改的文件:

SubmitOptions:  Flags to change submit behaviour.

            submitunchanged           All open files are submitted
            submitunchanged+reopen    (default).

            revertunchanged           Files that have content or type
            revertunchanged+reopen    changes are submitted. Unchanged
                                      files are reverted.

            leaveunchanged            Files that have content or type
            leaveunchanged+reopen     changes are submitted. Unchanged
                                      files are moved to the default
                                      changelist.

                          +reopen     appended to the submit option flag
                                      will cause submitted files to be
                                      reopened on the default changelist.

这可能是调查用户是否只是由于冷漠而只检查未更改的文件的途径。

编辑:

考虑到无论用户的工作区设置如何,我们都想强制执行该限制,那么我们将需要一个如其他答案中所建议的触发器。

我们需要查看Perforce的文档来制定详细信息,但是我们需要一个变更内容触发器。

我们可能需要传入%user%以及%change%以及其他可能的变量,以便将昂贵的操作限制为仅问题用户。

我们将要编写一个更改内容触发器。这些触发器在文件传输到服务器之后但在提交给数据库之前运行。根据perforce文档,我们可以使用类似于以下内容的命令

p4 diff //depot/path/...@=<change>

在更改内容触发器中,@ =(更改是发送到触发器的更改列表编号)将为我们提供已提交文件的内容。如果我们正在寻找一种对照服务器版本的方法,则可以执行以下操作

p4 diff -sr //...@=<change>

-sr命令将报告打开的文件,这些文件与当前软件仓库的内容相同。由于尚未提交文件,因此我将假定我们实际上将获得文件列表,这些文件的内容已传输到服务器,并且与软件仓库中的当前主修订版相同。如果p4 diff -sr返回相同的任何文件,则返回非零退出代码,提交将被暂停,并且用户将必须手动还原其未更改的文件。

我认为我们实际上不想通过为他执行还原来修改变更列表的内容。听起来太危险了。

请注意,我们可以使用任何有意义的语言编写触发器(如先前的海报所建议)。我确实认为这种触发将是非常沉重的。本质上,我们将对所有用户提交的所有内容进行差异化处理,以使一个开发人员步入一致。也许这是一个合理的价格,但是取决于用户数量及其更改列表(和文件)的大小,这种触发器可能需要很长时间才能运行。

我们可以编辑他的工作区(假设我们具有正确的权限),而不使用触发器,以默认使用避免这种情况的提交策略。默认情况下(同样我也不知道为什么),peforce将提交所有选定的文件,即使它们没有更改,也可以更改此行为。打开他的工作区,然后将SubmitOptions下拉列表设置为" revertunchanged"(将还原变更列表中的所有未更改文件)或者" leaveunchanged"(将使其保留签出但不提交)。

如果他只希望查看"提交时"下拉列表,也可以对单个变更列表提交进行此操作。

我们在环境中遇到了这个问题,但是一旦我向违法者解释了发生了什么,以及更改他们没有任何问题的默认行为的难易程度。