如果代码更改超出定义的限制,则通过序言进一步批准

时间:2018-08-22 06:49:18

标签: prolog continuous-integration gerrit

如果代码更改超过我们定义的阈值(如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].

enter image description here enter image description here

enter image description here

================================================ =========== 于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).

1 个答案:

答案 0 :(得分:1)

在第二个子句中,FilesDeletions是单例变量。因此,您可以将子句重写为:

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谓词的第一子句注释掉,会得到同样的错误吗?