mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Webhooks: for issue close/reopen action, add commit ID that caused it (#22583)
The `commit_id` property name is the same as equivalent functionality in GitHub. If the action was not caused by a commit, an empty string is used. This can for example be used to automatically add a Resolved label to an issue fixed by a commit, or clear it when the issue is reopened.
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							a31fedd2c2
						
					
				
				
					commit
					c8139c0f64
				
			@@ -193,7 +193,7 @@ func UpdateIssuesCommit(doer *user_model.User, repo *repo_model.Repository, comm
 | 
			
		||||
			}
 | 
			
		||||
			if close != refIssue.IsClosed {
 | 
			
		||||
				refIssue.Repo = refRepo
 | 
			
		||||
				if err := ChangeStatus(refIssue, doer, close); err != nil {
 | 
			
		||||
				if err := ChangeStatus(refIssue, doer, c.Sha1, close); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ChangeStatus changes issue status to open or closed.
 | 
			
		||||
func ChangeStatus(issue *issues_model.Issue, doer *user_model.User, closed bool) error {
 | 
			
		||||
	return changeStatusCtx(db.DefaultContext, issue, doer, closed)
 | 
			
		||||
func ChangeStatus(issue *issues_model.Issue, doer *user_model.User, commitID string, closed bool) error {
 | 
			
		||||
	return changeStatusCtx(db.DefaultContext, issue, doer, commitID, closed)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// changeStatusCtx changes issue status to open or closed.
 | 
			
		||||
// TODO: if context is not db.DefaultContext we get a deadlock!!!
 | 
			
		||||
func changeStatusCtx(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, closed bool) error {
 | 
			
		||||
func changeStatusCtx(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, commitID string, closed bool) error {
 | 
			
		||||
	comment, err := issues_model.ChangeIssueStatus(ctx, issue, doer, closed)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if issues_model.IsErrDependenciesLeft(err) && closed {
 | 
			
		||||
@@ -37,7 +37,7 @@ func changeStatusCtx(ctx context.Context, issue *issues_model.Issue, doer *user_
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	notification.NotifyIssueChangeStatus(ctx, doer, issue, comment, closed)
 | 
			
		||||
	notification.NotifyIssueChangeStatus(ctx, doer, commitID, issue, comment, closed)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -225,7 +225,7 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
 | 
			
		||||
		}
 | 
			
		||||
		close := ref.RefAction == references.XRefActionCloses
 | 
			
		||||
		if close != ref.Issue.IsClosed {
 | 
			
		||||
			if err = issue_service.ChangeStatus(ref.Issue, doer, close); err != nil {
 | 
			
		||||
			if err = issue_service.ChangeStatus(ref.Issue, doer, pr.MergedCommitID, close); err != nil {
 | 
			
		||||
				// Allow ErrDependenciesLeft
 | 
			
		||||
				if !issues_model.IsErrDependenciesLeft(err) {
 | 
			
		||||
					return err
 | 
			
		||||
 
 | 
			
		||||
@@ -532,7 +532,7 @@ func CloseBranchPulls(doer *user_model.User, repoID int64, branch string) error
 | 
			
		||||
 | 
			
		||||
	var errs errlist
 | 
			
		||||
	for _, pr := range prs {
 | 
			
		||||
		if err = issue_service.ChangeStatus(pr.Issue, doer, true); err != nil && !issues_model.IsErrPullWasClosed(err) && !issues_model.IsErrDependenciesLeft(err) {
 | 
			
		||||
		if err = issue_service.ChangeStatus(pr.Issue, doer, "", true); err != nil && !issues_model.IsErrPullWasClosed(err) && !issues_model.IsErrDependenciesLeft(err) {
 | 
			
		||||
			errs = append(errs, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -566,7 +566,7 @@ func CloseRepoBranchesPulls(ctx context.Context, doer *user_model.User, repo *re
 | 
			
		||||
			if pr.BaseRepoID == repo.ID {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if err = issue_service.ChangeStatus(pr.Issue, doer, true); err != nil && !issues_model.IsErrPullWasClosed(err) {
 | 
			
		||||
			if err = issue_service.ChangeStatus(pr.Issue, doer, "", true); err != nil && !issues_model.IsErrPullWasClosed(err) {
 | 
			
		||||
				errs = append(errs, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -229,7 +229,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(ctx context.Context, doer *user
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, actionComment *issues_model.Comment, isClosed bool) {
 | 
			
		||||
func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *user_model.User, commitID string, issue *issues_model.Issue, actionComment *issues_model.Comment, isClosed bool) {
 | 
			
		||||
	mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo)
 | 
			
		||||
	var err error
 | 
			
		||||
	if issue.IsPull {
 | 
			
		||||
@@ -243,6 +243,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use
 | 
			
		||||
			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
 | 
			
		||||
			Repository:  convert.ToRepo(ctx, issue.Repo, mode),
 | 
			
		||||
			Sender:      convert.ToUser(doer, nil),
 | 
			
		||||
			CommitID:    commitID,
 | 
			
		||||
		}
 | 
			
		||||
		if isClosed {
 | 
			
		||||
			apiPullRequest.Action = api.HookIssueClosed
 | 
			
		||||
@@ -256,6 +257,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use
 | 
			
		||||
			Issue:      convert.ToAPIIssue(ctx, issue),
 | 
			
		||||
			Repository: convert.ToRepo(ctx, issue.Repo, mode),
 | 
			
		||||
			Sender:     convert.ToUser(doer, nil),
 | 
			
		||||
			CommitID:   commitID,
 | 
			
		||||
		}
 | 
			
		||||
		if isClosed {
 | 
			
		||||
			apiIssue.Action = api.HookIssueClosed
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user