Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions ogr/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,13 @@ def get_comments(
"""
raise NotImplementedError()

def who_can_close() -> set[str]:
"""
Returns:
Set of usernames who can close the issue.
"""
raise NotImplementedError()

def can_close(self, username: str) -> bool:
"""
Check if user have permissions to modify an issue.
Expand Down Expand Up @@ -889,6 +896,34 @@ def close(self) -> "PullRequest":
"""
raise NotImplementedError()

def who_can_close() -> set[str]:
"""
Returns:
Set of usernames who can close the pull request.
"""
raise NotImplementedError()

def who_can_merge() -> set[str]:
"""
Returns:
Set of usernames who can merge the pull request.
"""
raise NotImplementedError()

def can_close(self, username: str) -> bool:
"""
Returns:
`True` if user can close the pull request, `False` otherwise.
"""
raise NotImplementedError()

def can_merge(self, username: str) -> bool:
"""
Returns:
`True` if user can merge the pull request, `False` otherwise.
"""
raise NotImplementedError()

def merge(self) -> "PullRequest":
"""
Merge the pull request.
Expand Down Expand Up @@ -1536,6 +1571,16 @@ def who_can_close_issue(self) -> set[str]:
"""
raise NotImplementedError()

def can_close_issue(username: str) -> bool:
"""
Args:
username: Login of the user.

Returns:
`True` if user can close the issue, `False` otherwise.
"""
raise NotImplementedError()

def who_can_merge_pr(self) -> set[str]:
"""
Returns:
Expand Down
14 changes: 13 additions & 1 deletion ogr/services/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ class BaseGitProject(GitProject):
def full_repo_name(self) -> str:
return f"{self.namespace}/{self.repo}"

def can_close_issue(self, username: str) -> bool:
return username in self.who_can_close_issue()

def can_merge_pr(self, username: str) -> bool:
return username in self.who_can_merge_pr()


class BasePullRequest(PullRequest):
@property
Expand Down Expand Up @@ -81,6 +87,12 @@ def get_statuses(self) -> list[CommitFlag]:
commit = self.get_all_commits()[-1]
return self.target_project.get_commit_statuses(commit)

def can_close(self, username):
return self.status == "open" and username in self.who_can_close()

def can_merge(self, username) -> bool:
return self.status == "open" and username in self.who_can_merge()


class BaseGitUser(GitUser):
pass
Expand All @@ -97,7 +109,7 @@ def get_comments(
return filter_comments(all_comments, filter_regex, reverse, author)

def can_close(self, username: str) -> bool:
return username == self.author or username in self.project.who_can_close_issue()
return username == self.author or username in self.who_can_close()


class BaseCommitFlag(CommitFlag):
Expand Down
6 changes: 6 additions & 0 deletions ogr/services/github/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@ def close(self) -> "Issue":
self._raw_issue.edit(state="closed")
return self

def who_can_close(self) -> set[str]:
return self.project.who_can_close_issue()

def can_close(self, username):
return username == self.author or username in self.who_can_close()

def add_label(self, *labels: str) -> None:
for label in labels:
self._raw_issue.add_to_labels(label)
Expand Down
3 changes: 3 additions & 0 deletions ogr/services/github/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,9 @@ def who_can_close_issue(self) -> set[str]:
def who_can_merge_pr(self) -> set[str]:
return self.__get_collaborators()

def can_close_issue(self, username: str) -> bool:
return username in self.who_can_close_issue()

def can_merge_pr(self, username) -> bool:
return (
self.github_repo.get_collaborator_permission(username)
Expand Down
22 changes: 22 additions & 0 deletions ogr/services/github/pull_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,25 @@ def add_label(self, *labels: str) -> None:

def get_comment(self, comment_id: int) -> PRComment:
return GithubPRComment(self._raw_pr.get_issue_comment(comment_id))

def who_can_close(self) -> set[str]:
people_who_can_close: set[str] = set()

people_who_can_close.add(self.author)
project = self._target_project
people_who_can_close.update(project.__get_collaborators())

return people_who_can_close

def can_close(self, username):
return username == self.author or username in self.who_can_close()

def who_can_merge(self) -> set[str]:
people_who_can_merge: set[str] = set()
project = self._target_project
people_who_can_merge.update(project.__get_collaborators())

return people_who_can_merge

def can_merge(self, username):
return username in self.who_can_merge()
3 changes: 3 additions & 0 deletions ogr/services/gitlab/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,6 @@ def add_assignee(self, *assignees: str) -> None:

def get_comment(self, comment_id: int) -> IssueComment:
return GitlabIssueComment(self._raw_issue.notes.get(comment_id))

def who_can_close(self) -> set[str]:
return self.project.who_can_close_issue()
3 changes: 3 additions & 0 deletions ogr/services/gitlab/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@ def who_can_merge_pr(self) -> set[str]:
),
)

def can_close_issue(self, username):
return username in self.who_can_close_issue()

def can_merge_pr(self, username) -> bool:
return username in self.who_can_merge_pr()

Expand Down
22 changes: 22 additions & 0 deletions ogr/services/gitlab/pull_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,3 +299,25 @@ def add_label(self, *labels: str) -> None:

def get_comment(self, comment_id: int) -> PRComment:
return GitlabPRComment(self._raw_pr.notes.get(comment_id))

def who_can_close(self) -> set[str]:
people_who_can_close: set[str] = set()
people_who_can_close.add(self.author)

project = self._target_project
people_who_can_close.update(set(project.get_owners()))

return people_who_can_close

def can_close(self, username):
return username in self.who_can_close()

def who_can_merge(self) -> set[str]:
people_who_can_merge: set[str] = set()
project = self._target_project
people_who_can_merge.update(set(project.get_owners()))

return people_who_can_merge

def can_merge(self, username):
return username in self.who_can_merge()
3 changes: 3 additions & 0 deletions ogr/services/pagure/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,6 @@ def get_comment(self, comment_id: int) -> IssueComment:
method="GET",
),
)

def who_can_close_issue(self) -> set[str]:
return self.project.who_can_close_issue()
3 changes: 3 additions & 0 deletions ogr/services/pagure/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,9 @@ def which_groups_can_merge_pr(self) -> set[str]:
groups.update(project["access_groups"]["commit"])
return groups

def can_close_issue(self, username):
return username in self.who_can_close_issue()

def can_merge_pr(self, username) -> bool:
accounts_that_can_merge_pr = self.who_can_merge_pr()

Expand Down
17 changes: 17 additions & 0 deletions ogr/services/pagure/pull_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,3 +394,20 @@ def get_comment(self, comment_id: int) -> PRComment:
f"No comment with id#{comment_id} in PR#{self.id} found.",
response_code=404,
)

def who_can_close(self) -> set[str]:
people_who_can_close: set[str] = set()
people_who_can_close.add(self.author)

project: ogr_pagure.PagureProject = self.target_project
people_who_can_close.update(project.get_owners())
return people_who_can_close

def can_close(self, username):
return username in self.who_can_close()

def who_can_merge(self) -> set[str]:
return self._target_project.who_can_merge_pr()

def can_merge(self, username):
return username in self.who_can_merge()