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.

[gitea] week 2025-10 cherry pick (gitea/main -> forgejo) (#7111)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7111
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Reviewed-by: Otto <otto@codeberg.org>

Gusted b10454a0 fc4458bf

+80 -16
+6 -3
models/packages/descriptor.go
··· 110 110 if err != nil { 111 111 return nil, err 112 112 } 113 - repository, err := repo_model.GetRepositoryByID(ctx, p.RepoID) 114 - if err != nil && !repo_model.IsErrRepoNotExist(err) { 115 - return nil, err 113 + var repository *repo_model.Repository 114 + if p.RepoID > 0 { 115 + repository, err = repo_model.GetRepositoryByID(ctx, p.RepoID) 116 + if err != nil && !repo_model.IsErrRepoNotExist(err) { 117 + return nil, err 118 + } 116 119 } 117 120 creator, err := user_model.GetUserByID(ctx, pv.CreatorID) 118 121 if err != nil {
+3 -1
options/locale/locale_en-US.ini
··· 1540 1540 issues.filter_projects = Filter Project 1541 1541 issues.filter_labels = Filter Label 1542 1542 issues.filter_reviewers = Filter Reviewer 1543 + issues.filter_no_results = No results 1544 + issues.filter_no_results_placeholder = Try adjusting your search filters. 1543 1545 issues.new = New issue 1544 1546 issues.new.title_empty = Title cannot be empty 1545 1547 issues.new.labels = Labels ··· 3963 3965 filepreview.truncated = Preview has been truncated 3964 3966 3965 3967 [translation_meta] 3966 - test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :) 3968 + test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :)
+20 -2
routers/api/packages/composer/api.go
··· 66 66 } 67 67 68 68 // PackageVersionMetadata contains package metadata 69 + // https://getcomposer.org/doc/05-repositories.md#package 69 70 type PackageVersionMetadata struct { 70 71 *composer_module.Metadata 71 72 Name string `json:"name"` ··· 73 74 Type string `json:"type"` 74 75 Created time.Time `json:"time"` 75 76 Dist Dist `json:"dist"` 77 + Source Source `json:"source"` 76 78 } 77 79 78 80 // Dist contains package download information ··· 82 84 Checksum string `json:"shasum"` 83 85 } 84 86 87 + // Source contains package source information 88 + type Source struct { 89 + URL string `json:"url"` 90 + Type string `json:"type"` 91 + Reference string `json:"reference"` 92 + } 93 + 85 94 func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse { 86 95 versions := make([]*PackageVersionMetadata, 0, len(pds)) 87 96 ··· 94 103 } 95 104 } 96 105 97 - versions = append(versions, &PackageVersionMetadata{ 106 + pkg := PackageVersionMetadata{ 98 107 Name: pd.Package.Name, 99 108 Version: pd.Version.Version, 100 109 Type: packageType, ··· 105 114 URL: fmt.Sprintf("%s/files/%s/%s/%s", registryURL, url.PathEscape(pd.Package.LowerName), url.PathEscape(pd.Version.LowerVersion), url.PathEscape(pd.Files[0].File.LowerName)), 106 115 Checksum: pd.Files[0].Blob.HashSHA1, 107 116 }, 108 - }) 117 + } 118 + if pd.Repository != nil { 119 + pkg.Source = Source{ 120 + URL: pd.Repository.HTMLURL(), 121 + Type: "git", 122 + Reference: pd.Version.Version, 123 + } 124 + } 125 + 126 + versions = append(versions, &pkg) 109 127 } 110 128 111 129 return &PackageMetadataResponse{
+9 -8
services/packages/package_update.go
··· 44 44 } 45 45 46 46 repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID) 47 - if err != nil { 47 + if err != nil && !repo_model.IsErrRepoNotExist(err) { 48 48 return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err) 49 49 } 50 - 51 - perms, err := access_model.GetUserRepoPermission(ctx, repo, doer) 52 - if err != nil { 53 - return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err) 54 - } 55 - if !perms.CanWrite(unit.TypePackages) { 56 - return util.ErrPermissionDenied 50 + if err == nil { 51 + perms, err := access_model.GetUserRepoPermission(ctx, repo, doer) 52 + if err != nil { 53 + return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err) 54 + } 55 + if !perms.CanWrite(unit.TypePackages) { 56 + return util.ErrPermissionDenied 57 + } 57 58 } 58 59 59 60 user, err := user_model.GetUserByID(ctx, pkg.OwnerID)
+1 -1
templates/base/paginate.tmpl
··· 17 17 {{if eq .Num -1}} 18 18 <a class="disabled item">...</a> 19 19 {{else}} 20 - <a class="{{if .IsCurrent}}active {{end}}item tw-items-center" {{if not .IsCurrent}}href="{{$paginationLink}}?page={{.Num}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>{{.Num}}</a> 20 + <a class="{{if .IsCurrent}}active {{end}}item" {{if not .IsCurrent}}href="{{$paginationLink}}?page={{.Num}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>{{.Num}}</a> 21 21 {{end}} 22 22 {{end}} 23 23 <a class="{{if not .HasNext}}disabled{{end}} item navigation" {{if .HasNext}}href="{{$paginationLink}}?page={{.Next}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>
+1 -1
templates/repo/issue/openclose.tmpl
··· 10 10 {{ctx.Locale.PrettyNumber .OpenCount}}&nbsp;{{ctx.Locale.Tr "repo.issues.open_title"}} 11 11 </a> 12 12 <a class="{{if eq .State "closed"}}active {{end}}item" href="{{.ClosedLink}}" data-test-name="closed-issue-count"> 13 - {{svg "octicon-check" 16 "tw-mr-2"}} 13 + {{svg "octicon-issue-closed" 16 "tw-mr-2"}} 14 14 {{ctx.Locale.PrettyNumber .ClosedCount}}&nbsp;{{ctx.Locale.Tr "repo.issues.closed_title"}} 15 15 </a> 16 16 {{if not .PageIsMilestones}}
+5
templates/shared/issuelist.tmpl
··· 145 145 </div> 146 146 </div> 147 147 </div> 148 + {{else}} 149 + <div class="tw-text-center tw-p-8"> 150 + <h3 class="tw-my-4">{{ctx.Locale.Tr "repo.issues.filter_no_results"}}</h3> 151 + <p class="tw-text-placeholder-text">{{ctx.Locale.Tr "repo.issues.filter_no_results_placeholder"}}</p> 152 + </div> 148 153 {{end}} 149 154 {{if .IssueIndexerUnavailable}} 150 155 <div class="ui error message">
+35
tests/integration/api_packages_composer_test.go
··· 13 13 14 14 "code.gitea.io/gitea/models/db" 15 15 "code.gitea.io/gitea/models/packages" 16 + repo_model "code.gitea.io/gitea/models/repo" 16 17 "code.gitea.io/gitea/models/unittest" 17 18 user_model "code.gitea.io/gitea/models/user" 18 19 composer_module "code.gitea.io/gitea/modules/packages/composer" ··· 218 219 assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum) 219 220 assert.Len(t, pkgs[0].Bin, 1) 220 221 assert.Equal(t, packageBin, pkgs[0].Bin[0]) 222 + 223 + // Test package linked to repository 224 + repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 225 + userPkgs, err := packages.GetPackagesByType(db.DefaultContext, user.ID, packages.TypeComposer) 226 + require.NoError(t, err) 227 + assert.Len(t, userPkgs, 1) 228 + assert.EqualValues(t, 0, userPkgs[0].RepoID) 229 + 230 + err = packages.SetRepositoryLink(db.DefaultContext, userPkgs[0].ID, repo1.ID) 231 + require.NoError(t, err) 232 + 233 + req = NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName)). 234 + AddBasicAuth(user.Name) 235 + resp = MakeRequest(t, req, http.StatusOK) 236 + 237 + result = composer.PackageMetadataResponse{} 238 + DecodeJSON(t, resp, &result) 239 + 240 + assert.Contains(t, result.Packages, packageName) 241 + pkgs = result.Packages[packageName] 242 + assert.Len(t, pkgs, 1) 243 + assert.Equal(t, packageName, pkgs[0].Name) 244 + assert.Equal(t, packageVersion, pkgs[0].Version) 245 + assert.Equal(t, packageType, pkgs[0].Type) 246 + assert.Equal(t, packageDescription, pkgs[0].Description) 247 + assert.Len(t, pkgs[0].Authors, 1) 248 + assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name) 249 + assert.Equal(t, "zip", pkgs[0].Dist.Type) 250 + assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum) 251 + assert.Len(t, pkgs[0].Bin, 1) 252 + assert.Equal(t, packageBin, pkgs[0].Bin[0]) 253 + assert.Equal(t, repo1.HTMLURL(), pkgs[0].Source.URL) 254 + assert.Equal(t, "git", pkgs[0].Source.Type) 255 + assert.Equal(t, packageVersion, pkgs[0].Source.Reference) 221 256 }) 222 257 }