code.gitea.io/gitea@v1.22.3/tests/integration/repo_tag_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "net/http" 8 "net/url" 9 "testing" 10 11 "code.gitea.io/gitea/models" 12 "code.gitea.io/gitea/models/db" 13 git_model "code.gitea.io/gitea/models/git" 14 repo_model "code.gitea.io/gitea/models/repo" 15 "code.gitea.io/gitea/models/unittest" 16 user_model "code.gitea.io/gitea/models/user" 17 "code.gitea.io/gitea/modules/git" 18 "code.gitea.io/gitea/services/release" 19 "code.gitea.io/gitea/tests" 20 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestCreateNewTagProtected(t *testing.T) { 26 defer tests.PrepareTestEnv(t)() 27 28 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 29 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 30 31 t.Run("Code", func(t *testing.T) { 32 defer tests.PrintCurrentTest(t)() 33 34 err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "t-first", "first tag") 35 assert.NoError(t, err) 36 37 err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-2", "second tag") 38 assert.Error(t, err) 39 assert.True(t, models.IsErrProtectedTagName(err)) 40 41 err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1.1", "third tag") 42 assert.NoError(t, err) 43 }) 44 45 t.Run("Git", func(t *testing.T) { 46 onGiteaRun(t, func(t *testing.T, u *url.URL) { 47 httpContext := NewAPITestContext(t, owner.Name, repo.Name) 48 49 dstPath := t.TempDir() 50 51 u.Path = httpContext.GitPath() 52 u.User = url.UserPassword(owner.Name, userPassword) 53 54 doGitClone(dstPath, u)(t) 55 56 _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-2").RunStdString(&git.RunOpts{Dir: dstPath}) 57 assert.NoError(t, err) 58 59 _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) 60 assert.Error(t, err) 61 assert.Contains(t, err.Error(), "Tag v-2 is protected") 62 }) 63 }) 64 65 t.Run("GitTagForce", func(t *testing.T) { 66 onGiteaRun(t, func(t *testing.T, u *url.URL) { 67 httpContext := NewAPITestContext(t, owner.Name, repo.Name) 68 69 dstPath := t.TempDir() 70 71 u.Path = httpContext.GitPath() 72 u.User = url.UserPassword(owner.Name, userPassword) 73 74 doGitClone(dstPath, u)(t) 75 76 _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) 77 require.NoError(t, err) 78 79 _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) 80 require.NoError(t, err) 81 82 _, _, err = git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) 83 require.NoError(t, err) 84 85 _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) 86 require.Error(t, err) 87 assert.Contains(t, err.Error(), "the tag already exists in the remote") 88 89 _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) 90 require.NoError(t, err) 91 req := NewRequestf(t, "GET", "/%s/releases/tag/v-1.1", repo.FullName()) 92 resp := MakeRequest(t, req, http.StatusOK) 93 htmlDoc := NewHTMLParser(t, resp.Body) 94 tagsTab := htmlDoc.Find(".release-list-title") 95 assert.Contains(t, tagsTab.Text(), "force update v2") 96 }) 97 }) 98 99 // Cleanup 100 releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ 101 IncludeTags: true, 102 TagNames: []string{"v-1", "v-1.1"}, 103 RepoID: repo.ID, 104 }) 105 assert.NoError(t, err) 106 107 for _, release := range releases { 108 _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) 109 assert.NoError(t, err) 110 } 111 112 protectedTags, err := git_model.GetProtectedTags(db.DefaultContext, repo.ID) 113 assert.NoError(t, err) 114 115 for _, protectedTag := range protectedTags { 116 err = git_model.DeleteProtectedTag(db.DefaultContext, protectedTag) 117 assert.NoError(t, err) 118 } 119 }