| 
4 | 4 | package integration  | 
5 | 5 | 
 
  | 
6 | 6 | import (  | 
 | 7 | +	"fmt"  | 
7 | 8 | 	"net/http"  | 
8 | 9 | 	"net/url"  | 
9 | 10 | 	"testing"  | 
10 | 11 | 
 
  | 
11 | 12 | 	"code.gitea.io/gitea/models"  | 
 | 13 | +	auth_model "code.gitea.io/gitea/models/auth"  | 
12 | 14 | 	"code.gitea.io/gitea/models/db"  | 
13 | 15 | 	git_model "code.gitea.io/gitea/models/git"  | 
14 | 16 | 	repo_model "code.gitea.io/gitea/models/repo"  | 
15 | 17 | 	"code.gitea.io/gitea/models/unittest"  | 
16 | 18 | 	user_model "code.gitea.io/gitea/models/user"  | 
17 | 19 | 	"code.gitea.io/gitea/modules/git"  | 
 | 20 | +	api "code.gitea.io/gitea/modules/structs"  | 
18 | 21 | 	"code.gitea.io/gitea/services/release"  | 
19 | 22 | 	"code.gitea.io/gitea/tests"  | 
20 | 23 | 
 
  | 
@@ -117,3 +120,47 @@ func TestCreateNewTagProtected(t *testing.T) {  | 
117 | 120 | 		assert.NoError(t, err)  | 
118 | 121 | 	}  | 
119 | 122 | }  | 
 | 123 | + | 
 | 124 | +func TestRepushTag(t *testing.T) {  | 
 | 125 | +	onGiteaRun(t, func(t *testing.T, u *url.URL) {  | 
 | 126 | +		repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})  | 
 | 127 | +		owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})  | 
 | 128 | +		session := loginUser(t, owner.LowerName)  | 
 | 129 | +		token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)  | 
 | 130 | + | 
 | 131 | +		httpContext := NewAPITestContext(t, owner.Name, repo.Name)  | 
 | 132 | + | 
 | 133 | +		dstPath := t.TempDir()  | 
 | 134 | + | 
 | 135 | +		u.Path = httpContext.GitPath()  | 
 | 136 | +		u.User = url.UserPassword(owner.Name, userPassword)  | 
 | 137 | + | 
 | 138 | +		doGitClone(dstPath, u)(t)  | 
 | 139 | + | 
 | 140 | +		// create and push a tag  | 
 | 141 | +		_, _, err := git.NewCommand(git.DefaultContext, "tag", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})  | 
 | 142 | +		assert.NoError(t, err)  | 
 | 143 | +		_, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})  | 
 | 144 | +		assert.NoError(t, err)  | 
 | 145 | +		// create a release for the tag  | 
 | 146 | +		createdRelease := createNewReleaseUsingAPI(t, token, owner, repo, "v2.0", "", "Release of v2.0", "desc")  | 
 | 147 | +		assert.False(t, createdRelease.IsDraft)  | 
 | 148 | +		// delete the tag  | 
 | 149 | +		_, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--delete", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})  | 
 | 150 | +		assert.NoError(t, err)  | 
 | 151 | +		// query the release by API and it should be a draft  | 
 | 152 | +		req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0"))  | 
 | 153 | +		resp := MakeRequest(t, req, http.StatusOK)  | 
 | 154 | +		var respRelease *api.Release  | 
 | 155 | +		DecodeJSON(t, resp, &respRelease)  | 
 | 156 | +		assert.True(t, respRelease.IsDraft)  | 
 | 157 | +		// re-push the tag  | 
 | 158 | +		_, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})  | 
 | 159 | +		assert.NoError(t, err)  | 
 | 160 | +		// query the release by API and it should not be a draft  | 
 | 161 | +		req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0"))  | 
 | 162 | +		resp = MakeRequest(t, req, http.StatusOK)  | 
 | 163 | +		DecodeJSON(t, resp, &respRelease)  | 
 | 164 | +		assert.False(t, respRelease.IsDraft)  | 
 | 165 | +	})  | 
 | 166 | +}  | 
0 commit comments