@@ -167,69 +167,25 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
167
167
}
168
168
}
169
169
170
- branch := opts .RefFullName .BranchName ()
171
170
if ! opts .IsDelRef () {
171
+ branch := opts .RefFullName .BranchName ()
172
+
172
173
log .Trace ("TriggerTask '%s/%s' by %s" , repo .Name , branch , pusher .Name )
173
174
174
175
newCommit , err := gitRepo .GetCommit (opts .NewCommitID )
175
176
if err != nil {
176
177
return fmt .Errorf ("gitRepo.GetCommit(%s) in %s/%s[%d]: %w" , opts .NewCommitID , repo .OwnerName , repo .Name , repo .ID , err )
177
178
}
178
179
179
- refName := opts .RefName ()
180
-
181
180
// Push new branch.
182
181
var l []* git.Commit
183
182
if opts .IsNewRef () {
184
- if repo .IsEmpty { // Change default branch and empty status only if pushed ref is non-empty branch.
185
- repo .DefaultBranch = refName
186
- repo .IsEmpty = false
187
- if repo .DefaultBranch != setting .Repository .DefaultBranch {
188
- if err := gitrepo .SetDefaultBranch (ctx , repo , repo .DefaultBranch ); err != nil {
189
- return err
190
- }
191
- }
192
- // Update the is empty and default_branch columns
193
- if err := repo_model .UpdateRepositoryCols (ctx , repo , "default_branch" , "is_empty" ); err != nil {
194
- return fmt .Errorf ("UpdateRepositoryCols: %w" , err )
195
- }
196
- }
197
-
198
- l , err = newCommit .CommitsBeforeLimit (10 )
199
- if err != nil {
200
- return fmt .Errorf ("newCommit.CommitsBeforeLimit: %w" , err )
201
- }
202
- notify_service .CreateRef (ctx , pusher , repo , opts .RefFullName , opts .NewCommitID )
183
+ l , err = pushNewBranch (ctx , repo , pusher , opts , newCommit )
203
184
} else {
204
- l , err = newCommit .CommitsBeforeUntil (opts .OldCommitID )
205
- if err != nil {
206
- return fmt .Errorf ("newCommit.CommitsBeforeUntil: %w" , err )
207
- }
208
-
209
- isForcePush , err := newCommit .IsForcePush (opts .OldCommitID )
210
- if err != nil {
211
- log .Error ("IsForcePush %s:%s failed: %v" , repo .FullName (), branch , err )
212
- }
213
-
214
- // only update branch can trigger pull request task because the pull request hasn't been created yet when creaing a branch
215
- go pull_service .AddTestPullRequestTask (pull_service.TestPullRequestOptions {
216
- RepoID : repo .ID ,
217
- Doer : pusher ,
218
- Branch : branch ,
219
- IsSync : true ,
220
- IsForcePush : isForcePush ,
221
- OldCommitID : opts .OldCommitID ,
222
- NewCommitID : opts .NewCommitID ,
223
- })
224
-
225
- if isForcePush {
226
- log .Trace ("Push %s is a force push" , opts .NewCommitID )
227
-
228
- cache .Remove (repo .GetCommitsCountCacheKey (opts .RefName (), true ))
229
- } else {
230
- // TODO: increment update the commit count cache but not remove
231
- cache .Remove (repo .GetCommitsCountCacheKey (opts .RefName (), true ))
232
- }
185
+ l , err = pushUpdateBranch (ctx , repo , pusher , opts , newCommit )
186
+ }
187
+ if err != nil {
188
+ return err
233
189
}
234
190
235
191
// delete cache for divergence
@@ -246,36 +202,11 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
246
202
commits := repo_module .GitToPushCommits (l )
247
203
commits .HeadCommit = repo_module .CommitToPushCommit (newCommit )
248
204
249
- if err := issue_service .UpdateIssuesCommit (ctx , pusher , repo , commits .Commits , refName ); err != nil {
205
+ if err := issue_service .UpdateIssuesCommit (ctx , pusher , repo , commits .Commits , opts . RefName () ); err != nil {
250
206
log .Error ("updateIssuesCommit: %v" , err )
251
207
}
252
208
253
- oldCommitID := opts .OldCommitID
254
- if oldCommitID == objectFormat .EmptyObjectID ().String () && len (commits .Commits ) > 0 {
255
- oldCommit , err := gitRepo .GetCommit (commits .Commits [len (commits .Commits )- 1 ].Sha1 )
256
- if err != nil && ! git .IsErrNotExist (err ) {
257
- log .Error ("unable to GetCommit %s from %-v: %v" , oldCommitID , repo , err )
258
- }
259
- if oldCommit != nil {
260
- for i := 0 ; i < oldCommit .ParentCount (); i ++ {
261
- commitID , _ := oldCommit .ParentID (i )
262
- if ! commitID .IsZero () {
263
- oldCommitID = commitID .String ()
264
- break
265
- }
266
- }
267
- }
268
- }
269
-
270
- if oldCommitID == objectFormat .EmptyObjectID ().String () && repo .DefaultBranch != branch {
271
- oldCommitID = repo .DefaultBranch
272
- }
273
-
274
- if oldCommitID != objectFormat .EmptyObjectID ().String () {
275
- commits .CompareURL = repo .ComposeCompareURL (oldCommitID , opts .NewCommitID )
276
- } else {
277
- commits .CompareURL = ""
278
- }
209
+ commits .CompareURL = getCompareURL (repo , gitRepo , objectFormat , commits .Commits , opts )
279
210
280
211
if len (commits .Commits ) > setting .UI .FeedMaxCommitNum {
281
212
commits .Commits = commits .Commits [:setting .UI .FeedMaxCommitNum ]
@@ -288,12 +219,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
288
219
log .Error ("repo_module.CacheRef %s/%s failed: %v" , repo .ID , branch , err )
289
220
}
290
221
} else {
291
- notify_service .DeleteRef (ctx , pusher , repo , opts .RefFullName )
292
-
293
- if err := pull_service .AdjustPullsCausedByBranchDeleted (ctx , pusher , repo , branch ); err != nil {
294
- // close all related pulls
295
- log .Error ("close related pull request failed: %v" , err )
296
- }
222
+ pushDeleteBranch (ctx , repo , pusher , opts )
297
223
}
298
224
299
225
// Even if user delete a branch on a repository which he didn't watch, he will be watch that.
@@ -304,8 +230,11 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
304
230
log .Trace ("Non-tag and non-branch commits pushed." )
305
231
}
306
232
}
307
- if err := PushUpdateAddDeleteTags (ctx , repo , gitRepo , addTags , delTags ); err != nil {
308
- return fmt .Errorf ("PushUpdateAddDeleteTags: %w" , err )
233
+
234
+ if len (addTags )+ len (delTags ) > 0 {
235
+ if err := PushUpdateAddDeleteTags (ctx , repo , gitRepo , addTags , delTags ); err != nil {
236
+ return fmt .Errorf ("PushUpdateAddDeleteTags: %w" , err )
237
+ }
309
238
}
310
239
311
240
// Change repository last updated time.
@@ -316,6 +245,102 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
316
245
return nil
317
246
}
318
247
248
+ func getCompareURL (repo * repo_model.Repository , gitRepo * git.Repository , objectFormat git.ObjectFormat , commits []* repo_module.PushCommit , opts * repo_module.PushUpdateOptions ) string {
249
+ oldCommitID := opts .OldCommitID
250
+ if oldCommitID == objectFormat .EmptyObjectID ().String () && len (commits ) > 0 {
251
+ oldCommit , err := gitRepo .GetCommit (commits [len (commits )- 1 ].Sha1 )
252
+ if err != nil && ! git .IsErrNotExist (err ) {
253
+ log .Error ("unable to GetCommit %s from %-v: %v" , oldCommitID , repo , err )
254
+ }
255
+ if oldCommit != nil {
256
+ for i := 0 ; i < oldCommit .ParentCount (); i ++ {
257
+ commitID , _ := oldCommit .ParentID (i )
258
+ if ! commitID .IsZero () {
259
+ oldCommitID = commitID .String ()
260
+ break
261
+ }
262
+ }
263
+ }
264
+ }
265
+
266
+ if oldCommitID == objectFormat .EmptyObjectID ().String () && repo .DefaultBranch != opts .RefFullName .BranchName () {
267
+ oldCommitID = repo .DefaultBranch
268
+ }
269
+
270
+ if oldCommitID != objectFormat .EmptyObjectID ().String () {
271
+ return repo .ComposeCompareURL (oldCommitID , opts .NewCommitID )
272
+ }
273
+ return ""
274
+ }
275
+
276
+ func pushNewBranch (ctx context.Context , repo * repo_model.Repository , pusher * user_model.User , opts * repo_module.PushUpdateOptions , newCommit * git.Commit ) ([]* git.Commit , error ) {
277
+ if repo .IsEmpty { // Change default branch and empty status only if pushed ref is non-empty branch.
278
+ repo .DefaultBranch = opts .RefName ()
279
+ repo .IsEmpty = false
280
+ if repo .DefaultBranch != setting .Repository .DefaultBranch {
281
+ if err := gitrepo .SetDefaultBranch (ctx , repo , repo .DefaultBranch ); err != nil {
282
+ return nil , err
283
+ }
284
+ }
285
+ // Update the is empty and default_branch columns
286
+ if err := repo_model .UpdateRepositoryCols (ctx , repo , "default_branch" , "is_empty" ); err != nil {
287
+ return nil , fmt .Errorf ("UpdateRepositoryCols: %w" , err )
288
+ }
289
+ }
290
+
291
+ l , err := newCommit .CommitsBeforeLimit (10 )
292
+ if err != nil {
293
+ return nil , fmt .Errorf ("newCommit.CommitsBeforeLimit: %w" , err )
294
+ }
295
+ notify_service .CreateRef (ctx , pusher , repo , opts .RefFullName , opts .NewCommitID )
296
+ return l , nil
297
+ }
298
+
299
+ func pushUpdateBranch (_ context.Context , repo * repo_model.Repository , pusher * user_model.User , opts * repo_module.PushUpdateOptions , newCommit * git.Commit ) ([]* git.Commit , error ) {
300
+ l , err := newCommit .CommitsBeforeUntil (opts .OldCommitID )
301
+ if err != nil {
302
+ return nil , fmt .Errorf ("newCommit.CommitsBeforeUntil: %w" , err )
303
+ }
304
+
305
+ branch := opts .RefFullName .BranchName ()
306
+
307
+ isForcePush , err := newCommit .IsForcePush (opts .OldCommitID )
308
+ if err != nil {
309
+ log .Error ("IsForcePush %s:%s failed: %v" , repo .FullName (), branch , err )
310
+ }
311
+
312
+ // only update branch can trigger pull request task because the pull request hasn't been created yet when creating a branch
313
+ go pull_service .AddTestPullRequestTask (pull_service.TestPullRequestOptions {
314
+ RepoID : repo .ID ,
315
+ Doer : pusher ,
316
+ Branch : branch ,
317
+ IsSync : true ,
318
+ IsForcePush : isForcePush ,
319
+ OldCommitID : opts .OldCommitID ,
320
+ NewCommitID : opts .NewCommitID ,
321
+ })
322
+
323
+ if isForcePush {
324
+ log .Trace ("Push %s is a force push" , opts .NewCommitID )
325
+
326
+ cache .Remove (repo .GetCommitsCountCacheKey (opts .RefName (), true ))
327
+ } else {
328
+ // TODO: increment update the commit count cache but not remove
329
+ cache .Remove (repo .GetCommitsCountCacheKey (opts .RefName (), true ))
330
+ }
331
+
332
+ return l , nil
333
+ }
334
+
335
+ func pushDeleteBranch (ctx context.Context , repo * repo_model.Repository , pusher * user_model.User , opts * repo_module.PushUpdateOptions ) {
336
+ notify_service .DeleteRef (ctx , pusher , repo , opts .RefFullName )
337
+
338
+ if err := pull_service .AdjustPullsCausedByBranchDeleted (ctx , pusher , repo , opts .RefFullName .BranchName ()); err != nil {
339
+ // close all related pulls
340
+ log .Error ("close related pull request failed: %v" , err )
341
+ }
342
+ }
343
+
319
344
// PushUpdateAddDeleteTags updates a number of added and delete tags
320
345
func PushUpdateAddDeleteTags (ctx context.Context , repo * repo_model.Repository , gitRepo * git.Repository , addTags , delTags []string ) error {
321
346
return db .WithTx (ctx , func (ctx context.Context ) error {
0 commit comments