Skip to content

Create tag on ui #13467

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Feb 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions modules/forms/repo_branch_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
// NewBranchForm form for creating a new branch
type NewBranchForm struct {
NewBranchName string `binding:"Required;MaxSize(100);GitRefName"`
CreateTag bool
}

// Validate validates the fields
Expand Down
2 changes: 2 additions & 0 deletions modules/forms/repo_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,9 @@ type NewReleaseForm struct {
Title string `binding:"Required;MaxSize(255)"`
Content string
Draft string
TagOnly string
Prerelease bool
AddTagMsg bool
Files []string
}

Expand Down
2 changes: 1 addition & 1 deletion modules/git/repo_tag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func TestRepository_GetTag(t *testing.T) {

aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"
aTagName := "annotatedTag"
aTagMessage := "my annotated message"
aTagMessage := "my annotated message \n - test two line"
bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID)
aTagID, _ := bareRepo1.GetTagID(aTagName)

Expand Down
5 changes: 5 additions & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1895,6 +1895,8 @@ release.tag_name_invalid = The tag name is not valid.
release.tag_already_exist = This tag name already exists.
release.downloads = Downloads
release.download_count = Downloads: %s
release.add_tag_msg = Use the title and content of release as tag message.
release.add_tag = Create Tag Only

branch.name = Branch Name
branch.search = Search branches
Expand Down Expand Up @@ -1922,6 +1924,9 @@ branch.download = Download Branch '%s'
branch.included_desc = This branch is part of the default branch
branch.included = Included

tag.create_tag = Create tag <strong>%s</strong>
tag.create_success = Tag '%s' has been created.

topic.manage_topics = Manage Topics
topic.done = Done
topic.count_prompt = You can not select more than 25 topics
Expand Down
2 changes: 1 addition & 1 deletion routers/api/v1/repo/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ func CreateRelease(ctx *context.APIContext) {
IsTag: false,
Repo: ctx.Repo.Repository,
}
if err := releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
if err := releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, nil, ""); err != nil {
if models.IsErrReleaseAlreadyExist(err) {
ctx.Error(http.StatusConflict, "ReleaseAlreadyExist", err)
} else {
Expand Down
16 changes: 15 additions & 1 deletion routers/repo/branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/utils"
release_service "code.gitea.io/gitea/services/release"
repo_service "code.gitea.io/gitea/services/repository"
)

Expand Down Expand Up @@ -383,7 +384,14 @@ func CreateBranch(ctx *context.Context) {
}

var err error
if ctx.Repo.IsViewBranch {

if form.CreateTag {
if ctx.Repo.IsViewTag {
err = release_service.CreateNewTag(ctx.User, ctx.Repo.Repository, ctx.Repo.CommitID, form.NewBranchName, "")
} else {
err = release_service.CreateNewTag(ctx.User, ctx.Repo.Repository, ctx.Repo.BranchName, form.NewBranchName, "")
}
} else if ctx.Repo.IsViewBranch {
err = repo_module.CreateNewBranch(ctx.User, ctx.Repo.Repository, ctx.Repo.BranchName, form.NewBranchName)
} else if ctx.Repo.IsViewTag {
err = repo_module.CreateNewBranchFromCommit(ctx.User, ctx.Repo.Repository, ctx.Repo.CommitID, form.NewBranchName)
Expand Down Expand Up @@ -432,6 +440,12 @@ func CreateBranch(ctx *context.Context) {
return
}

if form.CreateTag {
ctx.Flash.Success(ctx.Tr("repo.tag.create_success", form.NewBranchName))
ctx.Redirect(ctx.Repo.RepoLink + "/src/tag/" + util.PathEscapeSegments(form.NewBranchName))
return
}

ctx.Flash.Success(ctx.Tr("repo.branch.create_success", form.NewBranchName))
ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(form.NewBranchName))
}
25 changes: 24 additions & 1 deletion routers/repo/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,29 @@ func NewReleasePost(ctx *context.Context) {
return
}

msg := ""
if len(form.Title) > 0 && form.AddTagMsg {
msg = form.Title + "\n\n" + form.Content
}

if len(form.TagOnly) > 0 {
if err = releaseservice.CreateNewTag(ctx.User, ctx.Repo.Repository, form.Target, form.TagName, msg); err != nil {
if models.IsErrTagAlreadyExists(err) {
e := err.(models.ErrTagAlreadyExists)
ctx.Flash.Error(ctx.Tr("repo.branch.tag_collision", e.TagName))
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL())
return
}

ctx.ServerError("releaseservice.CreateNewTag", err)
return
}

ctx.Flash.Success(ctx.Tr("repo.tag.create_success", form.TagName))
ctx.Redirect(ctx.Repo.RepoLink + "/src/tag/" + form.TagName)
return
}

rel = &models.Release{
RepoID: ctx.Repo.Repository.ID,
PublisherID: ctx.User.ID,
Expand All @@ -274,7 +297,7 @@ func NewReleasePost(ctx *context.Context) {
IsTag: false,
}

if err = releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
if err = releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs, msg); err != nil {
ctx.Data["Err_TagName"] = true
switch {
case models.IsErrReleaseAlreadyExist(err):
Expand Down
2 changes: 1 addition & 1 deletion services/mirror/mirror_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func TestRelease_MirrorDelete(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: true,
}, nil))
}, nil, ""))

err = mirror.GetMirror()
assert.NoError(t, err)
Expand Down
57 changes: 52 additions & 5 deletions services/release/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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
}

Expand All @@ -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)
Expand Down
39 changes: 24 additions & 15 deletions services/release/release_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))

assert.NoError(t, CreateRelease(gitRepo, &models.Release{
RepoID: repo.ID,
Expand All @@ -52,7 +52,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))

assert.NoError(t, CreateRelease(gitRepo, &models.Release{
RepoID: repo.ID,
Expand All @@ -64,7 +64,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))

assert.NoError(t, CreateRelease(gitRepo, &models.Release{
RepoID: repo.ID,
Expand All @@ -76,7 +76,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: true,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))

assert.NoError(t, CreateRelease(gitRepo, &models.Release{
RepoID: repo.ID,
Expand All @@ -88,7 +88,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: false,
IsPrerelease: true,
IsTag: false,
}, nil))
}, nil, ""))

assert.NoError(t, CreateRelease(gitRepo, &models.Release{
RepoID: repo.ID,
Expand All @@ -100,7 +100,7 @@ func TestRelease_Create(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: true,
}, nil))
}, nil, "test"))
}

func TestRelease_Update(t *testing.T) {
Expand All @@ -125,7 +125,7 @@ func TestRelease_Update(t *testing.T) {
IsDraft: false,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))
release, err := models.GetRelease(repo.ID, "v1.1.1")
assert.NoError(t, err)
releaseCreatedUnix := release.CreatedUnix
Expand All @@ -147,7 +147,7 @@ func TestRelease_Update(t *testing.T) {
IsDraft: true,
IsPrerelease: false,
IsTag: false,
}, nil))
}, nil, ""))
release, err = models.GetRelease(repo.ID, "v1.2.1")
assert.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
Expand All @@ -169,7 +169,7 @@ func TestRelease_Update(t *testing.T) {
IsDraft: false,
IsPrerelease: true,
IsTag: false,
}, nil))
}, nil, ""))
release, err = models.GetRelease(repo.ID, "v1.3.1")
assert.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
Expand Down Expand Up @@ -205,12 +205,12 @@ func TestRelease_createTag(t *testing.T) {
IsPrerelease: false,
IsTag: false,
}
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
assert.NotEmpty(t, release.CreatedUnix)
releaseCreatedUnix := release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Note = "Changed note"
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))

// Test a changed draft
Expand All @@ -225,11 +225,11 @@ func TestRelease_createTag(t *testing.T) {
IsPrerelease: false,
IsTag: false,
}
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))

// Test a changed pre-release
Expand All @@ -244,11 +244,20 @@ func TestRelease_createTag(t *testing.T) {
IsPrerelease: true,
IsTag: false,
}
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
release.Note = "Changed note"
assert.NoError(t, createTag(gitRepo, release))
assert.NoError(t, createTag(gitRepo, release, ""))
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
}

func TestCreateNewTag(t *testing.T) {
assert.NoError(t, models.PrepareTestDatabase())
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)

assert.NoError(t, CreateNewTag(user, repo, "master", "v2.0",
"v2.0 is released \n\n BUGFIX: .... \n\n 123"))
}
Loading