@@ -34,7 +34,8 @@ type Release struct {
34
34
NumCommitsBehind int64 `xorm:"-"`
35
35
Note string `xorm:"TEXT"`
36
36
IsDraft bool `xorm:"NOT NULL DEFAULT false"`
37
- IsPrerelease bool
37
+ IsPrerelease bool `xorm:"NOT NULL DEFAULT false"`
38
+ IsTag bool `xorm:"NOT NULL DEFAULT false"`
38
39
39
40
Attachments []* Attachment `xorm:"-"`
40
41
@@ -139,17 +140,18 @@ func createTag(gitRepo *git.Repository, rel *Release) error {
139
140
}
140
141
return err
141
142
}
142
- } else {
143
- commit , err := gitRepo .GetTagCommit (rel .TagName )
144
- if err != nil {
145
- return fmt .Errorf ("GetTagCommit: %v" , err )
146
- }
143
+ rel .LowerTagName = strings .ToLower (rel .TagName )
144
+ }
145
+ commit , err := gitRepo .GetTagCommit (rel .TagName )
146
+ if err != nil {
147
+ return fmt .Errorf ("GetTagCommit: %v" , err )
148
+ }
147
149
148
- rel .Sha1 = commit .ID .String ()
149
- rel .NumCommits , err = commit .CommitsCount ()
150
- if err != nil {
151
- return fmt . Errorf ( "CommitsCount: %v" , err )
152
- }
150
+ rel .Sha1 = commit .ID .String ()
151
+ rel .CreatedUnix = commit .Author . When . Unix ()
152
+ rel . NumCommits , err = commit . CommitsCount ()
153
+ if err != nil {
154
+ return fmt . Errorf ( "CommitsCount: %v" , err )
153
155
}
154
156
}
155
157
return nil
@@ -236,6 +238,7 @@ func GetReleaseByID(id int64) (*Release, error) {
236
238
// FindReleasesOptions describes the conditions to Find releases
237
239
type FindReleasesOptions struct {
238
240
IncludeDrafts bool
241
+ IncludeTags bool
239
242
TagNames []string
240
243
}
241
244
@@ -246,6 +249,9 @@ func (opts *FindReleasesOptions) toConds(repoID int64) builder.Cond {
246
249
if ! opts .IncludeDrafts {
247
250
cond = cond .And (builder.Eq {"is_draft" : false })
248
251
}
252
+ if ! opts .IncludeTags {
253
+ cond = cond .And (builder.Eq {"is_tag" : false })
254
+ }
249
255
if len (opts .TagNames ) > 0 {
250
256
cond = cond .And (builder .In ("tag_name" , opts .TagNames ))
251
257
}
@@ -361,6 +367,8 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release, attachmentUUIDs []stri
361
367
if err = createTag (gitRepo , rel ); err != nil {
362
368
return err
363
369
}
370
+ rel .LowerTagName = strings .ToLower (rel .TagName )
371
+
364
372
_ , err = x .Id (rel .ID ).AllCols ().Update (rel )
365
373
if err != nil {
366
374
return err
@@ -397,11 +405,64 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error {
397
405
if err != nil && ! strings .Contains (stderr , "not found" ) {
398
406
return fmt .Errorf ("git tag -d: %v - %s" , err , stderr )
399
407
}
400
- }
401
408
402
- if _ , err = x .Id (rel .ID ).Delete (new (Release )); err != nil {
403
- return fmt .Errorf ("Delete: %v" , err )
409
+ if _ , err = x .Id (rel .ID ).Delete (new (Release )); err != nil {
410
+ return fmt .Errorf ("Delete: %v" , err )
411
+ }
412
+ } else {
413
+ rel .IsTag = true
414
+ rel .IsDraft = false
415
+ rel .IsPrerelease = false
416
+ rel .Title = ""
417
+ rel .Note = ""
418
+
419
+ if _ , err = x .Id (rel .ID ).AllCols ().Update (rel ); err != nil {
420
+ return fmt .Errorf ("Update: %v" , err )
421
+ }
404
422
}
405
423
406
424
return nil
407
425
}
426
+
427
+ // SyncReleasesWithTags synchronizes release table with repository tags
428
+ func SyncReleasesWithTags (repo * Repository , gitRepo * git.Repository ) error {
429
+ existingRelTags := make (map [string ]struct {})
430
+ opts := FindReleasesOptions {IncludeDrafts : true , IncludeTags : true }
431
+ for page := 1 ; ; page ++ {
432
+ rels , err := GetReleasesByRepoID (repo .ID , opts , page , 100 )
433
+ if err != nil {
434
+ return fmt .Errorf ("GetReleasesByRepoID: %v" , err )
435
+ }
436
+ if len (rels ) == 0 {
437
+ break
438
+ }
439
+ for _ , rel := range rels {
440
+ if rel .IsDraft {
441
+ continue
442
+ }
443
+ commitID , err := gitRepo .GetTagCommitID (rel .TagName )
444
+ if err != nil {
445
+ return fmt .Errorf ("GetTagCommitID: %v" , err )
446
+ }
447
+ if ! gitRepo .IsTagExist (rel .TagName ) || commitID != rel .Sha1 {
448
+ if err := pushUpdateDeleteTag (repo , gitRepo , rel .TagName ); err != nil {
449
+ return fmt .Errorf ("pushUpdateDeleteTag: %v" , err )
450
+ }
451
+ } else {
452
+ existingRelTags [strings .ToLower (rel .TagName )] = struct {}{}
453
+ }
454
+ }
455
+ }
456
+ tags , err := gitRepo .GetTags ()
457
+ if err != nil {
458
+ return fmt .Errorf ("GetTags: %v" , err )
459
+ }
460
+ for _ , tagName := range tags {
461
+ if _ , ok := existingRelTags [strings .ToLower (tagName )]; ! ok {
462
+ if err := pushUpdateAddTag (repo , gitRepo , tagName ); err != nil {
463
+ return fmt .Errorf ("pushUpdateAddTag: %v" , err )
464
+ }
465
+ }
466
+ }
467
+ return nil
468
+ }
0 commit comments