Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement get_commit_comment method and refactor CommitComment #865

Merged
Merged
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
24 changes: 20 additions & 4 deletions ogr/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -1031,18 +1031,21 @@ def edited(self) -> datetime.datetime:
raise NotImplementedError()


class CommitComment(OgrAbstractClass):
class CommitComment(Comment):
"""
Attributes:
sha (str): Hash of the related commit.
body (str): Body of the comment.
author (str): Login of the author.
"""

def __init__(self, sha: str, body: str, author: str) -> None:
def __init__(
self,
sha: str,
raw_comment: Any,
) -> None:
super().__init__(raw_comment=raw_comment)
self.sha = sha
self.body = body
self.author = author

@property # type: ignore
@deprecate_and_set_removal(
Expand Down Expand Up @@ -1875,6 +1878,19 @@ def get_commit_comments(self, commit: str) -> list[CommitComment]:
"""
raise NotImplementedError()

def get_commit_comment(self, commit_sha: str, comment_id: int) -> CommitComment:
"""
Get commit comment.

Args:
commit_sha: SHA of the commit
comment_id: ID of the commit comment

Returns:
Object representing the commit comment.
"""
raise NotImplementedError()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ya… this should be an abstract class, it would've been much easier to see unimplemented methods and missing functionality (e.g., on Pagure' side), but that sounds more like a Friday thing than including this in here…


def set_commit_status(
self,
commit: str,
Expand Down
2 changes: 1 addition & 1 deletion ogr/read_only.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ def commit_comment(
commit: str,
body: str,
) -> "CommitComment":
return CommitComment(sha=commit, body=body, author=cls.author)
return CommitComment(sha=commit, raw_comment=original_object)

@classmethod
def set_commit_status(
Expand Down
14 changes: 12 additions & 2 deletions ogr/services/github/comments.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import datetime
from typing import Union

from github.CommitComment import CommitComment as _GithubCommitComment
from github.IssueComment import IssueComment as _GithubIssueComment
from github.PullRequestComment import PullRequestComment as _GithubPullRequestComment
from github.Reaction import Reaction as _Reaction

from ogr.abstract import Comment, IssueComment, PRComment, Reaction
from ogr.abstract import Comment, CommitComment, IssueComment, PRComment, Reaction


class GithubReaction(Reaction):
Expand All @@ -24,7 +25,11 @@ def delete(self) -> None:
class GithubComment(Comment):
def _from_raw_comment(
self,
raw_comment: Union[_GithubIssueComment, _GithubPullRequestComment],
raw_comment: Union[
_GithubIssueComment,
_GithubPullRequestComment,
_GithubCommitComment,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so the properties will work as they should? 👀 nice!

],
) -> None:
self._raw_comment = raw_comment
self._id = raw_comment.id
Expand Down Expand Up @@ -60,3 +65,8 @@ def __str__(self) -> str:
class GithubPRComment(GithubComment, PRComment):
def __str__(self) -> str:
return "Github" + super().__str__()


class GithubCommitComment(GithubComment, CommitComment):
def __str__(self) -> str:
return "Github" + super().__str__()
15 changes: 10 additions & 5 deletions ogr/services/github/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import github
from github import UnknownObjectException
from github.Commit import Commit
from github.CommitComment import CommitComment as GithubCommitComment
from github.CommitComment import CommitComment as _GithubCommitComment
from github.GithubException import GithubException
from github.Repository import Repository

Expand All @@ -34,6 +34,7 @@
GithubCheckRunResult,
GithubCheckRunStatus,
)
from ogr.services.github.comments import GithubCommitComment
from ogr.services.github.flag import GithubCommitFlag
from ogr.services.github.issue import GithubIssue
from ogr.services.github.pull_request import GithubPullRequest
Expand Down Expand Up @@ -345,11 +346,10 @@ def commit_comment(

@staticmethod
def _commit_comment_from_github_object(
raw_commit_coment: GithubCommitComment,
raw_commit_coment: _GithubCommitComment,
) -> CommitComment:
return CommitComment(
body=raw_commit_coment.body,
author=raw_commit_coment.user.login,
return GithubCommitComment(
raw_comment=raw_commit_coment,
sha=raw_commit_coment.commit_id,
)

Expand All @@ -360,6 +360,11 @@ def get_commit_comments(self, commit: str) -> list[CommitComment]:
for comment in github_commit.get_comments()
]

def get_commit_comment(self, commit_sha: str, comment_id: int) -> CommitComment:
return self._commit_comment_from_github_object(
self.github_repo.get_comment(comment_id),
)

@if_readonly(
return_function=GitProjectReadOnly.set_commit_status,
log_message="Create a status on a commit",
Expand Down
51 changes: 47 additions & 4 deletions ogr/services/gitlab/comments.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,25 @@

import gitlab.exceptions
from gitlab.v4.objects import (
ProjectCommitComment,
ProjectCommitDiscussionNote,
ProjectIssueNote,
ProjectIssueNoteAwardEmoji,
ProjectMergeRequestAwardEmoji,
ProjectMergeRequestNote,
)

from ogr.abstract import Comment, IssueComment, PRComment, Reaction
from ogr.exceptions import GitlabAPIException
from ogr.abstract import Comment, CommitComment, IssueComment, PRComment, Reaction
from ogr.exceptions import GitlabAPIException, OperationNotSupported

logger = logging.getLogger(__name__)


class GitlabReaction(Reaction):
_raw_reaction: Union[ProjectIssueNoteAwardEmoji, ProjectMergeRequestAwardEmoji]
_raw_reaction: Union[
ProjectIssueNoteAwardEmoji,
ProjectMergeRequestAwardEmoji,
]

def __str__(self) -> str:
return "Gitlab" + super().__str__()
Expand All @@ -32,7 +37,12 @@ def delete(self) -> None:
class GitlabComment(Comment):
def _from_raw_comment(
self,
raw_comment: Union[ProjectIssueNote, ProjectMergeRequestNote],
raw_comment: Union[
ProjectIssueNote,
ProjectMergeRequestNote,
ProjectCommitDiscussionNote,
ProjectCommitComment,
],
) -> None:
self._raw_comment = raw_comment
self._id = raw_comment.get_id()
Expand Down Expand Up @@ -94,3 +104,36 @@ def __str__(self) -> str:
class GitlabPRComment(GitlabComment, PRComment):
def __str__(self) -> str:
return "Gitlab" + super().__str__()


class GitlabCommitComment(GitlabComment, CommitComment):
def __str__(self) -> str:
return "Gitlab" + super().__str__()

@property
def body(self) -> str:
# TODO: ideally, the raw comment should be of the same type for both
# individual and all comments retrievals, this comes from the
# Gitlab API inconsistency (see get_commit_comment vs get_commit_comments)
if isinstance(self._raw_comment, ProjectCommitComment):
return self._raw_comment.note

return self._raw_comment.body

@body.setter
def body(self, new_body: str) -> None:
if isinstance(self._raw_comment, ProjectCommitComment):
self._raw_comment.note = new_body
else:
self._raw_comment.body = new_body
self._raw_comment.save()

def get_reactions(self) -> list[Reaction]:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh shoot

raise OperationNotSupported(
"Interacting with award emojis on commit comments is not supported via API.",
)

def add_reaction(self, reaction: str) -> GitlabReaction:
raise OperationNotSupported(
"Interacting with award emojis on commit comments is not supported via API.",
)
40 changes: 36 additions & 4 deletions ogr/services/gitlab/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from ogr.exceptions import GitlabAPIException, OperationNotSupported
from ogr.services import gitlab as ogr_gitlab
from ogr.services.base import BaseGitProject
from ogr.services.gitlab.comments import GitlabCommitComment
from ogr.services.gitlab.flag import GitlabCommitFlag
from ogr.services.gitlab.issue import GitlabIssue
from ogr.services.gitlab.pull_request import GitlabPullRequest
Expand Down Expand Up @@ -294,11 +295,10 @@ def commit_comment(
return self._commit_comment_from_gitlab_object(raw_comment, commit)

@staticmethod
def _commit_comment_from_gitlab_object(raw_comment, commit) -> CommitComment:
return CommitComment(
def _commit_comment_from_gitlab_object(raw_comment, commit: str) -> CommitComment:
return GitlabCommitComment(
raw_comment=raw_comment,
sha=commit,
body=raw_comment.note,
author=raw_comment.author["username"],
)

def get_commit_comments(self, commit: str) -> list[CommitComment]:
Expand All @@ -313,6 +313,38 @@ def get_commit_comments(self, commit: str) -> list[CommitComment]:
for comment in commit_object.comments.list()
]

def get_commit_comment(self, commit_sha: str, comment_id: int) -> CommitComment:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what's the library for, if we need to do all the dirty work anyways…

try:
commit_object: ProjectCommit = self.gitlab_repo.commits.get(commit_sha)
except gitlab.exceptions.GitlabGetError as ex:
logger.error(f"Commit with SHA {commit_sha} was not found: {ex}")
raise GitlabAPIException(
f"Commit with SHA {commit_sha} was not found.",
) from ex

try:
discussions = commit_object.discussions.list(all=True)
comment = None

for discussion in discussions:
note_ids = [note["id"] for note in discussion.attributes["notes"]]
if comment_id in note_ids:
comment = discussion.notes.get(comment_id)
break

if comment is None:
raise GitlabAPIException(
f"Comment with ID {comment_id} not found in commit {commit_sha}.",
)

except gitlab.exceptions.GitlabGetError as ex:
logger.error(f"Failed to retrieve comment with ID {comment_id}: {ex}")
raise GitlabAPIException(
f"Failed to retrieve comment with ID {comment_id}.",
) from ex

return self._commit_comment_from_gitlab_object(comment, commit_sha)

@indirect(GitlabCommitFlag.set)
def set_commit_status(
self,
Expand Down
3 changes: 3 additions & 0 deletions ogr/services/pagure/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,9 @@ def commit_comment(
def get_commit_comments(self, commit: str) -> list[CommitComment]:
raise OperationNotSupported("Commit comments are not supported on Pagure.")

def get_commit_comment(self, commit_sha: str, comment_id: int) -> CommitComment:
raise OperationNotSupported("Commit comments are not supported on Pagure.")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


@if_readonly(return_function=GitProjectReadOnly.set_commit_status)
@indirect(PagureCommitFlag.set)
def set_commit_status(
Expand Down
Loading
Loading