]> source.dussan.org Git - gitea.git/commitdiff
Fix broken releases when re-pushing tags (#32435)
authorZettat123 <zettat123@gmail.com>
Fri, 8 Nov 2024 02:53:06 +0000 (10:53 +0800)
committerGitHub <noreply@github.com>
Fri, 8 Nov 2024 02:53:06 +0000 (10:53 +0800)
Fix #32427

services/repository/push.go
tests/integration/repo_tag_test.go

index 36c7927ab61f38c5d9472ebfbc3e5911efb2e52c..06ad65e48fb6bab224ff013cdf73090411e8d55f 100644 (file)
@@ -318,9 +318,10 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
        }
 
        releases, err := db.Find[repo_model.Release](ctx, repo_model.FindReleasesOptions{
-               RepoID:      repo.ID,
-               TagNames:    tags,
-               IncludeTags: true,
+               RepoID:        repo.ID,
+               TagNames:      tags,
+               IncludeDrafts: true,
+               IncludeTags:   true,
        })
        if err != nil {
                return fmt.Errorf("db.Find[repo_model.Release]: %w", err)
@@ -407,13 +408,17 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 
                        newReleases = append(newReleases, rel)
                } else {
-                       rel.Title = parts[0]
-                       rel.Note = note
                        rel.Sha1 = commit.ID.String()
                        rel.CreatedUnix = timeutil.TimeStamp(createdAt.Unix())
                        rel.NumCommits = commitsCount
-                       if rel.IsTag && author != nil {
-                               rel.PublisherID = author.ID
+                       if rel.IsTag {
+                               rel.Title = parts[0]
+                               rel.Note = note
+                               if author != nil {
+                                       rel.PublisherID = author.ID
+                               }
+                       } else {
+                               rel.IsDraft = false
                        }
                        if err = repo_model.UpdateRelease(ctx, rel); err != nil {
                                return fmt.Errorf("Update: %w", err)
index d649f041ccf5752d494bf71b2bf5142cbd58654f..0cd49ee4cd3d3e5798ff65229b88e2b85d1d2532 100644 (file)
@@ -4,17 +4,20 @@
 package integration
 
 import (
+       "fmt"
        "net/http"
        "net/url"
        "testing"
 
        "code.gitea.io/gitea/models"
+       auth_model "code.gitea.io/gitea/models/auth"
        "code.gitea.io/gitea/models/db"
        git_model "code.gitea.io/gitea/models/git"
        repo_model "code.gitea.io/gitea/models/repo"
        "code.gitea.io/gitea/models/unittest"
        user_model "code.gitea.io/gitea/models/user"
        "code.gitea.io/gitea/modules/git"
+       api "code.gitea.io/gitea/modules/structs"
        "code.gitea.io/gitea/services/release"
        "code.gitea.io/gitea/tests"
 
@@ -117,3 +120,47 @@ func TestCreateNewTagProtected(t *testing.T) {
                assert.NoError(t, err)
        }
 }
+
+func TestRepushTag(t *testing.T) {
+       onGiteaRun(t, func(t *testing.T, u *url.URL) {
+               repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+               owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+               session := loginUser(t, owner.LowerName)
+               token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
+
+               httpContext := NewAPITestContext(t, owner.Name, repo.Name)
+
+               dstPath := t.TempDir()
+
+               u.Path = httpContext.GitPath()
+               u.User = url.UserPassword(owner.Name, userPassword)
+
+               doGitClone(dstPath, u)(t)
+
+               // create and push a tag
+               _, _, err := git.NewCommand(git.DefaultContext, "tag", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})
+               assert.NoError(t, err)
+               _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})
+               assert.NoError(t, err)
+               // create a release for the tag
+               createdRelease := createNewReleaseUsingAPI(t, token, owner, repo, "v2.0", "", "Release of v2.0", "desc")
+               assert.False(t, createdRelease.IsDraft)
+               // delete the tag
+               _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--delete", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})
+               assert.NoError(t, err)
+               // query the release by API and it should be a draft
+               req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0"))
+               resp := MakeRequest(t, req, http.StatusOK)
+               var respRelease *api.Release
+               DecodeJSON(t, resp, &respRelease)
+               assert.True(t, respRelease.IsDraft)
+               // re-push the tag
+               _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath})
+               assert.NoError(t, err)
+               // query the release by API and it should not be a draft
+               req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0"))
+               resp = MakeRequest(t, req, http.StatusOK)
+               DecodeJSON(t, resp, &respRelease)
+               assert.False(t, respRelease.IsDraft)
+       })
+}