Skip to content

Commit a6508f5

Browse files
ExplodingDragonEarl Warren
authored andcommitted
Fix: database not updated when using git push --tags --force (#5319)
Closes #4274 link: go-gitea/gitea#32040 ### Release notes - [ ] I do not want this change to show in the release notes. <!--start release-notes-assistant--> ## Draft release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/5319): <!--number 5319 --><!--line 0 --><!--description Rml4OiBkYXRhYmFzZSBub3QgdXBkYXRlZCB3aGVuIHVzaW5nIGBnaXQgcHVzaCAtLXRhZ3MgLS1mb3JjZWA=-->Fix: database not updated when using `git push --tags --force`<!--description--> <!--end release-notes-assistant--> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5319 Reviewed-by: Otto <[email protected]> Co-authored-by: Exploding Dragon <[email protected]> Co-committed-by: Exploding Dragon <[email protected]>
1 parent 5650849 commit a6508f5

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

services/repository/push.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,9 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
309309
}
310310

311311
releases, err := db.Find[repo_model.Release](ctx, repo_model.FindReleasesOptions{
312-
RepoID: repo.ID,
313-
TagNames: tags,
312+
RepoID: repo.ID,
313+
TagNames: tags,
314+
IncludeTags: true,
314315
})
315316
if err != nil {
316317
return fmt.Errorf("db.Find[repo_model.Release]: %w", err)
@@ -369,14 +370,13 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
369370
return fmt.Errorf("CommitsCount: %w", err)
370371
}
371372

372-
rel, has := relMap[lowerTag]
373+
parts := strings.SplitN(tag.Message, "\n", 2)
374+
note := ""
375+
if len(parts) > 1 {
376+
note = parts[1]
377+
}
373378

374-
if !has {
375-
parts := strings.SplitN(tag.Message, "\n", 2)
376-
note := ""
377-
if len(parts) > 1 {
378-
note = parts[1]
379-
}
379+
if rel, has := relMap[lowerTag]; !has {
380380
rel = &repo_model.Release{
381381
RepoID: repo.ID,
382382
Title: parts[0],
@@ -394,13 +394,13 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
394394
if author != nil {
395395
rel.PublisherID = author.ID
396396
}
397-
398397
newReleases = append(newReleases, rel)
399398
} else {
399+
rel.Title = parts[0]
400+
rel.Note = note
400401
rel.Sha1 = commit.ID.String()
401402
rel.CreatedUnix = timeutil.TimeStamp(createdAt.Unix())
402403
rel.NumCommits = commitsCount
403-
rel.IsDraft = false
404404
if rel.IsTag && author != nil {
405405
rel.PublisherID = author.ID
406406
}

tests/integration/repo_tag_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,40 @@ func TestCreateNewTagProtected(t *testing.T) {
108108
})
109109
})
110110

111+
t.Run("GitTagForce", func(t *testing.T) {
112+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
113+
httpContext := NewAPITestContext(t, owner.Name, repo.Name)
114+
115+
dstPath := t.TempDir()
116+
117+
u.Path = httpContext.GitPath()
118+
u.User = url.UserPassword(owner.Name, userPassword)
119+
120+
doGitClone(dstPath, u)(t)
121+
122+
_, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
123+
require.NoError(t, err)
124+
125+
_, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath})
126+
require.NoError(t, err)
127+
128+
_, _, err = git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
129+
require.NoError(t, err)
130+
131+
_, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath})
132+
require.Error(t, err)
133+
assert.Contains(t, err.Error(), "the tag already exists in the remote")
134+
135+
_, _, err = git.NewCommand(git.DefaultContext, "push", "--tags", "--force").RunStdString(&git.RunOpts{Dir: dstPath})
136+
require.NoError(t, err)
137+
req := NewRequestf(t, "GET", "/%s/releases/tag/v-1.1", repo.FullName())
138+
resp := MakeRequest(t, req, http.StatusOK)
139+
htmlDoc := NewHTMLParser(t, resp.Body)
140+
tagsTab := htmlDoc.Find(".release-list-title")
141+
assert.Contains(t, tagsTab.Text(), "force update v2")
142+
})
143+
})
144+
111145
// Cleanup
112146
releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
113147
IncludeTags: true,

0 commit comments

Comments
 (0)