% 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 ).