diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 21d8726f761c3..f603c8e1bbca4 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -17,7 +17,6 @@ import (
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
- "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/setting"
@@ -408,58 +407,56 @@ func NewReleasePost(ctx *context.Context) {
}
// Title of release cannot be empty
- if len(form.TagOnly) == 0 && len(form.Title) == 0 {
+ if !form.TagOnly && form.Title == "" {
ctx.RenderWithErr(ctx.Tr("repo.release.title_empty"), tplReleaseNew, &form)
return
}
- var attachmentUUIDs []string
- if setting.Attachment.Enabled {
- attachmentUUIDs = form.Files
+ handleTagReleaseError := func(err error) {
+ ctx.Data["Err_TagName"] = true
+ switch {
+ case release_service.IsErrTagAlreadyExists(err):
+ ctx.RenderWithErr(ctx.Tr("repo.branch.tag_collision", form.TagName), tplReleaseNew, &form)
+ case repo_model.IsErrReleaseAlreadyExist(err):
+ ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form)
+ case release_service.IsErrInvalidTagName(err):
+ ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_invalid"), tplReleaseNew, &form)
+ case release_service.IsErrProtectedTagName(err):
+ ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_protected"), tplReleaseNew, &form)
+ default:
+ ctx.ServerError("handleTagReleaseError", err)
+ }
}
rel, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, form.TagName)
- if err != nil {
- if !repo_model.IsErrReleaseNotExist(err) {
- ctx.ServerError("GetRelease", err)
- return
- }
-
- msg := ""
- if len(form.Title) > 0 && form.AddTagMsg {
- msg = form.Title + "\n\n" + form.Content
- }
-
- if len(form.TagOnly) > 0 {
- if err = release_service.CreateNewTag(ctx, ctx.Doer, ctx.Repo.Repository, form.Target, form.TagName, msg); err != nil {
- if release_service.IsErrTagAlreadyExists(err) {
- e := err.(release_service.ErrTagAlreadyExists)
- ctx.Flash.Error(ctx.Tr("repo.branch.tag_collision", e.TagName))
- ctx.Redirect(ctx.Repo.RepoLink + "/src/" + ctx.Repo.RefTypeNameSubURL())
- return
- }
-
- if release_service.IsErrInvalidTagName(err) {
- ctx.Flash.Error(ctx.Tr("repo.release.tag_name_invalid"))
- ctx.Redirect(ctx.Repo.RepoLink + "/src/" + ctx.Repo.RefTypeNameSubURL())
- return
- }
-
- if release_service.IsErrProtectedTagName(err) {
- ctx.Flash.Error(ctx.Tr("repo.release.tag_name_protected"))
- ctx.Redirect(ctx.Repo.RepoLink + "/src/" + ctx.Repo.RefTypeNameSubURL())
- return
- }
+ if err != nil && !repo_model.IsErrReleaseNotExist(err) {
+ ctx.ServerError("GetRelease", err)
+ return
+ }
- ctx.ServerError("release_service.CreateNewTag", err)
- return
- }
+ newTagMsg := ""
+ if form.Title != "" && form.AddTagMsg {
+ newTagMsg = form.Title + "\n\n" + form.Content
+ }
- ctx.Flash.Success(ctx.Tr("repo.tag.create_success", form.TagName))
- ctx.Redirect(ctx.Repo.RepoLink + "/src/tag/" + util.PathEscapeSegments(form.TagName))
+ // no release, and tag only
+ if rel == nil && form.TagOnly {
+ if err = release_service.CreateNewTag(ctx, ctx.Doer, ctx.Repo.Repository, form.Target, form.TagName, newTagMsg); err != nil {
+ handleTagReleaseError(err)
return
}
+ ctx.Flash.Success(ctx.Tr("repo.tag.create_success", form.TagName))
+ ctx.Redirect(ctx.Repo.RepoLink + "/src/tag/" + util.PathEscapeSegments(form.TagName))
+ return
+ }
+
+ var attachmentUUIDs []string
+ if setting.Attachment.Enabled {
+ attachmentUUIDs = form.Files
+ }
+ // no release, create a new release
+ if rel == nil {
rel = &repo_model.Release{
RepoID: ctx.Repo.Repository.ID,
Repo: ctx.Repo.Repository,
@@ -469,48 +466,35 @@ func NewReleasePost(ctx *context.Context) {
TagName: form.TagName,
Target: form.Target,
Note: form.Content,
- IsDraft: len(form.Draft) > 0,
+ IsDraft: form.Draft,
IsPrerelease: form.Prerelease,
IsTag: false,
}
-
- if err = release_service.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs, msg); err != nil {
- ctx.Data["Err_TagName"] = true
- switch {
- case repo_model.IsErrReleaseAlreadyExist(err):
- ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form)
- case release_service.IsErrInvalidTagName(err):
- ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_invalid"), tplReleaseNew, &form)
- case release_service.IsErrProtectedTagName(err):
- ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_protected"), tplReleaseNew, &form)
- default:
- ctx.ServerError("CreateRelease", err)
- }
- return
- }
- } else {
- if form.TagOnly != "" && rel.IsTag {
- ctx.Data["Err_TagName"] = true
- ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form)
- return
- }
-
- rel.Title = form.Title
- rel.Note = form.Content
- rel.Target = form.Target
- rel.IsDraft = len(form.Draft) > 0
- rel.IsPrerelease = form.Prerelease
- rel.PublisherID = ctx.Doer.ID
- rel.IsTag = false
-
- if err = release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, attachmentUUIDs, nil, nil); err != nil {
- ctx.Data["Err_TagName"] = true
- ctx.ServerError("UpdateRelease", err)
+ if err = release_service.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs, newTagMsg); err != nil {
+ handleTagReleaseError(err)
return
}
+ ctx.Redirect(ctx.Repo.RepoLink + "/releases")
+ return
}
- log.Trace("Release created: %s/%s:%s", ctx.Doer.LowerName, ctx.Repo.Repository.Name, form.TagName)
+ // release exists, try to update it (it can't do tag-only if the release is just a tag)
+ if form.TagOnly && rel.IsTag {
+ ctx.Data["Err_TagName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form)
+ return
+ }
+ rel.Title = form.Title
+ rel.Note = form.Content
+ rel.Target = form.Target
+ rel.IsDraft = form.Draft
+ rel.IsPrerelease = form.Prerelease
+ rel.PublisherID = ctx.Doer.ID
+ rel.IsTag = false
+ if err = release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, attachmentUUIDs, nil, nil); err != nil {
+ handleTagReleaseError(err)
+ return
+ }
ctx.Redirect(ctx.Repo.RepoLink + "/releases")
}
diff --git a/routers/web/repo/release_test.go b/routers/web/repo/release_test.go
index 97dec10c809cd..ebad151642cd5 100644
--- a/routers/web/repo/release_test.go
+++ b/routers/web/repo/release_test.go
@@ -45,7 +45,7 @@ func TestNewReleasePost(t *testing.T) {
TagName: "delete-tag",
Target: "master",
Title: "delete-tag",
- TagOnly: "1",
+ TagOnly: true,
},
},
{
diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go
index 0bb6b49a5b735..35ea5378d3a67 100644
--- a/services/forms/repo_form.go
+++ b/services/forms/repo_form.go
@@ -647,16 +647,12 @@ type UpdateAllowEditsForm struct {
// NewReleaseForm form for creating release
type NewReleaseForm struct {
- TagName string `binding:"Required;GitRefName;MaxSize(255)"`
- Target string `form:"tag_target" binding:"Required;MaxSize(255)"`
- Title string `binding:"MaxSize(255)"`
- Content string
- Draft string
-
- // TODO: ideally it should be a bool. The "string" type here was used to accept the value of ``.
- // As now, the tmpl code had been refactor to ``, so the type could be safely refactored to "bool" in the future.
- TagOnly string
-
+ TagName string `binding:"Required;GitRefName;MaxSize(255)"`
+ Target string `form:"tag_target" binding:"Required;MaxSize(255)"`
+ Title string `binding:"MaxSize(255)"`
+ Content string
+ Draft bool
+ TagOnly bool
Prerelease bool
AddTagMsg bool
Files []string
diff --git a/templates/repo/release/new.tmpl b/templates/repo/release/new.tmpl
index 574b0d0311e05..23e9ba29ebad2 100644
--- a/templates/repo/release/new.tmpl
+++ b/templates/repo/release/new.tmpl
@@ -109,23 +109,15 @@
{{ctx.Locale.Tr "repo.release.delete_release"}}
{{if .IsDraft}}
-
-
+
+
{{else}}
-
+
{{end}}
{{else}}
- {{if not .tag_name}}
-
- {{end}}
+
-
+
{{end}}