mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-03-13 07:02:01 -05:00
[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>
This commit is contained in:
commit
b10454a00c
8 changed files with 80 additions and 16 deletions
|
@ -110,9 +110,12 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
repository, err := repo_model.GetRepositoryByID(ctx, p.RepoID)
|
var repository *repo_model.Repository
|
||||||
if err != nil && !repo_model.IsErrRepoNotExist(err) {
|
if p.RepoID > 0 {
|
||||||
return nil, err
|
repository, err = repo_model.GetRepositoryByID(ctx, p.RepoID)
|
||||||
|
if err != nil && !repo_model.IsErrRepoNotExist(err) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
creator, err := user_model.GetUserByID(ctx, pv.CreatorID)
|
creator, err := user_model.GetUserByID(ctx, pv.CreatorID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1540,6 +1540,8 @@ issues.filter_milestones = Filter Milestone
|
||||||
issues.filter_projects = Filter Project
|
issues.filter_projects = Filter Project
|
||||||
issues.filter_labels = Filter Label
|
issues.filter_labels = Filter Label
|
||||||
issues.filter_reviewers = Filter Reviewer
|
issues.filter_reviewers = Filter Reviewer
|
||||||
|
issues.filter_no_results = No results
|
||||||
|
issues.filter_no_results_placeholder = Try adjusting your search filters.
|
||||||
issues.new = New issue
|
issues.new = New issue
|
||||||
issues.new.title_empty = Title cannot be empty
|
issues.new.title_empty = Title cannot be empty
|
||||||
issues.new.labels = Labels
|
issues.new.labels = Labels
|
||||||
|
|
|
@ -66,6 +66,7 @@ type PackageMetadataResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackageVersionMetadata contains package metadata
|
// PackageVersionMetadata contains package metadata
|
||||||
|
// https://getcomposer.org/doc/05-repositories.md#package
|
||||||
type PackageVersionMetadata struct {
|
type PackageVersionMetadata struct {
|
||||||
*composer_module.Metadata
|
*composer_module.Metadata
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
@ -73,6 +74,7 @@ type PackageVersionMetadata struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Created time.Time `json:"time"`
|
Created time.Time `json:"time"`
|
||||||
Dist Dist `json:"dist"`
|
Dist Dist `json:"dist"`
|
||||||
|
Source Source `json:"source"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dist contains package download information
|
// Dist contains package download information
|
||||||
|
@ -82,6 +84,13 @@ type Dist struct {
|
||||||
Checksum string `json:"shasum"`
|
Checksum string `json:"shasum"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Source contains package source information
|
||||||
|
type Source struct {
|
||||||
|
URL string `json:"url"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Reference string `json:"reference"`
|
||||||
|
}
|
||||||
|
|
||||||
func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse {
|
func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse {
|
||||||
versions := make([]*PackageVersionMetadata, 0, len(pds))
|
versions := make([]*PackageVersionMetadata, 0, len(pds))
|
||||||
|
|
||||||
|
@ -94,7 +103,7 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
versions = append(versions, &PackageVersionMetadata{
|
pkg := PackageVersionMetadata{
|
||||||
Name: pd.Package.Name,
|
Name: pd.Package.Name,
|
||||||
Version: pd.Version.Version,
|
Version: pd.Version.Version,
|
||||||
Type: packageType,
|
Type: packageType,
|
||||||
|
@ -105,7 +114,16 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac
|
||||||
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)),
|
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)),
|
||||||
Checksum: pd.Files[0].Blob.HashSHA1,
|
Checksum: pd.Files[0].Blob.HashSHA1,
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
if pd.Repository != nil {
|
||||||
|
pkg.Source = Source{
|
||||||
|
URL: pd.Repository.HTMLURL(),
|
||||||
|
Type: "git",
|
||||||
|
Reference: pd.Version.Version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
versions = append(versions, &pkg)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &PackageMetadataResponse{
|
return &PackageMetadataResponse{
|
||||||
|
|
|
@ -44,16 +44,17 @@ func UnlinkFromRepository(ctx context.Context, pkg *packages_model.Package, doer
|
||||||
}
|
}
|
||||||
|
|
||||||
repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID)
|
repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID)
|
||||||
if err != nil {
|
if err != nil && !repo_model.IsErrRepoNotExist(err) {
|
||||||
return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err)
|
return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err)
|
||||||
}
|
}
|
||||||
|
if err == nil {
|
||||||
perms, err := access_model.GetUserRepoPermission(ctx, repo, doer)
|
perms, err := access_model.GetUserRepoPermission(ctx, repo, doer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err)
|
return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err)
|
||||||
}
|
}
|
||||||
if !perms.CanWrite(unit.TypePackages) {
|
if !perms.CanWrite(unit.TypePackages) {
|
||||||
return util.ErrPermissionDenied
|
return util.ErrPermissionDenied
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := user_model.GetUserByID(ctx, pkg.OwnerID)
|
user, err := user_model.GetUserByID(ctx, pkg.OwnerID)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
{{if eq .Num -1}}
|
{{if eq .Num -1}}
|
||||||
<a class="disabled item">...</a>
|
<a class="disabled item">...</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class="{{if .IsCurrent}}active {{end}}item tw-items-center" {{if not .IsCurrent}}href="{{$paginationLink}}?page={{.Num}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>{{.Num}}</a>
|
<a class="{{if .IsCurrent}}active {{end}}item" {{if not .IsCurrent}}href="{{$paginationLink}}?page={{.Num}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>{{.Num}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
<a class="{{if not .HasNext}}disabled{{end}} item navigation" {{if .HasNext}}href="{{$paginationLink}}?page={{.Next}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>
|
<a class="{{if not .HasNext}}disabled{{end}} item navigation" {{if .HasNext}}href="{{$paginationLink}}?page={{.Next}}{{if $paginationParams}}&{{$paginationParams}}{{end}}"{{end}}>
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
{{ctx.Locale.PrettyNumber .OpenCount}} {{ctx.Locale.Tr "repo.issues.open_title"}}
|
{{ctx.Locale.PrettyNumber .OpenCount}} {{ctx.Locale.Tr "repo.issues.open_title"}}
|
||||||
</a>
|
</a>
|
||||||
<a class="{{if eq .State "closed"}}active {{end}}item" href="{{.ClosedLink}}" data-test-name="closed-issue-count">
|
<a class="{{if eq .State "closed"}}active {{end}}item" href="{{.ClosedLink}}" data-test-name="closed-issue-count">
|
||||||
{{svg "octicon-check" 16 "tw-mr-2"}}
|
{{svg "octicon-issue-closed" 16 "tw-mr-2"}}
|
||||||
{{ctx.Locale.PrettyNumber .ClosedCount}} {{ctx.Locale.Tr "repo.issues.closed_title"}}
|
{{ctx.Locale.PrettyNumber .ClosedCount}} {{ctx.Locale.Tr "repo.issues.closed_title"}}
|
||||||
</a>
|
</a>
|
||||||
{{if not .PageIsMilestones}}
|
{{if not .PageIsMilestones}}
|
||||||
|
|
|
@ -145,6 +145,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div class="tw-text-center tw-p-8">
|
||||||
|
<h3 class="tw-my-4">{{ctx.Locale.Tr "repo.issues.filter_no_results"}}</h3>
|
||||||
|
<p class="tw-text-placeholder-text">{{ctx.Locale.Tr "repo.issues.filter_no_results_placeholder"}}</p>
|
||||||
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .IssueIndexerUnavailable}}
|
{{if .IssueIndexerUnavailable}}
|
||||||
<div class="ui error message">
|
<div class="ui error message">
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/packages"
|
"code.gitea.io/gitea/models/packages"
|
||||||
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
composer_module "code.gitea.io/gitea/modules/packages/composer"
|
composer_module "code.gitea.io/gitea/modules/packages/composer"
|
||||||
|
@ -218,5 +219,39 @@ func TestPackageComposer(t *testing.T) {
|
||||||
assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum)
|
assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum)
|
||||||
assert.Len(t, pkgs[0].Bin, 1)
|
assert.Len(t, pkgs[0].Bin, 1)
|
||||||
assert.Equal(t, packageBin, pkgs[0].Bin[0])
|
assert.Equal(t, packageBin, pkgs[0].Bin[0])
|
||||||
|
|
||||||
|
// Test package linked to repository
|
||||||
|
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||||
|
userPkgs, err := packages.GetPackagesByType(db.DefaultContext, user.ID, packages.TypeComposer)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Len(t, userPkgs, 1)
|
||||||
|
assert.EqualValues(t, 0, userPkgs[0].RepoID)
|
||||||
|
|
||||||
|
err = packages.SetRepositoryLink(db.DefaultContext, userPkgs[0].ID, repo1.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
req = NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName)).
|
||||||
|
AddBasicAuth(user.Name)
|
||||||
|
resp = MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
|
result = composer.PackageMetadataResponse{}
|
||||||
|
DecodeJSON(t, resp, &result)
|
||||||
|
|
||||||
|
assert.Contains(t, result.Packages, packageName)
|
||||||
|
pkgs = result.Packages[packageName]
|
||||||
|
assert.Len(t, pkgs, 1)
|
||||||
|
assert.Equal(t, packageName, pkgs[0].Name)
|
||||||
|
assert.Equal(t, packageVersion, pkgs[0].Version)
|
||||||
|
assert.Equal(t, packageType, pkgs[0].Type)
|
||||||
|
assert.Equal(t, packageDescription, pkgs[0].Description)
|
||||||
|
assert.Len(t, pkgs[0].Authors, 1)
|
||||||
|
assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name)
|
||||||
|
assert.Equal(t, "zip", pkgs[0].Dist.Type)
|
||||||
|
assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum)
|
||||||
|
assert.Len(t, pkgs[0].Bin, 1)
|
||||||
|
assert.Equal(t, packageBin, pkgs[0].Bin[0])
|
||||||
|
assert.Equal(t, repo1.HTMLURL(), pkgs[0].Source.URL)
|
||||||
|
assert.Equal(t, "git", pkgs[0].Source.Type)
|
||||||
|
assert.Equal(t, packageVersion, pkgs[0].Source.Reference)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue