# -*- coding: utf-8 -*-
"""This module contains the RepoCommit classes."""
from __future__ import unicode_literals
from . import status
from .. import 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 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)