mirror of
https://github.com/go-gitea/gitea
synced 2025-07-22 10:18:38 +00:00
Create tag on ui (#13467)
Support create single tag directly support create tag with message from create release ui Signed-off-by: a1012112796 <1012112796@qq.com> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
@@ -17,7 +17,7 @@ import (
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
)
|
||||
|
||||
func createTag(gitRepo *git.Repository, rel *models.Release) error {
|
||||
func createTag(gitRepo *git.Repository, rel *models.Release, msg string) error {
|
||||
// Only actual create when publish.
|
||||
if !rel.IsDraft {
|
||||
if !gitRepo.IsTagExist(rel.TagName) {
|
||||
@@ -28,7 +28,16 @@ func createTag(gitRepo *git.Repository, rel *models.Release) error {
|
||||
|
||||
// Trim '--' prefix to prevent command line argument vulnerability.
|
||||
rel.TagName = strings.TrimPrefix(rel.TagName, "--")
|
||||
if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
|
||||
if len(msg) > 0 {
|
||||
if err = gitRepo.CreateAnnotatedTag(rel.TagName, msg, commit.ID.String()); err != nil {
|
||||
if strings.Contains(err.Error(), "is not a valid tag name") {
|
||||
return models.ErrInvalidTagName{
|
||||
TagName: rel.TagName,
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
} else if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
|
||||
if strings.Contains(err.Error(), "is not a valid tag name") {
|
||||
return models.ErrInvalidTagName{
|
||||
TagName: rel.TagName,
|
||||
@@ -77,7 +86,7 @@ func createTag(gitRepo *git.Repository, rel *models.Release) error {
|
||||
}
|
||||
|
||||
// CreateRelease creates a new release of repository.
|
||||
func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string) error {
|
||||
func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string, msg string) error {
|
||||
isExist, err := models.IsReleaseExist(rel.RepoID, rel.TagName)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -87,7 +96,7 @@ func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs
|
||||
}
|
||||
}
|
||||
|
||||
if err = createTag(gitRepo, rel); err != nil {
|
||||
if err = createTag(gitRepo, rel, msg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -107,9 +116,47 @@ func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs
|
||||
return nil
|
||||
}
|
||||
|
||||
// CreateNewTag creates a new repository tag
|
||||
func CreateNewTag(doer *models.User, repo *models.Repository, commit, tagName, msg string) error {
|
||||
isExist, err := models.IsReleaseExist(repo.ID, tagName)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if isExist {
|
||||
return models.ErrTagAlreadyExists{
|
||||
TagName: tagName,
|
||||
}
|
||||
}
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer gitRepo.Close()
|
||||
|
||||
rel := &models.Release{
|
||||
RepoID: repo.ID,
|
||||
PublisherID: doer.ID,
|
||||
TagName: tagName,
|
||||
Target: commit,
|
||||
IsDraft: false,
|
||||
IsPrerelease: false,
|
||||
IsTag: true,
|
||||
}
|
||||
|
||||
if err = createTag(gitRepo, rel, msg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = models.InsertRelease(rel); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdateReleaseOrCreatReleaseFromTag updates information of a release or create release from tag.
|
||||
func UpdateReleaseOrCreatReleaseFromTag(doer *models.User, gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string, isCreate bool) (err error) {
|
||||
if err = createTag(gitRepo, rel); err != nil {
|
||||
if err = createTag(gitRepo, rel, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
rel.LowerTagName = strings.ToLower(rel.TagName)
|
||||
|
Reference in New Issue
Block a user