Skip to content

Commit 16455d3

Browse files
JakobDevGiteaBot
authored andcommitted
Don't let API add 2 exclusive labels from same scope (go-gitea#27433)
Fixes go-gitea#27380
1 parent aaf35ee commit 16455d3

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

models/issues/issue_label.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ func newIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *user_m
5454
return err
5555
}
5656

57+
issue.Labels = append(issue.Labels, label)
58+
5759
return updateLabelCols(ctx, label, "num_issues", "num_closed_issue")
5860
}
5961

@@ -122,13 +124,22 @@ func newIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer *us
122124
if err = issue.LoadRepo(ctx); err != nil {
123125
return err
124126
}
127+
128+
if err = issue.LoadLabels(ctx); err != nil {
129+
return err
130+
}
131+
125132
for _, l := range labels {
126133
// Don't add already present labels and invalid labels
127134
if HasIssueLabel(ctx, issue.ID, l.ID) ||
128135
(l.RepoID != issue.RepoID && l.OrgID != issue.Repo.OwnerID) {
129136
continue
130137
}
131138

139+
if err = RemoveDuplicateExclusiveIssueLabels(ctx, issue, l, doer); err != nil {
140+
return err
141+
}
142+
132143
if err = newIssueLabel(ctx, issue, l, doer); err != nil {
133144
return fmt.Errorf("newIssueLabel: %w", err)
134145
}

models/issues/issue_label_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package issues_test
5+
6+
import (
7+
"testing"
8+
9+
issues_model "code.gitea.io/gitea/models/issues"
10+
"code.gitea.io/gitea/models/unittest"
11+
user_model "code.gitea.io/gitea/models/user"
12+
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestNewIssueLabelsScope(t *testing.T) {
17+
assert.NoError(t, unittest.PrepareTestDatabase())
18+
19+
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 18})
20+
label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 7})
21+
label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 8})
22+
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
23+
24+
assert.NoError(t, issues_model.NewIssueLabels(issue, []*issues_model.Label{label1, label2}, doer))
25+
26+
assert.Len(t, issue.Labels, 1)
27+
assert.Equal(t, label2.ID, issue.Labels[0].ID)
28+
}

routers/api/v1/repo/issue_label.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
317317
return nil, nil, err
318318
}
319319

320-
labels, err := issues_model.GetLabelsByIDs(ctx, form.Labels, "id", "repo_id", "org_id")
320+
labels, err := issues_model.GetLabelsByIDs(ctx, form.Labels, "id", "repo_id", "org_id", "name", "exclusive")
321321
if err != nil {
322322
ctx.Error(http.StatusInternalServerError, "GetLabelsByIDs", err)
323323
return nil, nil, err

0 commit comments

Comments
 (0)