blob: 18e8a73fd602e4d8067cd6200de3d801940bdfcd [file] [log] [blame]
% 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
).