]> source.dussan.org Git - gitea.git/commitdiff
Fix: database not update release when using `git push --tags --force` (#32040)
authorExploding Dragon <explodingfkl@gmail.com>
Wed, 18 Sep 2024 20:15:03 +0000 (04:15 +0800)
committerGitHub <noreply@github.com>
Wed, 18 Sep 2024 20:15:03 +0000 (20:15 +0000)
link: https://codeberg.org/forgejo/forgejo/issues/4274
---------

Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
services/repository/push.go
tests/integration/repo_tag_test.go

index f27e6a58dd6cee25050e0c20d463a0bdf7018d8a..8b81588c072854f2350caf7716cf8ab57c4bbfe4 100644 (file)
@@ -320,8 +320,9 @@ 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,
+               RepoID:      repo.ID,
+               TagNames:    tags,
+               IncludeTags: true,
        })
        if err != nil {
                return fmt.Errorf("db.Find[repo_model.Release]: %w", err)
@@ -382,12 +383,12 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 
                rel, has := relMap[lowerTag]
 
+               parts := strings.SplitN(tag.Message, "\n", 2)
+               note := ""
+               if len(parts) > 1 {
+                       note = parts[1]
+               }
                if !has {
-                       parts := strings.SplitN(tag.Message, "\n", 2)
-                       note := ""
-                       if len(parts) > 1 {
-                               note = parts[1]
-                       }
                        rel = &repo_model.Release{
                                RepoID:       repo.ID,
                                Title:        parts[0],
@@ -408,10 +409,11 @@ 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
-                       rel.IsDraft = false
                        if rel.IsTag && author != nil {
                                rel.PublisherID = author.ID
                        }
index 6d3d85532cccae8147e918480aadf1405d47960b..d649f041ccf5752d494bf71b2bf5142cbd58654f 100644 (file)
@@ -4,6 +4,7 @@
 package integration
 
 import (
+       "net/http"
        "net/url"
        "testing"
 
@@ -18,6 +19,7 @@ import (
        "code.gitea.io/gitea/tests"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func TestCreateNewTagProtected(t *testing.T) {
@@ -60,6 +62,40 @@ func TestCreateNewTagProtected(t *testing.T) {
                })
        })
 
+       t.Run("GitTagForce", func(t *testing.T) {
+               onGiteaRun(t, func(t *testing.T, u *url.URL) {
+                       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)
+
+                       _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
+                       require.NoError(t, err)
+
+                       _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath})
+                       require.NoError(t, err)
+
+                       _, _, err = git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
+                       require.NoError(t, err)
+
+                       _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath})
+                       require.Error(t, err)
+                       assert.Contains(t, err.Error(), "the tag already exists in the remote")
+
+                       _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
+                       require.NoError(t, err)
+                       req := NewRequestf(t, "GET", "/%s/releases/tag/v-1.1", repo.FullName())
+                       resp := MakeRequest(t, req, http.StatusOK)
+                       htmlDoc := NewHTMLParser(t, resp.Body)
+                       tagsTab := htmlDoc.Find(".release-list-title")
+                       assert.Contains(t, tagsTab.Text(), "force update v2")
+               })
+       })
+
        // Cleanup
        releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
                IncludeTags: true,