diff --git a/models/action.go b/models/action.go index b4f4b1cb6d0ef..a180640f409e7 100644 --- a/models/action.go +++ b/models/action.go @@ -385,7 +385,7 @@ func NewPushCommits() *PushCommits { // ToAPIPayloadCommits converts a PushCommits object to // api.PayloadCommit format. -func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit { +func (pc *PushCommits) ToAPIPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, error) { commits := make([]*api.PayloadCommit, len(pc.Commits)) if pc.emailUsers == nil { @@ -400,6 +400,8 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit if err == nil { authorUsername = author.Name pc.emailUsers[commit.AuthorEmail] = author + } else if !IsErrUserNotExist(err) { + return nil, fmt.Errorf("GetUserByEmail: %v", err) } } else { authorUsername = author.Name @@ -413,10 +415,18 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit // TODO: check errors other than email not found. committerUsername = committer.Name pc.emailUsers[commit.CommitterEmail] = committer + } else if !IsErrUserNotExist(err) { + return nil, fmt.Errorf("GetUserByEmail: %v", err) } } else { committerUsername = committer.Name } + + fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1) + if err != nil { + return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err) + } + commits[i] = &api.PayloadCommit{ ID: commit.Sha1, Message: commit.Message, @@ -431,10 +441,13 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit Email: commit.CommitterEmail, UserName: committerUsername, }, + Added: fileStatus.Added, + Removed: fileStatus.Removed, + Modified: fileStatus.Modified, Timestamp: commit.Timestamp, } } - return commits + return commits, nil } // AvatarLink tries to match user in database with e-mail @@ -820,12 +833,16 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { } if isHookEventPush { + commits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) + if err != nil { + return fmt.Errorf("ToAPIPayloadCommits: %v", err) + } if err = PrepareWebhooks(repo, HookEventPush, &api.PushPayload{ Ref: opts.RefFullName, Before: opts.OldCommitID, After: opts.NewCommitID, CompareURL: setting.AppURL + opts.Commits.CompareURL, - Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), + Commits: commits, Repo: apiRepo, Pusher: apiPusher, Sender: apiPusher, @@ -913,7 +930,10 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum] } - apiCommits := opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()) + apiCommits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) + if err != nil { + return fmt.Errorf("ToAPIPayloadCommits: %v", err) + } opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID) apiPusher := repo.MustOwner().APIFormat() diff --git a/models/action_test.go b/models/action_test.go index 9ba205731835b..b68cef744d8d1 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -104,7 +104,8 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { } pushCommits.Len = len(pushCommits.Commits) - payloadCommits := pushCommits.ToAPIPayloadCommits("/username/reponame") + payloadCommits, err := pushCommits.ToAPIPayloadCommits(RepoPath("username", "reponame"), "/username/reponame") + assert.NoError(t, err) if assert.Len(t, payloadCommits, 2) { assert.Equal(t, "abcdef1", payloadCommits[0].ID) assert.Equal(t, "message1", payloadCommits[0].Message) diff --git a/models/pull.go b/models/pull.go index fe18765fc0c78..41138c9cbe2c9 100644 --- a/models/pull.go +++ b/models/pull.go @@ -619,12 +619,18 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle l.PushFront(mergeCommit) } + commits, err := ListToPushCommits(l).ToAPIPayloadCommits(pr.BaseRepo.RepoPath(), pr.BaseRepo.HTMLURL()) + if err != nil { + log.Error("ToAPIPayloadCommits: %v", err) + return nil + } + p := &api.PushPayload{ Ref: git.BranchPrefix + pr.BaseBranch, Before: pr.MergeBase, After: mergeCommit.ID.String(), CompareURL: setting.AppURL + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), - Commits: ListToPushCommits(l).ToAPIPayloadCommits(pr.BaseRepo.HTMLURL()), + Commits: commits, Repo: pr.BaseRepo.APIFormat(mode), Pusher: pr.HeadRepo.MustOwner().APIFormat(), Sender: doer.APIFormat(),