From 3dd913aefcbd19258819c2b138ded64c13e75339 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 30 Jul 2019 13:53:32 +0800 Subject: [PATCH 1/4] add file status on API --- models/action.go | 19 ++++++++++++++++--- models/action_test.go | 4 +++- modules/repofiles/action.go | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/models/action.go b/models/action.go index 4b0a55921b100..9bf2905c99cea 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 740976885e1c2..435df3d512211 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -103,7 +103,9 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { } pushCommits.Len = len(pushCommits.Commits) - payloadCommits := pushCommits.ToAPIPayloadCommits("/username/reponame") + repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/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/modules/repofiles/action.go b/modules/repofiles/action.go index ac5df9a14f04f..9467e4fb72f5a 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, From ac7d92b05c33c60b36791874597a6c986c461ea1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 30 Jul 2019 16:36:27 +0800 Subject: [PATCH 2/4] fix tests --- models/action_test.go | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/models/action_test.go b/models/action_test.go index 435df3d512211..d0217e41a8c95 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -85,42 +85,42 @@ 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)", }, } pushCommits.Len = len(pushCommits.Commits) - repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) - payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/username/reponame") + repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository) + payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16") assert.NoError(t, err) 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, "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, "User Four", payloadCommits[0].Author.Name) - assert.Equal(t, "user4", payloadCommits[0].Author.UserName) + assert.Equal(t, "User2", payloadCommits[0].Author.Name) + assert.Equal(t, "user2", payloadCommits[0].Author.UserName) - 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, "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, "User Two", payloadCommits[1].Author.Name) + assert.Equal(t, "User2", payloadCommits[1].Author.Name) assert.Equal(t, "user2", payloadCommits[1].Author.UserName) } } From 5310738557aac80249b4c16d08981cc510881aa0 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 30 Jul 2019 23:44:30 +0800 Subject: [PATCH 3/4] fix tests --- modules/repofiles/action_test.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/repofiles/action_test.go b/modules/repofiles/action_test.go index 322c668dadfef..9ae1042e22ef8 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, From 6165d6322c793fc1a11cf15006add5d0ba7e102d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 31 Jul 2019 16:56:04 +0800 Subject: [PATCH 4/4] fix tests --- models/action_test.go | 59 ++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/models/action_test.go b/models/action_test.go index d0217e41a8c95..e2546044d4672 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -100,29 +100,54 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { 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) repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository) payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16") assert.NoError(t, err) - if assert.Len(t, payloadCommits, 2) { - 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.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, 3, len(payloadCommits)) + + 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) {