Skip to content

Commit aca2154

Browse files
authored
Add composor source field (#33502)
Fix #33066
1 parent ae4a3d7 commit aca2154

File tree

4 files changed

+70
-13
lines changed

4 files changed

+70
-13
lines changed

models/packages/descriptor.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,12 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
110110
if err != nil {
111111
return nil, err
112112
}
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+
}
116119
}
117120
creator, err := user_model.GetUserByID(ctx, pv.CreatorID)
118121
if err != nil {

routers/api/packages/composer/api.go

+20-2
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ type PackageMetadataResponse struct {
6666
}
6767

6868
// PackageVersionMetadata contains package metadata
69+
// https://getcomposer.org/doc/05-repositories.md#package
6970
type PackageVersionMetadata struct {
7071
*composer_module.Metadata
7172
Name string `json:"name"`
7273
Version string `json:"version"`
7374
Type string `json:"type"`
7475
Created time.Time `json:"time"`
7576
Dist Dist `json:"dist"`
77+
Source Source `json:"source"`
7678
}
7779

7880
// Dist contains package download information
@@ -82,6 +84,13 @@ type Dist struct {
8284
Checksum string `json:"shasum"`
8385
}
8486

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+
8594
func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse {
8695
versions := make([]*PackageVersionMetadata, 0, len(pds))
8796

@@ -94,7 +103,7 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac
94103
}
95104
}
96105

97-
versions = append(versions, &PackageVersionMetadata{
106+
pkg := PackageVersionMetadata{
98107
Name: pd.Package.Name,
99108
Version: pd.Version.Version,
100109
Type: packageType,
@@ -105,7 +114,16 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac
105114
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)),
106115
Checksum: pd.Files[0].Blob.HashSHA1,
107116
},
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)
109127
}
110128

111129
return &PackageMetadataResponse{

services/packages/package_update.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,17 @@ func UnlinkFromRepository(ctx context.Context, pkg *packages_model.Package, doer
4444
}
4545

4646
repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID)
47-
if err != nil {
47+
if err != nil && !repo_model.IsErrRepoNotExist(err) {
4848
return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err)
4949
}
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+
}
5758
}
5859

5960
user, err := user_model.GetUserByID(ctx, pkg.OwnerID)

tests/integration/api_packages_composer_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"code.gitea.io/gitea/models/db"
1515
"code.gitea.io/gitea/models/packages"
16+
repo_model "code.gitea.io/gitea/models/repo"
1617
"code.gitea.io/gitea/models/unittest"
1718
user_model "code.gitea.io/gitea/models/user"
1819
composer_module "code.gitea.io/gitea/modules/packages/composer"
@@ -217,5 +218,39 @@ func TestPackageComposer(t *testing.T) {
217218
assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum)
218219
assert.Len(t, pkgs[0].Bin, 1)
219220
assert.Equal(t, packageBin, pkgs[0].Bin[0])
221+
222+
// Test package linked to repository
223+
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
224+
userPkgs, err := packages.GetPackagesByType(db.DefaultContext, user.ID, packages.TypeComposer)
225+
assert.NoError(t, err)
226+
assert.Len(t, userPkgs, 1)
227+
assert.EqualValues(t, 0, userPkgs[0].RepoID)
228+
229+
err = packages.SetRepositoryLink(db.DefaultContext, userPkgs[0].ID, repo1.ID)
230+
assert.NoError(t, err)
231+
232+
req = NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName)).
233+
AddBasicAuth(user.Name)
234+
resp = MakeRequest(t, req, http.StatusOK)
235+
236+
result = composer.PackageMetadataResponse{}
237+
DecodeJSON(t, resp, &result)
238+
239+
assert.Contains(t, result.Packages, packageName)
240+
pkgs = result.Packages[packageName]
241+
assert.Len(t, pkgs, 1)
242+
assert.Equal(t, packageName, pkgs[0].Name)
243+
assert.Equal(t, packageVersion, pkgs[0].Version)
244+
assert.Equal(t, packageType, pkgs[0].Type)
245+
assert.Equal(t, packageDescription, pkgs[0].Description)
246+
assert.Len(t, pkgs[0].Authors, 1)
247+
assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name)
248+
assert.Equal(t, "zip", pkgs[0].Dist.Type)
249+
assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum)
250+
assert.Len(t, pkgs[0].Bin, 1)
251+
assert.Equal(t, packageBin, pkgs[0].Bin[0])
252+
assert.Equal(t, repo1.HTMLURL(), pkgs[0].Source.URL)
253+
assert.Equal(t, "git", pkgs[0].Source.Type)
254+
assert.Equal(t, packageVersion, pkgs[0].Source.Reference)
220255
})
221256
}

0 commit comments

Comments
 (0)