From 0e0cf7a8132d64fef8a62bc05e4990c847971fbe Mon Sep 17 00:00:00 2001 From: Paulo Chen Date: Sat, 21 Mar 2026 06:54:28 +0000 Subject: [PATCH] fix #36463: preserve sort order of exclusive labels from template repo (#36931) When creating a new repository and copying issue labels from a template, the explicit sort order of exclusive labels was previously being lost (resetting to 0). This fix ensures that the original sort order for exclusive labels (e.g., 1, 2) is properly copied and retained in the newly created repository. Fixes #36463 --------- Signed-off-by: Paulo Chen Co-authored-by: wxiaoguang --- services/repository/template.go | 11 ++++++----- tests/integration/repo_test.go | 34 +++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/services/repository/template.go b/services/repository/template.go index 96033cb98d..c49e2cdde0 100644 --- a/services/repository/template.go +++ b/services/repository/template.go @@ -33,11 +33,12 @@ func GenerateIssueLabels(ctx context.Context, templateRepo, generateRepo *repo_m newLabels := make([]*issues_model.Label, 0, len(templateLabels)) for _, templateLabel := range templateLabels { newLabels = append(newLabels, &issues_model.Label{ - RepoID: generateRepo.ID, - Name: templateLabel.Name, - Exclusive: templateLabel.Exclusive, - Description: templateLabel.Description, - Color: templateLabel.Color, + RepoID: generateRepo.ID, + Name: templateLabel.Name, + Exclusive: templateLabel.Exclusive, + ExclusiveOrder: templateLabel.ExclusiveOrder, + Description: templateLabel.Description, + Color: templateLabel.Color, }) } return db.Insert(ctx, newLabels) diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 1841598285..b036ffff35 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -13,6 +13,8 @@ import ( "testing" "time" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" @@ -525,19 +527,39 @@ func TestGenerateRepository(t *testing.T) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo44 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 44}) + tmplRepoLabels := []*issues_model.Label{ + {RepoID: 44, Name: "priority/high", Exclusive: true, ExclusiveOrder: 2, Color: "#ee0000", Description: "desc-high"}, + {RepoID: 44, Name: "priority/low", Exclusive: true, ExclusiveOrder: 1, Color: "#0000ee", Description: "desc-low"}, + } + + require.NoError(t, issues_model.NewLabels(t.Context(), tmplRepoLabels...)) + generatedRepo, err := repo_service.GenerateRepository(t.Context(), user2, user2, repo44, repo_service.GenerateRepoOptions{ - Name: "generated-from-template-44", - GitContent: true, + Name: "generated-from-template-44", + GitContent: true, + IssueLabels: true, }) - assert.NoError(t, err) - assert.NotNil(t, generatedRepo) + require.NoError(t, err) + require.NotNil(t, generatedRepo) exist, err := util.IsExist(repo_model.RepoPath(user2.Name, generatedRepo.Name)) - assert.NoError(t, err) - assert.True(t, exist) + require.NoError(t, err) + require.True(t, exist) unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: user2.Name, Name: generatedRepo.Name}) + generatedLabels, err := issues_model.GetLabelsByRepoID(t.Context(), generatedRepo.ID, "", db.ListOptions{}) + require.NoError(t, err) + require.Len(t, generatedLabels, len(tmplRepoLabels)) + for i, tmplLabel := range tmplRepoLabels { + genLabel := generatedLabels[i] + assert.Equal(t, tmplLabel.Name, genLabel.Name) + assert.Equal(t, tmplLabel.Exclusive, genLabel.Exclusive) + assert.Equal(t, tmplLabel.ExclusiveOrder, genLabel.ExclusiveOrder) + assert.Equal(t, tmplLabel.Color, genLabel.Color) + assert.Equal(t, tmplLabel.Description, genLabel.Description) + } + err = repo_service.DeleteRepositoryDirectly(t.Context(), generatedRepo.ID) assert.NoError(t, err)