bde955c276
These small examples are designed to run quickly with the Gerrit prolog-shell, but not depending on a local Gerrit repository server. Change-Id: I8f58a6740c6f2c79ae1314f2ae593409ee60440d
149 lines
3.7 KiB
Prolog
149 lines
3.7 KiB
Prolog
% 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
|
|
).
|