# -*- coding: utf-8 -*-
"""This module contains the RepoCommit classes."""
from __future__ import unicode_literals
from . import status
from .. import checks, git, models, users
from .comment import RepoComment
class _RepoCommit(models.GitHubCore):
"""The :class:`RepoCommit ` object.
This represents a commit as
viewed by a :class:`Repository`. This is different from a Commit object
returned from the git data section.
Two commit instances can be checked like so::
c1 == c2
c1 != c2
And is equivalent to::
c1.sha == c2.sha
c1.sha != c2.sha
"""
class_name = "_RepoCommit"
def _update_attributes(self, commit):
self._api = commit["url"]
#: SHA of this commit.
self._uniq = self.sha = commit["sha"]
def _repr(self):
return "<{0} [{1}]>".format(self.class_name, self.sha[:7])
def check_runs(self):
"""Retrieve the check runs for this commit.
.. versionadded:: 1.3.0
:returns:
the check runs for this commit
:rtype:
:class:`~github3.checks.CheckRun`
"""
url = self._build_url("check-runs", base_url=self._api)
return self._iter(
-1,
url,
checks.CheckRun,
headers=checks.CheckRun.CUSTOM_HEADERS,
list_key="check_runs",
)
def check_suites(self):
"""Retrieve the check suites for this commit.
.. versionadded:: 1.3.0
:returns:
the check suites for this commit
:rtype:
:class:`~github3.checks.CheckSuite`
"""
url = self._build_url("check-suites", base_url=self._api)
return self._iter(
-1,
url,
checks.CheckSuite,
headers=checks.CheckSuite.CUSTOM_HEADERS,
list_key="check_suites",
)
def diff(self):
"""Retrieve the diff for this commit.
:returns:
the diff as a bytes object
:rtype:
bytes
"""
resp = self._get(
self._api, headers={"Accept": "application/vnd.github.diff"}
)
return resp.content if self._boolean(resp, 200, 404) else b""
def patch(self):
"""Retrieve the patch formatted diff for this commit.
:returns:
the patch as a bytes object
:rtype:
bytes
"""
resp = self._get(
self._api, headers={"Accept": "application/vnd.github.patch"}
)
return resp.content if self._boolean(resp, 200, 404) else b""
def status(self):
"""Retrieve the combined status for this commit.
:returns:
the combined status for this commit
:rtype:
:class:`~github3.repos.status.CombinedStatus`
"""
url = self._build_url("status", base_url=self._api)
json = self._json(self._get(url), 200)
return self._instance_or_null(status.CombinedStatus, json)
def statuses(self):
"""Retrieve the statuses for this commit.
:returns:
the statuses for this commit
:rtype:
:class:`~github3.repos.status.Status`
"""
url = self._build_url("statuses", base_url=self._api)
return self._iter(-1, url, status.Status)
def comments(self, number=-1, etag=None):
"""Iterate over comments for this commit.
:param int number:
(optional), number of comments to return. Default: -1 returns all
comments
:param str etag:
(optional), ETag from a previous request to the same endpoint
:returns:
generator of comments
:rtype:
:class:~github3.repos.comment.RepoComment`
"""
url = self._build_url("comments", base_url=self._api)
return self._iter(int(number), url, RepoComment, etag=etag)
class RepoCommit(_RepoCommit):
"""Representation of a commit with repository and git data."""
class_name = "Repository Commit"
def _update_attributes(self, commit):
super(RepoCommit, self)._update_attributes(commit)
#: The number of additions made in the commit.
self.additions = 0
#: The number of deletions made in the commit.
self.deletions = 0
#: The files that were modified by this commit.
self.files = commit["files"]
#: Total number of changes in the files.
self.total = 0
self.stats = commit["stats"]
if self.stats:
self.additions = self.stats["additions"]
self.deletions = self.stats["deletions"]
self.total = self.stats["total"]
class MiniCommit(_RepoCommit):
"""A commit returned on a ShortBranch."""
class_name = "Mini Repository Commit"
_refresh_to = RepoCommit
class ShortCommit(_RepoCommit):
"""Representation of an incomplete commit in a collection."""
class_name = "Short Repository Commit"
_refresh_to = RepoCommit
def _update_attributes(self, commit):
super(ShortCommit, self)._update_attributes(commit)
self.author = commit["author"]
if self.author:
self.author = users.ShortUser(self.author, self)
self.comments_url = commit["comments_url"]
self.commit = git.ShortCommit(commit["commit"], self)
self.committer = commit["committer"]
if self.committer:
self.committer = users.ShortUser(self.committer, self)
self.html_url = commit["html_url"]
#: List of parents to this commit.
self.parents = commit["parents"]
#: The commit message
self.message = getattr(self.commit, "message", None)