Merge ab61e4577360334408807e5160f8b962c15e52c4 into 21af8150b7ba315a9f75264ab77813b0b7c697a8

This commit is contained in:
Lunny Xiao 2025-02-19 17:53:18 -08:00 committed by GitHub
commit 765abc7780
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 60 additions and 5 deletions

View File

@ -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 {

View File

@ -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{

View File

@ -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"
@ -217,5 +218,38 @@ 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})
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer)
assert.NoError(t, err)
assert.Len(t, pvs, 1)
err = packages.SetRepositoryLink(db.DefaultContext, pvs[0].ID, repo1.ID)
assert.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)
}) })
} }