Skip to content

Commit 19b4e3a

Browse files
committed
Refactor Push update
1 parent 1a768e5 commit 19b4e3a

File tree

2 files changed

+107
-129
lines changed

2 files changed

+107
-129
lines changed

modules/notification/action/action.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,75 @@ func (*actionNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *mode
275275
}
276276
}
277277

278+
func (a *actionNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) {
279+
data, err := json.Marshal(commits)
280+
if err != nil {
281+
log.Error("Marshal: %v", err)
282+
return
283+
}
284+
285+
opType := models.ActionCommitRepo
286+
287+
// Check it's tag push or branch.
288+
if opts.IsTag() {
289+
opType = models.ActionPushTag
290+
if opts.IsDelRef() {
291+
opType = models.ActionDeleteTag
292+
}
293+
} else if opts.IsDelRef() {
294+
opType = models.ActionDeleteBranch
295+
}
296+
297+
if err = models.NotifyWatchers(&models.Action{
298+
ActUserID: pusher.ID,
299+
ActUser: pusher,
300+
OpType: opType,
301+
Content: string(data),
302+
RepoID: repo.ID,
303+
Repo: repo,
304+
RefName: opts.RefFullName,
305+
IsPrivate: repo.IsPrivate,
306+
}); err != nil {
307+
log.Error("notifyWatchers: %v", err)
308+
}
309+
}
310+
311+
func (a *actionNotifier) NotifyCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) {
312+
opType := models.ActionCommitRepo
313+
if refType == "tag" {
314+
opType = models.ActionPushTag
315+
}
316+
if err := models.NotifyWatchers(&models.Action{
317+
ActUserID: doer.ID,
318+
ActUser: doer,
319+
OpType: opType,
320+
RepoID: repo.ID,
321+
Repo: repo,
322+
IsPrivate: repo.IsPrivate,
323+
RefName: refFullName,
324+
}); err != nil {
325+
log.Error("notifyWatchers: %v", err)
326+
}
327+
}
328+
329+
func (a *actionNotifier) NotifyDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) {
330+
opType := models.ActionDeleteBranch
331+
if refType == "tag" {
332+
opType = models.ActionDeleteTag
333+
}
334+
if err := models.NotifyWatchers(&models.Action{
335+
ActUserID: doer.ID,
336+
ActUser: doer,
337+
OpType: opType,
338+
RepoID: repo.ID,
339+
Repo: repo,
340+
IsPrivate: repo.IsPrivate,
341+
RefName: refFullName,
342+
}); err != nil {
343+
log.Error("notifyWatchers: %v", err)
344+
}
345+
}
346+
278347
func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) {
279348
data, err := json.Marshal(commits)
280349
if err != nil {

services/repository/push.go

Lines changed: 38 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package repository
66

77
import (
88
"container/list"
9-
"encoding/json"
109
"fmt"
1110
"time"
1211

@@ -90,7 +89,6 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
9089

9190
addTags := make([]string, 0, len(optsList))
9291
delTags := make([]string, 0, len(optsList))
93-
actions := make([]*commitRepoActionOptions, 0, len(optsList))
9492
var pusher *models.User
9593

9694
for _, opts := range optsList {
@@ -102,8 +100,10 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
102100
tagName := opts.TagName()
103101
if opts.IsDelRef() {
104102
delTags = append(delTags, tagName)
103+
notification.NotifyDeleteRef(pusher, repo, "tag", opts.RefFullName)
105104
} else { // is new tag
106105
addTags = append(addTags, tagName)
106+
notification.NotifyCreateRef(pusher, repo, "tag", opts.RefFullName)
107107
}
108108
} else if opts.IsBranch() { // If is branch reference
109109
if pusher == nil || pusher.ID != opts.PusherID {
@@ -123,14 +123,33 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
123123
return fmt.Errorf("gitRepo.GetCommit: %v", err)
124124
}
125125

126+
refName := opts.RefName()
127+
126128
// Push new branch.
127129
var l *list.List
128130
if opts.IsNewRef() {
129131
l, err = newCommit.CommitsBeforeLimit(10)
130132
if err != nil {
131133
return fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err)
132134
}
135+
notification.NotifyCreateRef(pusher, repo, "branch", opts.RefFullName)
133136
} else {
137+
if repo.IsEmpty { // Change default branch and empty status only if pushed ref is non-empty branch.
138+
repo.DefaultBranch = refName
139+
repo.IsEmpty = false
140+
if refName != "master" {
141+
if err := gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil {
142+
if !git.IsErrUnsupportedVersion(err) {
143+
return err
144+
}
145+
}
146+
}
147+
// Update the is empty and default_branch columns
148+
if err := models.UpdateRepositoryCols(repo, "default_branch", "is_empty"); err != nil {
149+
return fmt.Errorf("UpdateRepositoryCols: %v", err)
150+
}
151+
}
152+
134153
l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID)
135154
if err != nil {
136155
return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err)
@@ -151,7 +170,16 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
151170
}
152171
}
153172

173+
if len(commits.Commits) > setting.UI.FeedMaxCommitNum {
174+
commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum]
175+
}
176+
commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
154177
commits = repo_module.ListToPushCommits(l)
178+
notification.NotifyPushCommits(pusher, repo, opts, commits)
179+
180+
if err := repofiles.UpdateIssuesCommit(pusher, repo, commits.Commits, refName); err != nil {
181+
log.Error("updateIssuesCommit: %v", err)
182+
}
155183

156184
if err = models.RemoveDeletedBranch(repo.ID, branch); err != nil {
157185
log.Error("models.RemoveDeletedBranch %s/%s failed: %v", repo.ID, branch, err)
@@ -161,149 +189,30 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
161189
if err := repo_module.CacheRef(repo, gitRepo, opts.RefFullName); err != nil {
162190
log.Error("repo_module.CacheRef %s/%s failed: %v", repo.ID, branch, err)
163191
}
164-
} else if err = pull_service.CloseBranchPulls(pusher, repo.ID, branch); err != nil {
165-
// close all related pulls
166-
log.Error("close related pull request failed: %v", err)
192+
} else {
193+
notification.NotifyDeleteRef(pusher, repo, "branch", opts.RefFullName)
194+
if err = pull_service.CloseBranchPulls(pusher, repo.ID, branch); err != nil {
195+
// close all related pulls
196+
log.Error("close related pull request failed: %v", err)
197+
}
167198
}
168199

169200
// Even if user delete a branch on a repository which he didn't watch, he will be watch that.
170201
if err = models.WatchIfAuto(opts.PusherID, repo.ID, true); err != nil {
171202
log.Warn("Fail to perform auto watch on user %v for repo %v: %v", opts.PusherID, repo.ID, err)
172203
}
204+
} else {
205+
log.Trace("Non-tag and non-branch commits pushed.")
173206
}
174-
actions = append(actions, &commitRepoActionOptions{
175-
PushUpdateOptions: *opts,
176-
Pusher: pusher,
177-
RepoOwnerID: repo.OwnerID,
178-
Commits: commits,
179-
})
180207
}
181208
if err := repo_module.PushUpdateAddDeleteTags(repo, gitRepo, addTags, delTags); err != nil {
182209
return fmt.Errorf("PushUpdateAddDeleteTags: %v", err)
183210
}
184211

185-
if err := commitRepoAction(repo, gitRepo, actions...); err != nil {
186-
return fmt.Errorf("commitRepoAction: %v", err)
187-
}
188-
189-
return nil
190-
}
191-
192-
// commitRepoActionOptions represent options of a new commit action.
193-
type commitRepoActionOptions struct {
194-
repo_module.PushUpdateOptions
195-
196-
Pusher *models.User
197-
RepoOwnerID int64
198-
Commits *repo_module.PushCommits
199-
}
200-
201-
// commitRepoAction adds new commit action to the repository, and prepare
202-
// corresponding webhooks.
203-
func commitRepoAction(repo *models.Repository, gitRepo *git.Repository, optsList ...*commitRepoActionOptions) error {
204-
actions := make([]*models.Action, len(optsList))
205-
206-
for i, opts := range optsList {
207-
if opts.Pusher == nil || opts.Pusher.Name != opts.PusherName {
208-
var err error
209-
opts.Pusher, err = models.GetUserByName(opts.PusherName)
210-
if err != nil {
211-
return fmt.Errorf("GetUserByName [%s]: %v", opts.PusherName, err)
212-
}
213-
}
214-
215-
refName := git.RefEndName(opts.RefFullName)
216-
217-
// Change default branch and empty status only if pushed ref is non-empty branch.
218-
if repo.IsEmpty && opts.IsBranch() && !opts.IsDelRef() {
219-
repo.DefaultBranch = refName
220-
repo.IsEmpty = false
221-
if refName != "master" {
222-
if err := gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil {
223-
if !git.IsErrUnsupportedVersion(err) {
224-
return err
225-
}
226-
}
227-
}
228-
// Update the is empty and default_branch columns
229-
if err := models.UpdateRepositoryCols(repo, "default_branch", "is_empty"); err != nil {
230-
return fmt.Errorf("UpdateRepositoryCols: %v", err)
231-
}
232-
}
233-
234-
opType := models.ActionCommitRepo
235-
236-
// Check it's tag push or branch.
237-
if opts.IsTag() {
238-
opType = models.ActionPushTag
239-
if opts.IsDelRef() {
240-
opType = models.ActionDeleteTag
241-
}
242-
opts.Commits = &repo_module.PushCommits{}
243-
} else if opts.IsDelRef() {
244-
opType = models.ActionDeleteBranch
245-
opts.Commits = &repo_module.PushCommits{}
246-
} else {
247-
// if not the first commit, set the compare URL.
248-
if !opts.IsNewRef() {
249-
opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
250-
}
251-
252-
if err := repofiles.UpdateIssuesCommit(opts.Pusher, repo, opts.Commits.Commits, refName); err != nil {
253-
log.Error("updateIssuesCommit: %v", err)
254-
}
255-
}
256-
257-
if len(opts.Commits.Commits) > setting.UI.FeedMaxCommitNum {
258-
opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
259-
}
260-
261-
data, err := json.Marshal(opts.Commits)
262-
if err != nil {
263-
return fmt.Errorf("Marshal: %v", err)
264-
}
265-
266-
actions[i] = &models.Action{
267-
ActUserID: opts.Pusher.ID,
268-
ActUser: opts.Pusher,
269-
OpType: opType,
270-
Content: string(data),
271-
RepoID: repo.ID,
272-
Repo: repo,
273-
RefName: refName,
274-
IsPrivate: repo.IsPrivate,
275-
}
276-
277-
var isHookEventPush = true
278-
switch opType {
279-
case models.ActionCommitRepo: // Push
280-
if opts.IsNewBranch() {
281-
notification.NotifyCreateRef(opts.Pusher, repo, "branch", opts.RefFullName)
282-
}
283-
case models.ActionDeleteBranch: // Delete Branch
284-
notification.NotifyDeleteRef(opts.Pusher, repo, "branch", opts.RefFullName)
285-
286-
case models.ActionPushTag: // Create
287-
notification.NotifyCreateRef(opts.Pusher, repo, "tag", opts.RefFullName)
288-
289-
case models.ActionDeleteTag: // Delete Tag
290-
notification.NotifyDeleteRef(opts.Pusher, repo, "tag", opts.RefFullName)
291-
default:
292-
isHookEventPush = false
293-
}
294-
295-
if isHookEventPush {
296-
notification.NotifyPushCommits(opts.Pusher, repo, &opts.PushUpdateOptions, opts.Commits)
297-
}
298-
}
299-
300212
// Change repository last updated time.
301213
if err := models.UpdateRepositoryUpdatedTime(repo.ID, time.Now()); err != nil {
302214
return fmt.Errorf("UpdateRepositoryUpdatedTime: %v", err)
303215
}
304216

305-
if err := models.NotifyWatchers(actions...); err != nil {
306-
return fmt.Errorf("NotifyWatchers: %v", err)
307-
}
308217
return nil
309218
}

0 commit comments

Comments
 (0)