code.gitea.io/gitea@v1.22.3/services/release/tag.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package release 5 6 import ( 7 "context" 8 "errors" 9 "fmt" 10 11 "code.gitea.io/gitea/models/db" 12 repo_model "code.gitea.io/gitea/models/repo" 13 "code.gitea.io/gitea/modules/graceful" 14 "code.gitea.io/gitea/modules/log" 15 "code.gitea.io/gitea/modules/queue" 16 repo_module "code.gitea.io/gitea/modules/repository" 17 18 "xorm.io/builder" 19 ) 20 21 type TagSyncOptions struct { 22 RepoID int64 23 } 24 25 // tagSyncQueue represents a queue to handle tag sync jobs. 26 var tagSyncQueue *queue.WorkerPoolQueue[*TagSyncOptions] 27 28 func handlerTagSync(items ...*TagSyncOptions) []*TagSyncOptions { 29 for _, opts := range items { 30 err := repo_module.SyncRepoTags(graceful.GetManager().ShutdownContext(), opts.RepoID) 31 if err != nil { 32 log.Error("syncRepoTags [%d] failed: %v", opts.RepoID, err) 33 } 34 } 35 return nil 36 } 37 38 func addRepoToTagSyncQueue(repoID int64) error { 39 return tagSyncQueue.Push(&TagSyncOptions{ 40 RepoID: repoID, 41 }) 42 } 43 44 func initTagSyncQueue(ctx context.Context) error { 45 tagSyncQueue = queue.CreateUniqueQueue(ctx, "tag_sync", handlerTagSync) 46 if tagSyncQueue == nil { 47 return errors.New("unable to create tag_sync queue") 48 } 49 go graceful.GetManager().RunWithCancel(tagSyncQueue) 50 51 return nil 52 } 53 54 func AddAllRepoTagsToSyncQueue(ctx context.Context) error { 55 if err := db.Iterate(ctx, builder.Eq{"is_empty": false}, func(ctx context.Context, repo *repo_model.Repository) error { 56 return addRepoToTagSyncQueue(repo.ID) 57 }); err != nil { 58 return fmt.Errorf("run sync all tags failed: %v", err) 59 } 60 return nil 61 }