loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'fix: make syncronize tags to database handle annoted tags' (#5641) from gusted/forgejo-sync-tags into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5641
Reviewed-by: Otto <otto@codeberg.org>

Gusted 6c0698c7 3e1d5cc4

+94 -3
+3 -1
modules/git/repo_commit.go
··· 22 22 return repo.GetRefCommitID(BranchPrefix + name) 23 23 } 24 24 25 - // GetTagCommitID returns last commit ID string of given tag. 25 + // GetTagCommitID returns last commit ID string of given tag. If the tag is an 26 + // annoted tag it will return the objectID of that tag instead of the commitID 27 + // the tag is pointing to. `GetTagCommit` handles annoted tags correctly. 26 28 func (repo *Repository) GetTagCommitID(name string) (string, error) { 27 29 return repo.GetRefCommitID(TagPrefix + name) 28 30 }
+37
modules/git/repo_commit_test.go
··· 101 101 assert.Len(t, commits, c.ExpectedCommits, "case %d", i) 102 102 } 103 103 } 104 + 105 + func TestGetTagCommit(t *testing.T) { 106 + t.Setenv("GIT_COMMITTER_DATE", "2006-01-01 13:37") 107 + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") 108 + 109 + clonedPath, err := cloneRepo(t, bareRepo1Path) 110 + require.NoError(t, err) 111 + 112 + bareRepo1, err := openRepositoryWithDefaultContext(clonedPath) 113 + require.NoError(t, err) 114 + defer bareRepo1.Close() 115 + 116 + lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1" 117 + lTagName := "lightweightTag" 118 + bareRepo1.CreateTag(lTagName, lTagCommitID) 119 + 120 + aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" 121 + aTagName := "annotatedTag" 122 + aTagMessage := "my annotated message" 123 + bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) 124 + 125 + aTagID, err := bareRepo1.GetTagCommitID(aTagName) 126 + require.NoError(t, err) 127 + assert.NotEqualValues(t, aTagCommitID, aTagID) 128 + 129 + lTagID, err := bareRepo1.GetTagCommitID(lTagName) 130 + require.NoError(t, err) 131 + assert.EqualValues(t, lTagCommitID, lTagID) 132 + 133 + aTag, err := bareRepo1.GetTagCommit(aTagName) 134 + require.NoError(t, err) 135 + assert.EqualValues(t, aTagCommitID, aTag.ID.String()) 136 + 137 + lTag, err := bareRepo1.GetTagCommit(lTagName) 138 + require.NoError(t, err) 139 + assert.EqualValues(t, lTagCommitID, lTag.ID.String()) 140 + }
+2 -2
modules/repository/repo.go
··· 90 90 if rel.IsDraft { 91 91 continue 92 92 } 93 - commitID, err := gitRepo.GetTagCommitID(rel.TagName) 93 + commit, err := gitRepo.GetTagCommit(rel.TagName) 94 94 if err != nil && !git.IsErrNotExist(err) { 95 95 return fmt.Errorf("unable to GetTagCommitID for %q in Repo[%d:%s/%s]: %w", rel.TagName, repo.ID, repo.OwnerName, repo.Name, err) 96 96 } 97 - if git.IsErrNotExist(err) || commitID != rel.Sha1 { 97 + if git.IsErrNotExist(err) || commit.ID.String() != rel.Sha1 { 98 98 if err := repo_model.PushUpdateDeleteTag(ctx, repo, rel.TagName); err != nil { 99 99 return fmt.Errorf("unable to PushUpdateDeleteTag: %q in Repo[%d:%s/%s]: %w", rel.TagName, repo.ID, repo.OwnerName, repo.Name, err) 100 100 }
+52
tests/integration/repo_tag_test.go
··· 17 17 "code.gitea.io/gitea/models/unittest" 18 18 user_model "code.gitea.io/gitea/models/user" 19 19 "code.gitea.io/gitea/modules/git" 20 + repo_module "code.gitea.io/gitea/modules/repository" 20 21 "code.gitea.io/gitea/services/release" 21 22 "code.gitea.io/gitea/tests" 22 23 ··· 163 164 require.NoError(t, err) 164 165 } 165 166 } 167 + 168 + func TestSyncRepoTags(t *testing.T) { 169 + onGiteaRun(t, func(t *testing.T, u *url.URL) { 170 + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 171 + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 172 + 173 + t.Run("Git", func(t *testing.T) { 174 + httpContext := NewAPITestContext(t, owner.Name, repo.Name) 175 + 176 + dstPath := t.TempDir() 177 + 178 + u.Path = httpContext.GitPath() 179 + u.User = url.UserPassword(owner.Name, userPassword) 180 + 181 + doGitClone(dstPath, u)(t) 182 + 183 + _, _, err := git.NewCommand(git.DefaultContext, "tag", "v2", "-m", "this is an annoted tag").RunStdString(&git.RunOpts{Dir: dstPath}) 184 + require.NoError(t, err) 185 + 186 + _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) 187 + require.NoError(t, err) 188 + 189 + testTag := func(t *testing.T) { 190 + t.Helper() 191 + req := NewRequestf(t, "GET", "/%s/releases/tag/v2", repo.FullName()) 192 + resp := MakeRequest(t, req, http.StatusOK) 193 + htmlDoc := NewHTMLParser(t, resp.Body) 194 + tagsTab := htmlDoc.Find(".release-list-title") 195 + assert.Contains(t, tagsTab.Text(), "this is an annoted tag") 196 + } 197 + 198 + // Make sure `SyncRepoTags` doesn't modify annoted tags. 199 + testTag(t) 200 + require.NoError(t, repo_module.SyncRepoTags(git.DefaultContext, repo.ID)) 201 + testTag(t) 202 + }) 203 + 204 + // Cleanup 205 + releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ 206 + IncludeTags: true, 207 + TagNames: []string{"v2"}, 208 + RepoID: repo.ID, 209 + }) 210 + require.NoError(t, err) 211 + 212 + for _, release := range releases { 213 + _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) 214 + require.NoError(t, err) 215 + } 216 + }) 217 + }