如果代码更改超过我们定义的阈值(如300行),我们想引入新的实验室,例如“经理批准”。
我们使用的逻辑是默认情况下添加“经理批准”,这很好用; 使用prolog提交规则作为以下逻辑,只要代码更改少于300行,请删除“经理批准”标签。
测试表明,尽管代码更改少于300行,但仍有“经理批准”标签。
rules.pl文件:
submit_rule(S) :-
gerrit:default_submit(X),
X =.. [submit | Ls],
require_IP(Ls, R),
S =.. [submit | R].
require_IP(S,R) :-
gerrit:commit_stats(Files,Insertions,Deletions),
Insertions < 300,
gerrit:remove_label(S,label('IP-Approved',_),R), !.
require_IP(S,S).
在gerrit服务器上,error_log出现以下错误,看起来rules.pl语法错误我是Prolog语言的新手,谁可以为我们分享信息?感谢您的帮助。
从https://github.com/GerritCodeReview/gerrit/blob/master/prolog/gerrit_common.pl附加官方的remove_label定义
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% remove_label/3:
%%
%% Removes all occurances of label(Name, Status).
%%
:- public remove_label/3.
%%
remove_label([], _, []) :- !.
remove_label(List, Label, Out) :-
List = [_ | _],
!,
subtract1(List, Label, Out).
remove_label(S, Label, Out) :-
S =.. [submit | Ls],
subtract1(Ls, Label, Tmp),
Out =.. [submit | Tmp].
================================================ =========== 于8/30更新:
我们在gerrit 2.11上使用了三种不同的方法,现在没有语法错误。但是它们都不起作用,新标签将代码更改后的大小保持不变。怀疑commit_stats()不在2.11上: 1)哪个文件在gerrit源代码中定义commit_stats()? 2)还有其他方法可以做到这一点吗?
真的很感谢您的帮助。
解决方案1:
%检查提交长度是否少于30行
submit_rule(S) :-
gerrit:default_submit(X),
X =.. [submit | Ls],
require_Manager(Ls, R),
%S =.. [submit | [label(R, need(_)) ].
S =.. [submit | R].
require_Manager(S, R) :-
gerrit:commit_stats(_,added,_),
%label(added, need(_)),
added < 30,
gerrit:remove_label(S,label('Manager-Approval',_),R), !.
require_Manager(S, S).
解决方案2:
submit_rule(S) :-
gerrit:default_submit(X),
X =.. [submit | Ls],
remove_verified(Ls, R),
S =.. [submit | R].
remove_verified([], []).
remove_verified([label('Manager-Approval', _) | T], R) :- gerrit:commit_stats(_, inserted, _), inserted > 5, remove_verified(T, R), !.
remove_verified([H|T], [H|R]) :- remove_verified(T, R).
解决方案3:
submit_rule(submit(CR, V, MA)) :-
gerrit:commit_stats(_, inserted, _), inserted >= 5, !,
base(CR, V),
gerrit:max_with_block(-1, 1, 'Manager-Approval', MA).
submit_rule(submit(CR, V)) :-
base(CR, V).
base(CR, V) :-
gerrit:max_with_block(-1, 1, 'Verified', V),
gerrit:max_with_block(-2, 2, 'Code-Review', CR).
答案 0 :(得分:1)
在第二个子句中,Files
和Deletions
是单例变量。因此,您可以将子句重写为:
require_IP(S,R) :-
gerrit:commit_stats(_,Insertions,_),
Insertions < 300,
gerrit:remove_label(S,label('IP-Approved',_),R), !.
但是没有任何语法错误。在日志中,您有一个运行时错误,该错误显然在使用第一个子句时发生。错误似乎是由于对gerrit:remove_label/3
谓词的调用未实例化R
引起的,这导致在调用S =.. [submit | R]
时在日志中显示错误。
研究Gerrit文档(我不熟悉它),尤其是对于使用gerrit:remove_label/3
谓词的示例,您的代码看起来是正确的。错误可能是由问题中的代码以外的代码引起的吗?如果您将require_IP /2
谓词的第一子句注释掉,会得到同样的错误吗?