diff --git a/plat/gitea.py b/plat/gitea.py index 59cec6d6b..a8513feaa 100644 --- a/plat/gitea.py +++ b/plat/gitea.py @@ -168,6 +168,25 @@ def __init__(self, type, json): self._set_attr_from_json('tgt_rev', json, 'base.sha') +class Review: + attributes = ["by", "state", "type", "when"] + + states_mapping = { + "APPROVED": "accepted", + "REQUEST_CHANGES": "declined", + "REQUEST_REVIEW": "new", + } + + def __init__(self, **kwargs): + self._review_data = kwargs + + def __getattr__(self, attribute): + if attribute == "state": + return self.states_mapping[self._review_data.get("state", "REQUEST_REVIEW")] + + return self._review_data.get(attribute, None) + + class Request: """Request structure implemented for Gitea""" def __init__(self): @@ -182,6 +201,25 @@ def parse_request_id(reqid): def construct_request_id(owner, repo, pr_id): return f'{owner}:{repo}:{pr_id}' + @staticmethod + def format_review(review): + if review.get("user") is not None: + return Review( + by=review["user"]["login"], + state=review["state"], + type="User", + when=review["updated_at"] + ) + elif review.get("team") is not None: + return Review( + by=review["team"]["name"], + state=review["state"], + type="Group", + when=review["updated_at"] + ) + else: + raise Exception("Unknown review type") + def _init_attributes(self): self.reqid = None self.creator = '' @@ -197,11 +235,12 @@ def _init_attributes(self): self._issues = None # Gitea specific attributes + self._labels = set() self._owner = None self._repo = None self._pr_id = None - def read(self, json, owner, repo): + def read(self, json, owner, repo, reviews_json=None): """Read in a request from JSON response""" self._init_attributes() @@ -219,8 +258,15 @@ def read(self, json, owner, repo): self.actions = [RequestAction(type="submit", json=json)] - if json.get("merged"): - self.accept_at = json["merged_at"] + if reviews_json is not None: + if json.get("merged"): + self.accept_at = json["merged_at"] + + for review in reviews_json: + if not review.get("dismissed", False): + self.reviews.append(Request.format_review(review)) + + self._labels = {x["name"] for x in json["labels"]} class ProjectConfig: @@ -256,8 +302,10 @@ def get_path(self, *args): def _get_request(self, pr_id, owner, repo): res = self.api.get(f'repos/{owner}/{repo}/pulls/{pr_id}').json() + reviews = self.api.get(f'repos/{owner}/{repo}/pulls/{pr_id}/reviews').json() + ret = Request() - ret.read(res, owner=owner, repo=repo) + ret.read(res, owner=owner, repo=repo, reviews_json=reviews) return ret def get_request(self, request_id, with_full_history=False):