| % Copyright (c) 2013 VMware, Inc. All Rights Reserved. | |
| % Copyright (C) 2017 The Android Open Source Project | |
| % | |
| % Licensed under the Apache License, Version 2.0 (the "License"); | |
| % you may not use this file except in compliance with the License. | |
| % You may obtain a copy of the License at | |
| % | |
| % http://www.apache.org/licenses/LICENSE-2.0 | |
| % | |
| % Unless required by applicable law or agreed to in writing, software | |
| % distributed under the License is distributed on an "AS IS" BASIS, | |
| % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |
| % implied. | |
| % See the License for the specific language governing permissions and | |
| % limitations under the License. | |
| :- package gerrit_owners. | |
| '$init'. | |
| :- public add_owner_approval/2. | |
| :- public add_owner_approval/3. | |
| :- public findall_match_file_user/1. | |
| add_owner_approval(In, Out) :- | |
| owner_path(Path), | |
| \+ owner_approved(Path), | |
| Out = [label('Code-Review-from-owners', need(_)) | In], | |
| !. | |
| add_owner_approval(In, Out) :- In = Out. | |
| add_owner_approval(Users, In, Out) :- | |
| owner_path(Path), | |
| \+ owner_approved(Users, Path), | |
| Out = [label('Code-Review-from-owners', need(_)) | In], | |
| !. | |
| add_owner_approval(_, In, Out) :- In = Out. | |
| owner_approved(Path) :- | |
| owner(Path, user(US)), | |
| code_review_user(US), | |
| !. | |
| owner_approved(Users, Path) :- | |
| owner(Path, User), | |
| member(User, Users), | |
| !. | |
| member(X, [X|_]). | |
| member(X, [_|L]) :- member(X, L). | |
| % add extra label for every file F | |
| findall_match_file_user(FileAndUser) :- | |
| matcher_path(F), | |
| findall(US,code_review_user(US),Approvers), | |
| matcher_needed(Approvers,F,FileAndUser). | |
| % this loops over all the paths and if for any | |
| % we have some labels generated then add a single | |
| % Owner-Code-Review need to block submit button | |
| add_match_owner_approval(In,Out) :- | |
| matcher_path(P), | |
| findall(US,code_review_user(US),Approvers), | |
| matcher_needed(Approvers,P,W), | |
| \+ W == [], | |
| Out = [label('Code-Review-from-owners', need(_)) | In], !. | |
| add_match_owner_approval(In,Out) :- Out = In. | |
| matcher_needed(Users,Path,W) :- | |
| findall(US,needed_review_user(Path,US),NSL), | |
| subtract(Users,NSL,Diff), | |
| % if Users - Needed is unchanged this means we are missing at | |
| % least one (!) | |
| Diff == Users, | |
| file_owners(Path,FormattedLabel), | |
| W = label(FormattedLabel, need(_)). | |
| needed_review_user(Path,User) :- | |
| matcher_owner(Path,user(User)). | |
| %%%%%%%%%%%%%%% | |
| % utility functions | |
| %%%%%%%%%%%%%%% | |
| % | |
| % convert a Var back to a sequence of solutions to be feed | |
| % in prolog (test purpose). | |
| % | |
| enumerate([H|T],F) :- F = H ; enumerate(T,F). | |
| % | |
| % check if first arg is a member of second list arg | |
| % | |
| memberchk(X,[X|_]) :- !. | |
| memberchk(X,[_|T]):- memberchk(X,T). | |
| % | |
| % subtract second list from first list giving result | |
| % used to understand if ApprovedList-NeededList is changed | |
| % in this case we understand that at least one owner of the matching | |
| % gave the ok | |
| % | |
| subtract([], _, []) :- !. | |
| subtract([A|C], B, D) :- | |
| memberchk(A, B), !, | |
| subtract(C, B, D). | |
| subtract([A|B], C, [A|D]) :- | |
| subtract(B, C, D). | |
| append([],L,L). | |
| append([H|T],L2,[H|L3]) :- append(T,L2,L3). | |
| prepend([],L,L). | |
| prepend([X|T],L,[X|Result]):- prepend(T,L,Result). | |
| prepend(X,L,[X|L]). | |