Prolog Gerrit NACR仅在master上执行-如何执行?
第一个帖子 我想实施仅由Gerrit在master branch强制执行的NACR 我已经为所有分支实施了在我的项目中强制执行的NACR rules.pl。但我的序言是。。好。。不存在!所以当我试着去想它的时候 我认为最简单的方法是将NACR与谓词结合起来,以便在分支不是主分支或发布分支时删除它?可能没有那么有效,但可能很简单 [Apologies-只是在Prolog Gerrit上下文中思考-在这个有限的领域之外,还有更多的Prolog人!!] NACR-来自的非作者代码审查 这是一个序言,它将NACR标签添加到gerrit更改中Prolog Gerrit NACR仅在master上执行-如何执行?,prolog,gerrit,Prolog,Gerrit,第一个帖子 我想实施仅由Gerrit在master branch强制执行的NACR 我已经为所有分支实施了在我的项目中强制执行的NACR rules.pl。但我的序言是。。好。。不存在!所以当我试着去想它的时候 我认为最简单的方法是将NACR与谓词结合起来,以便在分支不是主分支或发布分支时删除它?可能没有那么有效,但可能很简单 [Apologies-只是在Prolog Gerrit上下文中思考-在这个有限的领域之外,还有更多的Prolog人!!] NACR-来自的非作者代码审查 这是一个序言,它
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的含义?接下来,请提供一些有关您打算做什么等的信息。请参阅有关的联机帮助。更新了详细信息和参考资料。希望现在不要太久。非常感谢。我还没有测试过第二种清洁剂。但第一种方法不仅干净有效。但对我来说,这也是一个小小的启示:)