| % A simplified and mocked AOSP rules.pl |
| |
| %%%%% wrapper functions for unit tests |
| |
| change_branch(X) :- gerrit:change_branch(X). |
| change_project(X) :- gerrit:change_project(X). |
| commit_author(U,N,M) :- gerrit:commit_author(U,N,M). |
| commit_delta(X) :- gerrit:commit_delta(X). |
| commit_label(L,U) :- gerrit:commit_label(L,U). |
| uploader(X) :- gerrit:uploader(X). |
| |
| %%%%% true/false conditions |
| |
| % Special auto-merger accounts. |
| is_exempt_uploader :- |
| uploader(user(Id)), |
| memberchk(Id, [104, 106]). |
| |
| % Build cop overrides everything. |
| has_build_cop_override :- |
| commit_label(label('Build-Cop-Override', 1), _). |
| |
| is_exempt_from_reviews :- |
| or(is_exempt_uploader, has_build_cop_override). |
| |
| % Some files in selected projects need API review. |
| needs_api_review :- |
| commit_delta('^(.*/)?api/|^(system-api/)'), |
| change_project(Project), |
| memberchk(Project, [ |
| 'platform/external/apache-http', |
| 'platform/frameworks/base', |
| 'platform/frameworks/support', |
| 'platform/packages/services/Car', |
| 'platform/prebuilts/sdk' |
| ]). |
| |
| % Some branches need DrNo review. |
| needs_drno_review :- |
| change_branch(Branch), |
| memberchk(Branch, [ |
| 'refs/heads/my-alpha-dev', |
| 'refs/heads/my-beta-dev' |
| ]). |
| |
| % Some author email addresses need Qualcomm-Review. |
| needs_qualcomm_review :- |
| commit_author(_, _, M), |
| regex_matches( |
| '.*@(qti.qualcomm.com|qca.qualcomm.com|quicinc.com|qualcomm.com)', M). |
| |
| % Special projects, branches, user accounts |
| % can opt out owners review. |
| opt_out_find_owners :- |
| change_branch(Branch), |
| memberchk(Branch, [ |
| 'refs/heads/my-beta-testing', |
| 'refs/heads/my-testing' |
| ]). |
| |
| % Special projects, branches, user accounts |
| % can opt in owners review. |
| % Note that opt_out overrides opt_in. |
| opt_in_find_owners :- true. |
| |
| |
| %%%%% Simple list filters. |
| |
| remove_label(X, In, Out) :- |
| gerrit:remove_label(In, label(X, _), Out). |
| |
| % Slow but simple for short input list. |
| remove_review_categories(In, Out) :- |
| remove_label('API-Review', In, L1), |
| remove_label('Code-Review', L1, L2), |
| remove_label('DrNo-Review', L2, L3), |
| remove_label('Owner-Review-Vote', L3, L4), |
| remove_label('Qualcomm-Review', L4, L5), |
| remove_label('Verified', L5, Out). |
| |
| |
| %%%%% Missing rules in Gerrit Prolog Cafe. |
| |
| or(InA, InB) :- once((A;B)). |
| |
| not(Goal) :- Goal -> false ; true. |
| |
| % memberchk(+Element, +List) |
| memberchk(X, [H|T]) :- |
| (X = H -> true ; memberchk(X, T)). |
| |
| maplist(Functor, In, Out) :- |
| (In = [] |
| -> Out = [] |
| ; (In = [X1|T1], |
| Out = [X2|T2], |
| Goal =.. [Functor, X1, X2], |
| once(Goal), |
| maplist(Functor, T1, T2) |
| ) |
| ). |
| |
| |
| %%%%% Conditional rules and filters. |
| |
| submit_filter(In, Out) :- |
| (is_exempt_from_reviews |
| -> remove_review_categories(In, Out) |
| ; (check_review(needs_api_review, |
| 'API_Review', In, L1), |
| check_review(needs_drno_review, |
| 'DrNo-Review', L1, L2), |
| check_review(needs_qualcomm_review, |
| 'Qualcomm-Review', L2, L3), |
| check_find_owners(L3, Out) |
| ) |
| ). |
| |
| check_review(NeedReview, Label, In, Out) :- |
| (NeedReview |
| -> Out = In |
| ; remove_label(Label, In, Out) |
| ). |
| |
| % If opt_out_find_owners is true, |
| % remove all 'Owner-Review-Vote' label; |
| % else if opt_in_find_owners is true, |
| % call find_owners:submit_filter; |
| % else default to no find_owners filter. |
| check_find_owners(In, Out) :- |
| (opt_out_find_owners |
| -> remove_label('Owner-Review-Vote', In, Temp) |
| ; (opt_in_find_owners |
| -> find_owners:submit_filter(In, Temp) |
| ; In = Temp |
| ) |
| ), |
| Temp =.. [submit | L1], |
| remove_label('Owner-Approved', L1, L2), |
| maplist(owner_may_to_need, L2, L3), |
| Out =.. [submit | L3]. |
| |
| % change may(_) to need(_) to block submit. |
| owner_may_to_need(In, Out) :- |
| (In = label('Owner-Review-Vote', may(_)) |
| -> Out = label('Owner-Review-Vote', need(_)) |
| ; Out = In |
| ). |