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