16

我想禁止更改的作者查看他/她自己在中的更改。我知道这个建议的 hack,但这并不能真正解决问题。

现在我从 gerrit 问题中了解到,gerrit 的硬编码规则可以通过自定义 prolog 代码进行修改,因此应该可以根据需要修改工作流。但是,我之前从未修改过 gerrit 的工作流程,而且我对了解不多。

有没有人有一个使用这个 prolog 引擎的 gerrit 自定义规则的小工作示例?

我很乐意接受如何禁止作者进行自我审查的其他替代方案,因为它们不需要我的团队更改当前的工作流程。

4

4 回答 4

6

我在这个 google 组中找到了一个非常简单的答案:groups.google.com/disable-self-review

在父项目(默认为 All-Projects 项目)中,将其添加到 refs/meta/config 分支的 project.config 文件中:

[access "refs/*"]
label-Code-Review = block -2..+2 group Change Owner

并在同一分支的组文件中添加此行

global:Change-Owner Change Owner

然后将允许权限的语句放入子项目的project.config中:

label-Code-Review = -2..+2 group Developers

确保在父项目中编写块语句并在子项目中赋予权限。如果允许和阻止在同一个文件中,则允许将否决(请参阅this)。这将阻止更改的所有者给予 -2 或 +2。它将保持 -1 和 +1 选项不变。您可以为可能使用的任何其他自定义标签添加类似的声明。

于 2017-12-19T13:05:35.467 回答
3

我不确定这是否是您正在寻找的东西,但它可能会给您一些启发。根据此讨论,以下片段仅在审阅者和更改所有者不是同一个人时才批准更改。

  % If a reviewer approved the change, its OK.
  submit_rule(submit(CR)) :-
    change_owner(Owner),
    max_with_block('Code-Review', -2, 2, ok(Reviewer)),
    not_same(Owner, Reviewer),
    CR = label('Code-Review', ok(Reviewer)),
    !.
于 2012-07-22T08:43:19.683 回答
3

如果您还没有找到它,这里是有关如何使用 prolog 执行此操作的官方说明:

https://gerrit-review.googlesource.com/Documentation/prolog-cookbook.html#_example_8_make_change_submittable_only_if_tt_code_review_2_tt_is_given_by_a_non_author

于 2013-06-07T13:32:11.767 回答
1

我发布了对您链接到的问题的答案,但它可能会引导您朝着正确的方向前进:

我为我们的 Gerrit 安装编写了这个 prolog 过滤器。我在父项目中将其作为 submit_filter 进行,因为我希望它适用于我们系统中的所有项目。

%filter to require all projects to have a code-reviewer other than the owner
submit_filter(In, Out) :-
    %unpack the submit rule into a list of code reviews
    In =.. [submit | Ls],
    %add the non-owner code review requiremet
    reject_self_review(Ls, R),
    %pack the list back up and return it (kinda)
    Out =.. [submit | R].

reject_self_review(S1, S2) :-
    %set O to be the change owner
    gerrit:change_owner(O),
    %find a +2 code review, if it exists, and set R to be the reviewer
    gerrit:commit_label(label('Code-Review', 2), R), 
    %if there is a +2 review from someone other than the owner, then the filter has no work to do, assign S2 to S1
    R \= O, !,
    %the cut (!) predicate prevents further rules from being consulted
    S2 = S1.
reject_self_review(S1, S2) :-
    %set O to be the change owner
    gerrit:change_owner(O),
    %find a +2 code review, if it exists, and set R to be the reviewer - comment sign was missing
    gerrit:commit_label(label('Code-Review', 2), R), 
    R = O, !,
    %if there isn't a +2 from someone else (above rule), and there is a +2 from the owner, reject with a self-reviewed label
    S2 = [label('Self-Reviewed', reject(O))|S1].
%if the above two rules didn't make it to the ! predicate, there aren't any +2s so let the default rules through unfiltered
reject_self_review(S1, S1).

这条规则相对于食谱中的规则 #8的好处 (IMO)是:

  • 标签仅在Self-Reviewed更改被阻止时显示,而不是为每个更改添加Non-Author-Code-Review标签
  • 通过使用reject(O)该规则,Self-Reviewed标签实际上是一个危险信号
  • 作为 asubmit_filter而不是 a submit_rule,此规则安装在父项目中并适用于所有子项目

请注意:创建此规则是为了防止Owner自我审查更改,而食谱中的示例与Author. 根据您的工作流程,您可能希望将 2 个gerrit:change_owner(O)谓词替换为gerrit:commit_author(O)orgerrit:commit_committer(O)

于 2016-06-16T17:03:49.917 回答