diff options
author | John Olheiser <john.olheiser@gmail.com> | 2020-10-30 20:56:34 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-30 20:56:34 -0500 |
commit | b5e974c8a5a90e7c166792d03d97f2ea5b6cfba6 (patch) | |
tree | c51509fa18331af3ac8ec15e612958fb2e456d6c /routers | |
parent | e16a5bb6346642a16ea31e7a7eb312c2594513cc (diff) | |
download | gitea-b5e974c8a5a90e7c166792d03d97f2ea5b6cfba6.tar.gz gitea-b5e974c8a5a90e7c166792d03d97f2ea5b6cfba6.zip |
Delete tag API (#13358)
* Delete tag API
Signed-off-by: jolheiser <john.olheiser@gmail.com>
* Wording
Signed-off-by: jolheiser <john.olheiser@gmail.com>
* Add conflict response and fix API tests
Signed-off-by: jolheiser <john.olheiser@gmail.com>
* Fix other test
Signed-off-by: jolheiser <john.olheiser@gmail.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/api.go | 4 | ||||
-rw-r--r-- | routers/api/v1/repo/release_tags.go | 55 |
2 files changed, 58 insertions, 1 deletions
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 147cb8e276..42489cd4a6 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -798,7 +798,9 @@ func RegisterRoutes(m *macaron.Macaron) { }) }) m.Group("/tags", func() { - m.Get("/:tag", repo.GetReleaseTag) + m.Combo("/:tag"). + Get(repo.GetReleaseTag). + Delete(reqToken(), reqRepoWriter(models.UnitTypeReleases), repo.DeleteReleaseTag) }) }, reqRepoReader(models.UnitTypeReleases)) m.Post("/mirror-sync", reqToken(), reqRepoWriter(models.UnitTypeCode), repo.MirrorSync) diff --git a/routers/api/v1/repo/release_tags.go b/routers/api/v1/repo/release_tags.go index 2a72e0000e..ef07ce5e1a 100644 --- a/routers/api/v1/repo/release_tags.go +++ b/routers/api/v1/repo/release_tags.go @@ -5,11 +5,13 @@ package repo import ( + "errors" "net/http" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" + releaseservice "code.gitea.io/gitea/services/release" ) // GetReleaseTag get a single release of a repository by its tagname @@ -59,3 +61,56 @@ func GetReleaseTag(ctx *context.APIContext) { } ctx.JSON(http.StatusOK, convert.ToRelease(release)) } + +// DeleteReleaseTag delete a tag from a repository +func DeleteReleaseTag(ctx *context.APIContext) { + // swagger:operation DELETE /repos/{owner}/{repo}/releases/tags/{tag} repository repoDeleteReleaseTag + // --- + // summary: Delete a release tag + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: tag + // in: path + // description: name of the tag to delete + // type: string + // required: true + // responses: + // "204": + // "$ref": "#/responses/empty" + // "404": + // "$ref": "#/responses/notFound" + // "409": + // "$ref": "#/responses/conflict" + + tag := ctx.Params(":tag") + + release, err := models.GetRelease(ctx.Repo.Repository.ID, tag) + if err != nil { + if models.IsErrReleaseNotExist(err) { + ctx.Error(http.StatusNotFound, "GetRelease", err) + return + } + ctx.Error(http.StatusInternalServerError, "GetRelease", err) + return + } + + if !release.IsTag { + ctx.Error(http.StatusConflict, "IsTag", errors.New("a tag attached to a release cannot be deleted directly")) + return + } + + if err := releaseservice.DeleteReleaseByID(release.ID, ctx.User, true); err != nil { + ctx.Error(http.StatusInternalServerError, "DeleteReleaseByID", err) + } + + ctx.Status(http.StatusNoContent) +} |