fix(api): edit and delete repository labels by name (#39974)

Repo and org label endpoints accepted a label name for GET but only a
numeric ID for PATCH and DELETE, which breaks label-sync style tools.

- PATCH and DELETE on `/repos/{owner}/{repo}/labels/{id}` and
`/orgs/{org}/labels/{id}` accept a label name when the value is not
numeric, numeric values stay IDs
- A name shared by several labels returns 400 instead of acting on an
arbitrary one
- Deleting a missing label returns 404 instead of 204
- The swagger `id` parameter of these endpoints is now a string

Fixes: https://github.com/go-gitea/gitea/issues/34937
Co-authored-by: Hello-Liar <80651389+Hello-Liar@users.noreply.github.com>
Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
authored and GitHub committed 2026-10-30 19:48:56 +00:00
1 parent 2a2fb86ca0
commit cbb563b080
7 files changed
+100 -107

No files matched your search

+9 -3
View File
@@ -6,6 +6,7 @@ package integration
import (
"fmt"
"net/http"
"net/url"
"strings"
"testing"
@@ -116,7 +117,7 @@ func TestAPIModifyLabels(t *testing.T) {
assert.Equal(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
// EditLabel
newName := "LabelNewName"
newName := "scope/new name"
newColor := "09876a"
newColorWrong := "09g76a"
req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
@@ -130,11 +131,16 @@ func TestAPIModifyLabels(t *testing.T) {
Color: &newColorWrong,
}).AddTokenAuth(token)
MakeRequest(t, req, http.StatusUnprocessableEntity)
nameURLStr := urlStr + "/" + url.PathEscape(newName)
req = NewRequestWithJSON(t, "PATCH", nameURLStr, &api.EditLabelOption{}).AddTokenAuth(token)
resp = MakeRequest(t, req, http.StatusOK)
assert.Equal(t, dbLabel.ID, DecodeJSON(t, resp, &api.Label{}).ID)
// DeleteLabel
req = NewRequest(t, "DELETE", singleURLStr).
AddTokenAuth(token)
req = NewRequest(t, "DELETE", nameURLStr).AddTokenAuth(token)
MakeRequest(t, req, http.StatusNoContent)
req = NewRequest(t, "DELETE", singleURLStr).AddTokenAuth(token)
MakeRequest(t, req, http.StatusNotFound)
})
}
}