diff --git a/models/action.go b/models/action.go index 5dc0eb18e699e..d6c781b3cda33 100644 --- a/models/action.go +++ b/models/action.go @@ -559,6 +559,67 @@ type CommitRepoActionOptions struct { Commits *PushCommits } +func getHeadCommit(repo *Repository, headCommitID string) *api.PayloadCommit { + if headCommitID == git.EmptySHA { + return nil + } + + gitRepo, err := git.OpenRepository(repo.RepoPath()) + if err != nil { + log.Error(4, "OpenRepository[%s]: %v", repo.RepoPath(), err) + } + + headCommit, err := gitRepo.GetCommit(headCommitID) + if err != nil { + log.Error(4, "GetCommit[%s]: %v", headCommitID, err) + } + + authorUsername := "" + if author, err := GetUserByEmail(headCommit.Author.Email); err == nil { + authorUsername = author.Name + } else if !IsErrUserNotExist(err) { + log.Error(4, "GetUserByEmail: %v", err) + } + + committerUsername := "" + if committer, err := GetUserByEmail(headCommit.Committer.Email); err == nil { + committerUsername = committer.Name + } else if !IsErrUserNotExist(err) { + log.Error(4, "GetUserByEmail: %v", err) + } + + verif := ParseCommitWithSignature(headCommit) + var signature, payload string + if headCommit.Signature != nil { + signature = headCommit.Signature.Signature + payload = headCommit.Signature.Payload + } + + headPayloadCommit := &api.PayloadCommit{ + ID: headCommitID, + Message: headCommit.CommitMessage, + URL: fmt.Sprintf("%s/commit/%s", repo.HTMLURL(), headCommit.ID), + Author: &api.PayloadUser{ + Name: headCommit.Author.Name, + Email: headCommit.Author.Email, + UserName: authorUsername, + }, + Committer: &api.PayloadUser{ + Name: headCommit.Committer.Name, + Email: headCommit.Committer.Email, + UserName: committerUsername, + }, + Timestamp: headCommit.Author.When, + Verification: &api.PayloadCommitVerification{ + Verified: verif.Verified, + Reason: verif.Reason, + Signature: signature, + Payload: payload, + }, + } + return headPayloadCommit +} + // CommitRepoAction adds new commit action to the repository, and prepare // corresponding webhooks. func CommitRepoAction(opts CommitRepoActionOptions) error { @@ -720,6 +781,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { After: opts.NewCommitID, CompareURL: setting.AppURL + opts.Commits.CompareURL, Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), + HeadCommit: getHeadCommit(repo, opts.NewCommitID), Repo: apiRepo, Pusher: apiPusher, Sender: apiPusher, @@ -817,6 +879,7 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er After: opts.NewCommitID, CompareURL: setting.AppURL + opts.Commits.CompareURL, Commits: apiCommits, + HeadCommit: getHeadCommit(repo, opts.NewCommitID), Repo: repo.APIFormat(AccessModeOwner), Pusher: apiPusher, Sender: apiPusher, diff --git a/models/action_test.go b/models/action_test.go index 0310b0ad5d074..2967771476b61 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -276,11 +276,11 @@ func TestCommitRepoAction(t *testing.T) { }{ { userID: 2, - repositoryID: 2, + repositoryID: 1, commitRepoActionOptions: CommitRepoActionOptions{ RefFullName: "refName", OldCommitID: "oldCommitID", - NewCommitID: "newCommitID", + NewCommitID: "65f1bf27bc3bf70f64657658635e66094edbcb4d", Commits: &PushCommits{ avatars: make(map[string]string), Commits: []*PushCommit{ @@ -315,7 +315,7 @@ func TestCommitRepoAction(t *testing.T) { commitRepoActionOptions: CommitRepoActionOptions{ RefFullName: git.TagPrefix + "v1.1", OldCommitID: git.EmptySHA, - NewCommitID: "newCommitID", + NewCommitID: "65f1bf27bc3bf70f64657658635e66094edbcb4d", Commits: &PushCommits{}, }, action: Action{ diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index 369603694fd42..a0e2f24fa42ed 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -129,9 +129,10 @@ func TestHook(ctx *context.APIContext) { Commits: []*api.PayloadCommit{ convert.ToCommit(ctx.Repo.Repository, ctx.Repo.Commit), }, - Repo: ctx.Repo.Repository.APIFormat(models.AccessModeNone), - Pusher: ctx.User.APIFormat(), - Sender: ctx.User.APIFormat(), + HeadCommit: convert.ToCommit(ctx.Repo.Repository, ctx.Repo.Commit), + Repo: ctx.Repo.Repository.APIFormat(models.AccessModeNone), + Pusher: ctx.User.APIFormat(), + Sender: ctx.User.APIFormat(), }); err != nil { ctx.Error(500, "PrepareWebhook: ", err) return