Skip to content

Commit 4567a3a

Browse files
authored
Allow to sync tags from admin dashboard (#28045)
Inspired by #28043 This PR adds a option to the Admin Dashboard to sync all tags to the database. ![grafik](https://github.com/go-gitea/gitea/assets/15185051/26ac51ef-82a4-4fd9-a6a6-5aefec612ff6)
1 parent f3ba3e9 commit 4567a3a

File tree

7 files changed

+100
-0
lines changed

7 files changed

+100
-0
lines changed

modules/repository/repo.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,22 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo
284284
return repo, UpdateRepository(ctx, repo, false)
285285
}
286286

287+
// SyncRepoTags synchronizes releases table with repository tags
288+
func SyncRepoTags(ctx context.Context, repoID int64) error {
289+
repo, err := repo_model.GetRepositoryByID(ctx, repoID)
290+
if err != nil {
291+
return err
292+
}
293+
294+
gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
295+
if err != nil {
296+
return err
297+
}
298+
defer gitRepo.Close()
299+
300+
return SyncReleasesWithTags(ctx, repo, gitRepo)
301+
}
302+
287303
// SyncReleasesWithTags synchronizes release table with repository tags
288304
func SyncReleasesWithTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository) error {
289305
log.Debug("SyncReleasesWithTags: in Repo[%d:%s/%s]", repo.ID, repo.OwnerName, repo.Name)

options/locale/locale_en-US.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2748,6 +2748,7 @@ dashboard.delete_missing_repos = Delete all repositories missing their Git files
27482748
dashboard.delete_missing_repos.started = Delete all repositories missing their Git files task started.
27492749
dashboard.delete_generated_repository_avatars = Delete generated repository avatars
27502750
dashboard.sync_repo_branches = Sync missed branches from git data to databases
2751+
dashboard.sync_repo_tags = Sync tags from git data to database
27512752
dashboard.update_mirrors = Update Mirrors
27522753
dashboard.repo_health_check = Health check all repositories
27532754
dashboard.check_repo_stats = Check all repository statistics
@@ -2802,6 +2803,7 @@ dashboard.stop_endless_tasks = Stop endless tasks
28022803
dashboard.cancel_abandoned_jobs = Cancel abandoned jobs
28032804
dashboard.start_schedule_tasks = Start schedule tasks
28042805
dashboard.sync_branch.started = Branches Sync started
2806+
dashboard.sync_tag.started = Tags Sync started
28052807
dashboard.rebuild_issue_indexer = Rebuild issue indexer
28062808

28072809
users.user_manage_panel = User Account Management

routers/init.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
repo_migrations "code.gitea.io/gitea/services/migrations"
4646
mirror_service "code.gitea.io/gitea/services/mirror"
4747
pull_service "code.gitea.io/gitea/services/pull"
48+
release_service "code.gitea.io/gitea/services/release"
4849
repo_service "code.gitea.io/gitea/services/repository"
4950
"code.gitea.io/gitea/services/repository/archiver"
5051
"code.gitea.io/gitea/services/task"
@@ -138,6 +139,8 @@ func InitWebInstalled(ctx context.Context) {
138139
mustInit(system.Init)
139140
mustInitCtx(ctx, oauth2.Init)
140141

142+
mustInit(release_service.Init)
143+
141144
mustInitCtx(ctx, models.Init)
142145
mustInitCtx(ctx, authmodel.Init)
143146
mustInitCtx(ctx, repo_service.Init)

routers/web/admin/admin.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"code.gitea.io/gitea/modules/web"
2424
"code.gitea.io/gitea/services/cron"
2525
"code.gitea.io/gitea/services/forms"
26+
release_service "code.gitea.io/gitea/services/release"
2627
repo_service "code.gitea.io/gitea/services/repository"
2728
)
2829

@@ -157,6 +158,13 @@ func DashboardPost(ctx *context.Context) {
157158
}
158159
}()
159160
ctx.Flash.Success(ctx.Tr("admin.dashboard.sync_branch.started"))
161+
case "sync_repo_tags":
162+
go func() {
163+
if err := release_service.AddAllRepoTagsToSyncQueue(graceful.GetManager().ShutdownContext()); err != nil {
164+
log.Error("AddAllRepoTagsToSyncQueue: %v: %v", ctx.Doer.ID, err)
165+
}
166+
}()
167+
ctx.Flash.Success(ctx.Tr("admin.dashboard.sync_tag.started"))
160168
default:
161169
task := cron.GetTask(form.Op)
162170
if task != nil {

services/release/release.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
user_model "code.gitea.io/gitea/models/user"
1717
"code.gitea.io/gitea/modules/container"
1818
"code.gitea.io/gitea/modules/git"
19+
"code.gitea.io/gitea/modules/graceful"
1920
"code.gitea.io/gitea/modules/log"
2021
"code.gitea.io/gitea/modules/repository"
2122
"code.gitea.io/gitea/modules/storage"
@@ -370,3 +371,8 @@ func DeleteReleaseByID(ctx context.Context, repo *repo_model.Repository, rel *re
370371

371372
return nil
372373
}
374+
375+
// Init start release service
376+
func Init() error {
377+
return initTagSyncQueue(graceful.GetManager().ShutdownContext())
378+
}

services/release/tag.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
}

templates/admin/dashboard.tmpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
<td>{{ctx.Locale.Tr "admin.dashboard.sync_repo_branches"}}</td>
6464
<td class="text right"><button type="submit" class="ui primary button" name="op" value="sync_repo_branches">{{svg "octicon-play"}} {{ctx.Locale.Tr "admin.dashboard.operation_run"}}</button></td>
6565
</tr>
66+
<tr>
67+
<td>{{ctx.Locale.Tr "admin.dashboard.sync_repo_tags"}}</td>
68+
<td class="text right"><button type="submit" class="ui primary button" name="op" value="sync_repo_tags">{{svg "octicon-play"}} {{ctx.Locale.Tr "admin.dashboard.operation_run"}}</button></td>
69+
</tr>
6670
</tbody>
6771
</table>
6872
</form>

0 commit comments

Comments
 (0)