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 <paulochen@tecnico.ulisboa.pt>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
Paulo Chen
2026-03-21 06:54:28 +00:00
committed by GitHub
parent 068d7a513a
commit 0e0cf7a813
2 changed files with 34 additions and 11 deletions

View File

@@ -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)

View File

@@ -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)