Prolog Gerrit NACR仅在master上执行-如何执行?

Prolog Gerrit NACR仅在master上执行-如何执行?,prolog,gerrit,Prolog,Gerrit,第一个帖子 我想实施仅由Gerrit在master branch强制执行的NACR 我已经为所有分支实施了在我的项目中强制执行的NACR rules.pl。但我的序言是。。好。。不存在!所以当我试着去想它的时候 我认为最简单的方法是将NACR与谓词结合起来,以便在分支不是主分支或发布分支时删除它?可能没有那么有效,但可能很简单 [Apologies-只是在Prolog Gerrit上下文中思考-在这个有限的领域之外,还有更多的Prolog人!!] NACR-来自的非作者代码审查 这是一个序言,它

第一个帖子

我想实施仅由Gerrit在master branch强制执行的NACR

我已经为所有分支实施了在我的项目中强制执行的NACR rules.pl。但我的序言是。。好。。不存在!所以当我试着去想它的时候

我认为最简单的方法是将NACR与谓词结合起来,以便在分支不是主分支或发布分支时删除它?可能没有那么有效,但可能很简单

[Apologies-只是在Prolog Gerrit上下文中思考-在这个有限的领域之外,还有更多的Prolog人!!]

NACR-来自的非作者代码审查

这是一个序言,它将NACR标签添加到gerrit更改中

submit_rule(S) :-
    gerrit:default_submit(X),
    X =.. [submit | Ls],
    add_non_author_approval(Ls, R),
    S =.. [submit | R].

add_non_author_approval(S1, S2) :-
    gerrit:commit_author(A),
    gerrit:commit_label(label('Code-Review', 2), R),
    R \= A, !,
    S2 = [label('Non-Author-Code-Review', ok(R)) | S1].
add_non_author_approval(S1, [label('Non-Author-Code-Review', need(_)) | S1]).
我所想的是,如果分支B不是主git分支,那么在主git()上添加类似nacr_的内容,以便现在删除nacr标签,例如

submit_rule(S) :-
    gerrit:default_submit(X),
    X =.. [submit | Ls],
    add_non_author_approval(Ls, Ri),
    nacr_on_master(Ri, R)
    S =.. [submit | R].

nacr_on_master(S1, S2) :-
  %need NACR on master
  gerrit:change_branch(B),
  B \= 'refs/heads/master',
  removehead(S1, S2). %remove last item added, which is the NACR label on head

removehead([_|Tail], Tail).

add_non_author_approval(S1, S2) :-
    gerrit:commit_author(A),
    gerrit:commit_label(label('Code-Review', 2), R),
    R \= A, !,
    S2 = [label('Non-Author-Code-Review', ok(R)) | S1].

add_non_author_approval(S1, [label('Non-Author-Code-Review', need(_)) | S1]).
这在分支B是refs/heads/master的情况下有效,但如果不是,我会从Gerrit中的Prolog引擎中得到一个错误

[
  {
    "status": "RULE_ERROR",
    "error_message": "Submit rule \u0027:(user,submit_rule)\u0027 for change 1 of proj-1-1 has no solution.",
    "prolog_reduction_count": 2766
  }
]
我知道问题可能是什么,但我不知道如何处理不同分支机构确保有解决方案的情况。我希望在没有添加NACR标签的情况下,我的逻辑会有其他问题吗


提前谢谢。

我对Gerrit一无所知,但我想我理解你想做的序言部分

我将使用以下模块模拟Gerrit:

:- module(gerrit, [
        default_submit/1,
        commit_author/1,
        commit_label/2,
        change_branch/1
    ]).

default_submit(submit([])).

commit_author(banman).

commit_label(label('Code-Review', 2), banman).

change_branch('refs/heads/master').
%change_branch('refs/heads/changes').
在SWI Prolog中,可以通过在文件顶部添加
:-use_module(gerrit)。
从包含代码的另一个模块中使用此命令

那么您的问题归结为以下几点:调用
submit\u规则
应该总是成功的。但是,对于您的代码,它只在
change\u分支('refs/heads/changes')
时成功,而在
change\u分支('refs/heads/master')时失败。

我认为最简单的解决方案是使用原始的
submit\u规则/1
并在
add\u non\u author\u approval/2
中添加一个额外的条款来表达您的附加政策:

% No change to label list if we are not on master.
add_non_author_approval(S, S) :-
    gerrit:change_branch(B),
    B \= 'refs/heads/master',
    !.
由于整件事的控制流程不纯,必须在其他两个条款之前添加此项。有了它,您就不需要使用
nacr\u on\u master/2
谓词

让我们测试一下:

% on master
?- submit_rule(S).
S = submit(label('Non-Author-Code-Review', need(_G2531)), []).

% on another branch
?- submit_rule(S).
S = submit([]).
我想这正是你想要的

编辑:通过避免否定和使用if-then-else代替剪切,整个代码变得更加清晰:

add_non_author_approval(S1, S2) :-
    gerrit:commit_author(A),
    gerrit:commit_label(label('Code-Review', 2), R),
    (   A = R
    ->  % Author and reviewer are the same person. If we are on master,
        % require another non-author code review.
        (   gerrit:change_branch('refs/heads/master')
        ->  S2 = [label('Non-Author-Code-Review', need(_)) | S1]
        ;   % On branches other than master, nothing is needed.
            S2 = S1 )
    ;   % Author and reviewer are different persons, all is well.
        S2 = [label('Non-Author-Code-Review', ok(R)) | S1] ).

(未测试。)

请首先说明NACR的含义?接下来,请提供一些有关您打算做什么等的信息。请参阅有关的联机帮助。更新了详细信息和参考资料。希望现在不要太久。非常感谢。我还没有测试过第二种清洁剂。但第一种方法不仅干净有效。但对我来说,这也是一个小小的启示:)