-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Mail assignee when issue/pull request is assigned #8546
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 8 commits
fb0bb14
385c14d
27bbc9d
b063676
1374db5
a3556c9
630dceb
18187fa
99f8db4
ba31fed
04450f9
fea106d
5f6f77f
15b84ed
a7562d1
075c7c6
e0b2648
0d5202c
e761790
abc21a5
430a3c8
4c10b70
152fef9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -110,73 +110,62 @@ func clearAssigneeByUserID(sess *xorm.Session, userID int64) (err error) { | |
return | ||
} | ||
|
||
// AddAssigneeIfNotAssigned adds an assignee only if he isn't aleady assigned to the issue | ||
func AddAssigneeIfNotAssigned(issue *Issue, doer *User, assigneeID int64) (err error) { | ||
// Check if the user is already assigned | ||
isAssigned, err := IsUserAssignedToIssue(issue, &User{ID: assigneeID}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if !isAssigned { | ||
return issue.ChangeAssignee(doer, assigneeID) | ||
} | ||
return nil | ||
} | ||
|
||
// UpdateAssignee deletes or adds an assignee to an issue | ||
func UpdateAssignee(issue *Issue, doer *User, assigneeID int64) (err error) { | ||
return issue.ChangeAssignee(doer, assigneeID) | ||
_, err = issue.ChangeAssignee(doer, assigneeID) | ||
return err | ||
} | ||
|
||
// ChangeAssignee changes the Assignee of this issue. | ||
func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { | ||
func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (removed bool, err error) { | ||
sess := x.NewSession() | ||
defer sess.Close() | ||
|
||
if err := sess.Begin(); err != nil { | ||
return err | ||
return false, err | ||
} | ||
|
||
if err := issue.changeAssignee(sess, doer, assigneeID, false); err != nil { | ||
return err | ||
removed, err = issue.changeAssignee(sess, doer, assigneeID, false) | ||
if err != nil { | ||
return false, err | ||
} | ||
|
||
if err := sess.Commit(); err != nil { | ||
return err | ||
return false, err | ||
} | ||
|
||
go HookQueue.Add(issue.RepoID) | ||
return nil | ||
|
||
return removed, nil | ||
} | ||
|
||
func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID int64, isCreate bool) (err error) { | ||
func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID int64, isCreate bool) (removed bool, err error) { | ||
// Update the assignee | ||
removed, err := updateIssueAssignee(sess, issue, assigneeID) | ||
removed, err = updateIssueAssignee(sess, issue, assigneeID) | ||
davidsvantesson marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if err != nil { | ||
return fmt.Errorf("UpdateIssueUserByAssignee: %v", err) | ||
return false, fmt.Errorf("UpdateIssueUserByAssignee: %v", err) | ||
} | ||
|
||
// Repo infos | ||
if err = issue.loadRepo(sess); err != nil { | ||
return fmt.Errorf("loadRepo: %v", err) | ||
return false, fmt.Errorf("loadRepo: %v", err) | ||
} | ||
|
||
// Comment | ||
if _, err = createAssigneeComment(sess, doer, issue.Repo, issue, assigneeID, removed); err != nil { | ||
return fmt.Errorf("createAssigneeComment: %v", err) | ||
return false, fmt.Errorf("createAssigneeComment: %v", err) | ||
} | ||
|
||
// if pull request is in the middle of creation - don't call webhook | ||
if isCreate { | ||
return nil | ||
return removed, err | ||
} | ||
|
||
if issue.IsPull { | ||
mode, _ := accessLevelUnit(sess, doer, issue.Repo, UnitTypePullRequests) | ||
|
||
if err = issue.loadPullRequest(sess); err != nil { | ||
return fmt.Errorf("loadPullRequest: %v", err) | ||
return false, fmt.Errorf("loadPullRequest: %v", err) | ||
} | ||
issue.PullRequest.Issue = issue | ||
apiPullRequest := &api.PullRequestPayload{ | ||
|
@@ -192,7 +181,7 @@ func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID in | |
} | ||
if err := prepareWebhooks(sess, issue.Repo, HookEventPullRequest, apiPullRequest); err != nil { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The webhooks part doesn't seem related with changing assignees. I thihk it should be moved to another function. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually it is, below is help text for PR trigger event. 😉
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Oh, that's not what I meant. 😄 What I meant is that this code seems to belong to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Aha, yes you are probably right, but I will leave out that refactoring from this PR. I think we should have some design guidelines what type of code should be where. I think I've started to understand Gitea's code structure now.... |
||
log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | ||
return nil | ||
return false, err | ||
} | ||
} else { | ||
mode, _ := accessLevelUnit(sess, doer, issue.Repo, UnitTypeIssues) | ||
|
@@ -210,65 +199,10 @@ func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID in | |
} | ||
if err := prepareWebhooks(sess, issue.Repo, HookEventIssues, apiIssue); err != nil { | ||
log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | ||
return nil | ||
} | ||
} | ||
return nil | ||
} | ||
|
||
// UpdateAPIAssignee is a helper function to add or delete one or multiple issue assignee(s) | ||
// Deleting is done the GitHub way (quote from their api documentation): | ||
// https://developer.github.com/v3/issues/#edit-an-issue | ||
// "assignees" (array): Logins for Users to assign to this issue. | ||
// Pass one or more user logins to replace the set of assignees on this Issue. | ||
// Send an empty array ([]) to clear all assignees from the Issue. | ||
func UpdateAPIAssignee(issue *Issue, oneAssignee string, multipleAssignees []string, doer *User) (err error) { | ||
var allNewAssignees []*User | ||
|
||
// Keep the old assignee thingy for compatibility reasons | ||
if oneAssignee != "" { | ||
// Prevent double adding assignees | ||
var isDouble bool | ||
for _, assignee := range multipleAssignees { | ||
if assignee == oneAssignee { | ||
isDouble = true | ||
break | ||
} | ||
} | ||
|
||
if !isDouble { | ||
multipleAssignees = append(multipleAssignees, oneAssignee) | ||
} | ||
} | ||
|
||
// Loop through all assignees to add them | ||
for _, assigneeName := range multipleAssignees { | ||
assignee, err := GetUserByName(assigneeName) | ||
if err != nil { | ||
return err | ||
return false, err | ||
} | ||
|
||
allNewAssignees = append(allNewAssignees, assignee) | ||
} | ||
|
||
// Delete all old assignees not passed | ||
if err = DeleteNotPassedAssignee(issue, doer, allNewAssignees); err != nil { | ||
return err | ||
} | ||
|
||
// Add all new assignees | ||
// Update the assignee. The function will check if the user exists, is already | ||
// assigned (which he shouldn't as we deleted all assignees before) and | ||
// has access to the repo. | ||
for _, assignee := range allNewAssignees { | ||
// Extra method to prevent double adding (which would result in removing) | ||
err = AddAssigneeIfNotAssigned(issue, doer, assignee.ID) | ||
if err != nil { | ||
return err | ||
} | ||
} | ||
|
||
return | ||
return removed, nil | ||
} | ||
|
||
// MakeIDsFromAPIAssigneesToAdd returns an array with all assignee IDs | ||
|
Uh oh!
There was an error while loading. Please reload this page.