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