Skip to content
1 change: 1 addition & 0 deletions github/git_commits.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type Commit struct {
Message *string `json:"message,omitempty"`
Tree *Tree `json:"tree,omitempty"`
Parents []Commit `json:"parents,omitempty"`
Stats *CommitStats `json:"stats,omitempty"`
}

func (c Commit) String() string {
Expand Down
1 change: 1 addition & 0 deletions github/repos_collaborators.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func (s *RepositoriesService) IsCollaborator(owner, repo, user string) (bool, *R
if err != nil {
return false, nil, err
}

resp, err := s.client.Do(req, nil)
isCollab, err := parseBoolResponse(err)
return isCollab, resp, err
Expand Down
143 changes: 143 additions & 0 deletions github/repos_commits.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
// Copyright 2013 The go-github AUTHORS. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package github

import (
"fmt"
"net/url"
"time"
)

// RepositoryCommit represents a commit in a repo.
// Note that it's wrapping a Commit, so author/committer information is in two places,
// but contain different details about them: in RepositoryCommit "github details", in Commit - "git details".
type RepositoryCommit struct {
SHA *string `json:"sha,omitempty"`
Commit *Commit `json:"commit,omitempty"`
Author *User `json:"author,omitempty"`
Committer *User `json:"committer,omitempty"`
Parents []Commit `json:"parents,omitempty"`
Message *string `json:"message,omitempty"`
Copy link
Member

@dmitshur dmitshur Dec 12, 2016

Choose a reason for hiding this comment

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

I suspect Message field was added here erroneously. It should only be inside Commit, not RepositoryCommit.

From what I can tell, it's not actually ever present in the GitHub API responses. Does anyone have counter-examples? If not, I'll make a PR to remove it. Edit: It has been done in #492.

Copy link
Collaborator

Choose a reason for hiding this comment

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

SGTM. Thanks, @shurcooL.

Copy link
Member

@dmitshur dmitshur Dec 12, 2016

Choose a reason for hiding this comment

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

While making that PR, I ran into another issue and submitted a fix at #491. That needs to be reviewed and merged first, @gmlewis.


// Details about how many changes were made in this commit. Only filled in during GetCommit!
Stats *CommitStats `json:"stats,omitempty"`
// Details about which files, and how this commit touched. Only filled in during GetCommit!
Files []CommitFile `json:"files,omitempty"`
}

// CommitsListOptions specifies the optional parameters to the
// RepositoriesService.RepositoriesList method.
type CommitsListOptions struct {
// SHA or branch to start listing Commits from.
SHA string
// Path that should be touched by the returned Commits.
Path string
// Author of by which to filter Commits.
Author string
// Since when should Commits be included in the response.
Since time.Time
// Until when should Commits be included in the response.
Until time.Time
}

// CommitStats represents the number of additions / deletions from a file in a given RepositoryCommit.
type CommitStats struct {
Copy link
Collaborator

Choose a reason for hiding this comment

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

exported type should have a comment (here and below)

Additions *int `json:"additions,omitempty"`
Deletions *int `json:"deletions,omitempty"`
Total *int `json:"total,omitempty"`
}

type CommitFile struct {
SHA *string `json:"sha,omitempty"`
Filename *string `json:"filename,omitempty"`
Additions *int `json:"additions,omitempty"`
Deletions *int `json:"deletions,omitempty"`
Changes *int `json:"changes,omitempty"`
Status *string `json:"status,omitempty"`
Patch *string `json:"patch,omitempty"`
}

// CommitsComparison is the result of comparing two commits.
// See CompareCommits for details.
type CommitsComparison struct {
BaseCommit *RepositoryCommit `json:"base_commit,omitempty"`

// Head can be 'behind' or 'ahead'
Status *string `json:"status,omitempty"`
AheadBy *int `json:"ahead_by,omitempty"`
BehindBy *int `json:"behind_by,omitempty"`
TotalCommits *int `json:"total_commits,omitempty"`

Commits []RepositoryCommit `json:"commits,omitempty"`

Files []CommitFile `json:"files,omitempty"`
}

// ListCommits lists the commits of a repository.
//
// GitHub API docs: http://developer.github.com/v3/repos/commits/#list
func (s *RepositoriesService) ListCommits(owner, repo string, opts *CommitsListOptions) ([]RepositoryCommit, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/commits", owner, repo)

if opts != nil {
params := url.Values{}
params.Add("sha", opts.SHA)
params.Add("path", opts.Path)
params.Add("author", opts.Author)
if !opts.Since.IsZero() {
params.Add("since", opts.Since.Format(time.RFC3339))
}
if !opts.Until.IsZero() {
params.Add("until", opts.Until.Format(time.RFC3339))
}

u = u + "?" + params.Encode()
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

commits := new([]RepositoryCommit)
resp, err := s.client.Do(req, commits)
return *commits, resp, err
}

// GetCommit fetches the specified commit, including all details about it.
// todo: support media formats - https://github.com/google/go-github/issues/6
//
// GitHub API docs: http://developer.github.com/v3/repos/commits/#get-a-single-commit
// See also: http://developer.github.com//v3/git/commits/#get-a-single-commit provides the same functionality
func (s *RepositoriesService) GetCommit(owner, repo, sha string) (*RepositoryCommit, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

commit := new(RepositoryCommit)
resp, err := s.client.Do(req, commit)
return commit, resp, err
}

// CompareCommits compares a range of commits with each other.
// todo: support media formats - https://github.com/google/go-github/issues/6
//
// GitHub API docs: http://developer.github.com/v3/repos/commits/index.html#compare-two-commits
func (s *RepositoriesService) CompareCommits(owner, repo string, base, head string) (*CommitsComparison, *Response, error) { // todo I'm sure I missspelled this
u := fmt.Sprintf("repos/%v/%v/compare/%v...%v", owner, repo, base, head)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

comp := new(CommitsComparison)
resp, err := s.client.Do(req, comp)
return comp, resp, err
}
Loading