Skip to content

Commit 09ca391

Browse files
authored
Add file status on API (#7671)
* add file status on API * fix tests * fix tests * fix tests
1 parent 5f7fcca commit 09ca391

File tree

4 files changed

+85
-41
lines changed

4 files changed

+85
-41
lines changed

models/action.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"unicode"
1818

1919
"code.gitea.io/gitea/modules/base"
20+
"code.gitea.io/gitea/modules/git"
2021
"code.gitea.io/gitea/modules/log"
2122
"code.gitea.io/gitea/modules/setting"
2223
api "code.gitea.io/gitea/modules/structs"
@@ -385,7 +386,7 @@ func NewPushCommits() *PushCommits {
385386

386387
// ToAPIPayloadCommits converts a PushCommits object to
387388
// api.PayloadCommit format.
388-
func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit {
389+
func (pc *PushCommits) ToAPIPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, error) {
389390
commits := make([]*api.PayloadCommit, len(pc.Commits))
390391

391392
if pc.emailUsers == nil {
@@ -417,6 +418,12 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit
417418
} else {
418419
committerUsername = committer.Name
419420
}
421+
422+
fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1)
423+
if err != nil {
424+
return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err)
425+
}
426+
420427
commits[i] = &api.PayloadCommit{
421428
ID: commit.Sha1,
422429
Message: commit.Message,
@@ -431,10 +438,13 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit
431438
Email: commit.CommitterEmail,
432439
UserName: committerUsername,
433440
},
441+
Added: fileStatus.Added,
442+
Removed: fileStatus.Removed,
443+
Modified: fileStatus.Modified,
434444
Timestamp: commit.Timestamp,
435445
}
436446
}
437-
return commits
447+
return commits, nil
438448
}
439449

440450
// AvatarLink tries to match user in database with e-mail
@@ -738,7 +748,10 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er
738748
opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
739749
}
740750

741-
apiCommits := opts.Commits.ToAPIPayloadCommits(repo.HTMLURL())
751+
apiCommits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL())
752+
if err != nil {
753+
return err
754+
}
742755

743756
opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
744757
apiPusher := repo.MustOwner().APIFormat()

models/action_test.go

+54-27
Original file line numberDiff line numberDiff line change
@@ -85,42 +85,69 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
8585
pushCommits := NewPushCommits()
8686
pushCommits.Commits = []*PushCommit{
8787
{
88-
Sha1: "abcdef1",
88+
Sha1: "69554a6",
8989
CommitterEmail: "[email protected]",
90-
CommitterName: "User Two",
91-
AuthorEmail: "user4@example.com",
92-
AuthorName: "User Four",
93-
Message: "message1",
90+
CommitterName: "User2",
91+
AuthorEmail: "user2@example.com",
92+
AuthorName: "User2",
93+
Message: "not signed commit",
9494
},
9595
{
96-
Sha1: "abcdef2",
96+
Sha1: "27566bd",
9797
CommitterEmail: "[email protected]",
98-
CommitterName: "User Two",
98+
CommitterName: "User2",
9999
AuthorEmail: "[email protected]",
100-
AuthorName: "User Two",
101-
Message: "message2",
100+
AuthorName: "User2",
101+
Message: "good signed commit (with not yet validated email)",
102+
},
103+
{
104+
Sha1: "5099b81",
105+
CommitterEmail: "[email protected]",
106+
CommitterName: "User2",
107+
AuthorEmail: "[email protected]",
108+
AuthorName: "User2",
109+
Message: "good signed commit",
102110
},
103111
}
104112
pushCommits.Len = len(pushCommits.Commits)
105113

106-
payloadCommits := pushCommits.ToAPIPayloadCommits("/username/reponame")
107-
if assert.Len(t, payloadCommits, 2) {
108-
assert.Equal(t, "abcdef1", payloadCommits[0].ID)
109-
assert.Equal(t, "message1", payloadCommits[0].Message)
110-
assert.Equal(t, "/username/reponame/commit/abcdef1", payloadCommits[0].URL)
111-
assert.Equal(t, "User Two", payloadCommits[0].Committer.Name)
112-
assert.Equal(t, "user2", payloadCommits[0].Committer.UserName)
113-
assert.Equal(t, "User Four", payloadCommits[0].Author.Name)
114-
assert.Equal(t, "user4", payloadCommits[0].Author.UserName)
115-
116-
assert.Equal(t, "abcdef2", payloadCommits[1].ID)
117-
assert.Equal(t, "message2", payloadCommits[1].Message)
118-
assert.Equal(t, "/username/reponame/commit/abcdef2", payloadCommits[1].URL)
119-
assert.Equal(t, "User Two", payloadCommits[1].Committer.Name)
120-
assert.Equal(t, "user2", payloadCommits[1].Committer.UserName)
121-
assert.Equal(t, "User Two", payloadCommits[1].Author.Name)
122-
assert.Equal(t, "user2", payloadCommits[1].Author.UserName)
123-
}
114+
repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository)
115+
payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16")
116+
assert.NoError(t, err)
117+
assert.EqualValues(t, 3, len(payloadCommits))
118+
119+
assert.Equal(t, "69554a6", payloadCommits[0].ID)
120+
assert.Equal(t, "not signed commit", payloadCommits[0].Message)
121+
assert.Equal(t, "/user2/repo16/commit/69554a6", payloadCommits[0].URL)
122+
assert.Equal(t, "User2", payloadCommits[0].Committer.Name)
123+
assert.Equal(t, "user2", payloadCommits[0].Committer.UserName)
124+
assert.Equal(t, "User2", payloadCommits[0].Author.Name)
125+
assert.Equal(t, "user2", payloadCommits[0].Author.UserName)
126+
assert.EqualValues(t, []string{}, payloadCommits[0].Added)
127+
assert.EqualValues(t, []string{}, payloadCommits[0].Removed)
128+
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[0].Modified)
129+
130+
assert.Equal(t, "27566bd", payloadCommits[1].ID)
131+
assert.Equal(t, "good signed commit (with not yet validated email)", payloadCommits[1].Message)
132+
assert.Equal(t, "/user2/repo16/commit/27566bd", payloadCommits[1].URL)
133+
assert.Equal(t, "User2", payloadCommits[1].Committer.Name)
134+
assert.Equal(t, "user2", payloadCommits[1].Committer.UserName)
135+
assert.Equal(t, "User2", payloadCommits[1].Author.Name)
136+
assert.Equal(t, "user2", payloadCommits[1].Author.UserName)
137+
assert.EqualValues(t, []string{}, payloadCommits[1].Added)
138+
assert.EqualValues(t, []string{}, payloadCommits[1].Removed)
139+
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[1].Modified)
140+
141+
assert.Equal(t, "5099b81", payloadCommits[2].ID)
142+
assert.Equal(t, "good signed commit", payloadCommits[2].Message)
143+
assert.Equal(t, "/user2/repo16/commit/5099b81", payloadCommits[2].URL)
144+
assert.Equal(t, "User2", payloadCommits[2].Committer.Name)
145+
assert.Equal(t, "user2", payloadCommits[2].Committer.UserName)
146+
assert.Equal(t, "User2", payloadCommits[2].Author.Name)
147+
assert.Equal(t, "user2", payloadCommits[2].Author.UserName)
148+
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[2].Added)
149+
assert.EqualValues(t, []string{}, payloadCommits[2].Removed)
150+
assert.EqualValues(t, []string{}, payloadCommits[2].Modified)
124151
}
125152

126153
func TestPushCommits_AvatarLink(t *testing.T) {

modules/repofiles/action.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,16 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
193193
}
194194

195195
if isHookEventPush {
196+
commits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL())
197+
if err != nil {
198+
return err
199+
}
196200
if err = models.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{
197201
Ref: opts.RefFullName,
198202
Before: opts.OldCommitID,
199203
After: opts.NewCommitID,
200204
CompareURL: setting.AppURL + opts.Commits.CompareURL,
201-
Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()),
205+
Commits: commits,
202206
Repo: apiRepo,
203207
Pusher: apiPusher,
204208
Sender: apiPusher,

modules/repofiles/action_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -29,28 +29,28 @@ func TestCommitRepoAction(t *testing.T) {
2929
}{
3030
{
3131
userID: 2,
32-
repositoryID: 2,
32+
repositoryID: 16,
3333
commitRepoActionOptions: CommitRepoActionOptions{
3434
RefFullName: "refName",
3535
OldCommitID: "oldCommitID",
3636
NewCommitID: "newCommitID",
3737
Commits: &models.PushCommits{
3838
Commits: []*models.PushCommit{
3939
{
40-
Sha1: "abcdef1",
40+
Sha1: "69554a6",
4141
CommitterEmail: "[email protected]",
42-
CommitterName: "User Two",
43-
AuthorEmail: "user4@example.com",
44-
AuthorName: "User Four",
45-
Message: "message1",
42+
CommitterName: "User2",
43+
AuthorEmail: "user2@example.com",
44+
AuthorName: "User2",
45+
Message: "not signed commit",
4646
},
4747
{
48-
Sha1: "abcdef2",
48+
Sha1: "27566bd",
4949
CommitterEmail: "[email protected]",
50-
CommitterName: "User Two",
50+
CommitterName: "User2",
5151
AuthorEmail: "[email protected]",
52-
AuthorName: "User Two",
53-
Message: "message2",
52+
AuthorName: "User2",
53+
Message: "good signed commit (with not yet validated email)",
5454
},
5555
},
5656
Len: 2,

0 commit comments

Comments
 (0)