2017-02-01 4 views
1

最初の投稿...Gerrit NACRはマスターのみで実施していますか?

私は、Gerritによってマスターブランチでのみ実行されるNACRを実装したいと思います。

私はすべての支店で自分のプロジェクトに適用されるNACR rules.plを実装しました。しかし、私のPrologは..まあ、存在しません!だから私はそれの周りに私の頭を取得しようとしている間...

私は、最も簡単な方法は、分岐がマスターまたはリリースブランチでない場合、これを削除する述語とNACRを組み合わせると思う?それほど効率的ではないかもしれませんが、単純かもしれませんか?

[Aplogies - のみPrologのヘリット・コンテキストで考えていた - はるかにPrologのフォークは、この制限されたドメインの外にあります!!】

NACR - 非著者のコードレビューhttps://gerrit-review.googlesource.com/Documentation/prolog-cookbook.html#NonAuthorCodeReview

からここで働きプロローグだとこの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ブランチでない場合は、今NACRラベルを除去するために)nacr_on_master(のようなものを追加することで、私が考えていた何

ヘリットの変化に追加されます

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は、レフリー/ヘッド/マスターであるが、そのiは

[ 
    { 
    "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 
    } 
] 

ヘリット

でのPrologエンジンからのエラーを取得していない場合、私は、問題が何であるかを理解しますが、ここの作品私は解決策があることを確かめるために別の支店がどこにあるのかを扱う方法を知らない。私は、NACRラベルが追加されていない場合、私のロジックに問題が追加されることを期待していますか?

ありがとうございます。

+2

最初に何を指定してください。 NACRとはどういう意味ですか?次に、あなたが何をしようとしているかについていくつかの情報を提供してください。 –

+1

[よくある質問](http://stackoverflow.com/help/how-to-ask)に関するオンラインヘルプを参照してください。 – lurker

+0

が更新されました。あまりにも長すぎるとは思わない。 – banman

答えて

2

私はGerritについて何も知らないが、私はあなたがしたいことのPrologの部分を理解していると思う。

私はヘリットをシミュレートするために、次のモジュールを使用します。

SWI-Prologで
:- 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'). 

、これはファイルの先頭に:- use_module(gerrit).を追加して、コードを含む別のモジュールから使用することができます。

問題は次のようになります。submit_rule(S)のコールは常に成功する必要があります。しかし、あなたのコードでは、事実はchange_branch('refs/heads/changes')でしか成功するが、それはchange_branch('refs/heads/master')で失敗する。全部の不純な制御フローに

% 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', 
    !. 

、これを追加する必要があります。

は、私が最も簡単な解決策は、あなたの追加のポリシーを表現するために、元の submit_rule/1を使用して add_non_author_approval/2に余分な句を追加することだと思います他の2つの節の前に。これで、あなたの nacr_on_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]). 

(テストされていません。)

+0

多くのありがとう。私はまだ2番目のクリーナーオプションをテストしていません。しかし、最初の方法はきれいに働くだけではありません。しかし、また私のための啓発の少しの瞬間だった:) – banman

関連する問題