diff --git a/models/action.go b/models/action.go index 4b0a55921b..9bf2905c99 100644 --- a/models/action.go +++ b/models/action.go @@ -17,6 +17,7 @@ import ( "unicode" "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" @@ -385,7 +386,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 { @@ -417,6 +418,12 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit } 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 +438,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 @@ -738,7 +748,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 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 740976885e..e2546044d4 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -85,42 +85,69 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { pushCommits := NewPushCommits() pushCommits.Commits = []*PushCommit{ { - Sha1: "abcdef1", + Sha1: "69554a6", CommitterEmail: "user2@example.com", - CommitterName: "User Two", - AuthorEmail: "user4@example.com", - AuthorName: "User Four", - Message: "message1", + CommitterName: "User2", + AuthorEmail: "user2@example.com", + AuthorName: "User2", + Message: "not signed commit", }, { - Sha1: "abcdef2", + Sha1: "27566bd", CommitterEmail: "user2@example.com", - CommitterName: "User Two", + CommitterName: "User2", AuthorEmail: "user2@example.com", - AuthorName: "User Two", - Message: "message2", + AuthorName: "User2", + Message: "good signed commit (with not yet validated email)", + }, + { + Sha1: "5099b81", + CommitterEmail: "user2@example.com", + CommitterName: "User2", + AuthorEmail: "user2@example.com", + AuthorName: "User2", + Message: "good signed commit", }, } pushCommits.Len = len(pushCommits.Commits) - payloadCommits := pushCommits.ToAPIPayloadCommits("/username/reponame") - if assert.Len(t, payloadCommits, 2) { - assert.Equal(t, "abcdef1", payloadCommits[0].ID) - assert.Equal(t, "message1", payloadCommits[0].Message) - assert.Equal(t, "/username/reponame/commit/abcdef1", payloadCommits[0].URL) - assert.Equal(t, "User Two", payloadCommits[0].Committer.Name) - assert.Equal(t, "user2", payloadCommits[0].Committer.UserName) - assert.Equal(t, "User Four", payloadCommits[0].Author.Name) - assert.Equal(t, "user4", payloadCommits[0].Author.UserName) + repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository) + payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16") + assert.NoError(t, err) + assert.EqualValues(t, 3, len(payloadCommits)) - assert.Equal(t, "abcdef2", payloadCommits[1].ID) - assert.Equal(t, "message2", payloadCommits[1].Message) - assert.Equal(t, "/username/reponame/commit/abcdef2", payloadCommits[1].URL) - assert.Equal(t, "User Two", payloadCommits[1].Committer.Name) - assert.Equal(t, "user2", payloadCommits[1].Committer.UserName) - assert.Equal(t, "User Two", payloadCommits[1].Author.Name) - assert.Equal(t, "user2", payloadCommits[1].Author.UserName) - } + assert.Equal(t, "69554a6", payloadCommits[0].ID) + assert.Equal(t, "not signed commit", payloadCommits[0].Message) + assert.Equal(t, "/user2/repo16/commit/69554a6", payloadCommits[0].URL) + assert.Equal(t, "User2", payloadCommits[0].Committer.Name) + assert.Equal(t, "user2", payloadCommits[0].Committer.UserName) + assert.Equal(t, "User2", payloadCommits[0].Author.Name) + assert.Equal(t, "user2", payloadCommits[0].Author.UserName) + assert.EqualValues(t, []string{}, payloadCommits[0].Added) + assert.EqualValues(t, []string{}, payloadCommits[0].Removed) + assert.EqualValues(t, []string{"readme.md"}, payloadCommits[0].Modified) + + assert.Equal(t, "27566bd", payloadCommits[1].ID) + assert.Equal(t, "good signed commit (with not yet validated email)", payloadCommits[1].Message) + assert.Equal(t, "/user2/repo16/commit/27566bd", payloadCommits[1].URL) + assert.Equal(t, "User2", payloadCommits[1].Committer.Name) + assert.Equal(t, "user2", payloadCommits[1].Committer.UserName) + assert.Equal(t, "User2", payloadCommits[1].Author.Name) + assert.Equal(t, "user2", payloadCommits[1].Author.UserName) + assert.EqualValues(t, []string{}, payloadCommits[1].Added) + assert.EqualValues(t, []string{}, payloadCommits[1].Removed) + assert.EqualValues(t, []string{"readme.md"}, payloadCommits[1].Modified) + + assert.Equal(t, "5099b81", payloadCommits[2].ID) + assert.Equal(t, "good signed commit", payloadCommits[2].Message) + assert.Equal(t, "/user2/repo16/commit/5099b81", payloadCommits[2].URL) + assert.Equal(t, "User2", payloadCommits[2].Committer.Name) + assert.Equal(t, "user2", payloadCommits[2].Committer.UserName) + assert.Equal(t, "User2", payloadCommits[2].Author.Name) + assert.Equal(t, "user2", payloadCommits[2].Author.UserName) + assert.EqualValues(t, []string{"readme.md"}, payloadCommits[2].Added) + assert.EqualValues(t, []string{}, payloadCommits[2].Removed) + assert.EqualValues(t, []string{}, payloadCommits[2].Modified) } func TestPushCommits_AvatarLink(t *testing.T) { diff --git a/modules/repofiles/action.go b/modules/repofiles/action.go index ac5df9a14f..9467e4fb72 100644 --- a/modules/repofiles/action.go +++ b/modules/repofiles/action.go @@ -193,12 +193,16 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { } if isHookEventPush { + commits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) + if err != nil { + return err + } if err = models.PrepareWebhooks(repo, models.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, diff --git a/modules/repofiles/action_test.go b/modules/repofiles/action_test.go index 322c668dad..9ae1042e22 100644 --- a/modules/repofiles/action_test.go +++ b/modules/repofiles/action_test.go @@ -29,7 +29,7 @@ func TestCommitRepoAction(t *testing.T) { }{ { userID: 2, - repositoryID: 2, + repositoryID: 16, commitRepoActionOptions: CommitRepoActionOptions{ RefFullName: "refName", OldCommitID: "oldCommitID", @@ -37,20 +37,20 @@ func TestCommitRepoAction(t *testing.T) { Commits: &models.PushCommits{ Commits: []*models.PushCommit{ { - Sha1: "abcdef1", + Sha1: "69554a6", CommitterEmail: "user2@example.com", - CommitterName: "User Two", - AuthorEmail: "user4@example.com", - AuthorName: "User Four", - Message: "message1", + CommitterName: "User2", + AuthorEmail: "user2@example.com", + AuthorName: "User2", + Message: "not signed commit", }, { - Sha1: "abcdef2", + Sha1: "27566bd", CommitterEmail: "user2@example.com", - CommitterName: "User Two", + CommitterName: "User2", AuthorEmail: "user2@example.com", - AuthorName: "User Two", - Message: "message2", + AuthorName: "User2", + Message: "good signed commit (with not yet validated email)", }, }, Len: 2,