From a5d2104195ea083cc790e16958af7c0e3c6d994f Mon Sep 17 00:00:00 2001 From: eleith Date: Mon, 24 Oct 2022 21:56:40 -0700 Subject: [PATCH] support binaries in npm packages, backport of fix --- integrations/api_packages_npm_test.go | 6 ++++++ modules/packages/npm/creator.go | 5 ++++- modules/packages/npm/creator_test.go | 5 +++++ modules/packages/npm/metadata.go | 1 + routers/api/packages/npm/api.go | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/integrations/api_packages_npm_test.go b/integrations/api_packages_npm_test.go index ad88ac5da6764..bd65a2586714c 100644 --- a/integrations/api_packages_npm_test.go +++ b/integrations/api_packages_npm_test.go @@ -34,6 +34,8 @@ func TestPackageNpm(t *testing.T) { packageTag2 := "release" packageAuthor := "KN4CK3R" packageDescription := "Test Description" + packageBinName := "cli" + packageBinPath := "./cli.sh" data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA" upload := `{ @@ -51,6 +53,9 @@ func TestPackageNpm(t *testing.T) { "author": { "name": "` + packageAuthor + `" }, + "bin": { + "` + packageBinName + `": "` + packageBinPath + `" + }, "dist": { "integrity": "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg==", "shasum": "aaa7eaf852a948b0aa05afeda35b1badca155d90" @@ -150,6 +155,7 @@ func TestPackageNpm(t *testing.T) { assert.Equal(t, packageName, pmv.Name) assert.Equal(t, packageDescription, pmv.Description) assert.Equal(t, packageAuthor, pmv.Author.Name) + assert.Equal(t, packageBinPath, pmv.Bin[packageBinName]) assert.Equal(t, "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg==", pmv.Dist.Integrity) assert.Equal(t, "aaa7eaf852a948b0aa05afeda35b1badca155d90", pmv.Dist.Shasum) assert.Equal(t, fmt.Sprintf("%s%s/-/%s/%s", setting.AppURL, root[1:], packageVersion, filename), pmv.Dist.Tarball) diff --git a/modules/packages/npm/creator.go b/modules/packages/npm/creator.go index 88ce55ecdbef8..40ac806527531 100644 --- a/modules/packages/npm/creator.go +++ b/modules/packages/npm/creator.go @@ -66,7 +66,8 @@ type PackageMetadata struct { License string `json:"license,omitempty"` } -// PackageMetadataVersion https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version +// PackageMetadataVersion documentation: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version +// PackageMetadataVersion response: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object type PackageMetadataVersion struct { ID string `json:"_id"` Name string `json:"name"` @@ -80,6 +81,7 @@ type PackageMetadataVersion struct { Dependencies map[string]string `json:"dependencies,omitempty"` DevDependencies map[string]string `json:"devDependencies,omitempty"` PeerDependencies map[string]string `json:"peerDependencies,omitempty"` + Bin map[string]string `json:"bin,omitempty"` OptionalDependencies map[string]string `json:"optionalDependencies,omitempty"` Readme string `json:"readme,omitempty"` Dist PackageDistribution `json:"dist"` @@ -192,6 +194,7 @@ func ParsePackage(r io.Reader) (*Package, error) { DevelopmentDependencies: meta.DevDependencies, PeerDependencies: meta.PeerDependencies, OptionalDependencies: meta.OptionalDependencies, + Bin: meta.Bin, Readme: meta.Readme, }, } diff --git a/modules/packages/npm/creator_test.go b/modules/packages/npm/creator_test.go index 64ae6238f3baf..2b844f4b0e5f1 100644 --- a/modules/packages/npm/creator_test.go +++ b/modules/packages/npm/creator_test.go @@ -23,6 +23,7 @@ func TestParsePackage(t *testing.T) { packageVersion := "1.0.1-pre" packageTag := "latest" packageAuthor := "KN4CK3R" + packageBin := "gitea" packageDescription := "Test Description" data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA" integrity := "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg==" @@ -236,6 +237,9 @@ func TestParsePackage(t *testing.T) { Dependencies: map[string]string{ "package": "1.2.0", }, + Bin: map[string]string{ + "bin": packageBin, + }, Dist: PackageDistribution{ Integrity: integrity, }, @@ -264,6 +268,7 @@ func TestParsePackage(t *testing.T) { assert.Equal(t, packageDescription, p.Metadata.Description) assert.Equal(t, packageDescription, p.Metadata.Readme) assert.Equal(t, packageAuthor, p.Metadata.Author) + assert.Equal(t, packageBin, p.Metadata.Bin["bin"]) assert.Equal(t, "MIT", p.Metadata.License) assert.Equal(t, "https://gitea.io/", p.Metadata.ProjectURL) assert.Contains(t, p.Metadata.Dependencies, "package") diff --git a/modules/packages/npm/metadata.go b/modules/packages/npm/metadata.go index 643a4d344b7de..44714cd6ea5d6 100644 --- a/modules/packages/npm/metadata.go +++ b/modules/packages/npm/metadata.go @@ -20,5 +20,6 @@ type Metadata struct { DevelopmentDependencies map[string]string `json:"development_dependencies,omitempty"` PeerDependencies map[string]string `json:"peer_dependencies,omitempty"` OptionalDependencies map[string]string `json:"optional_dependencies,omitempty"` + Bin map[string]string `json:"bin,omitempty"` Readme string `json:"readme,omitempty"` } diff --git a/routers/api/packages/npm/api.go b/routers/api/packages/npm/api.go index 763c595152ec1..d6fa5417b12e7 100644 --- a/routers/api/packages/npm/api.go +++ b/routers/api/packages/npm/api.go @@ -67,6 +67,7 @@ func createPackageMetadataVersion(registryURL string, pd *packages_model.Package PeerDependencies: metadata.PeerDependencies, OptionalDependencies: metadata.OptionalDependencies, Readme: metadata.Readme, + Bin: metadata.Bin, Dist: npm_module.PackageDistribution{ Shasum: pd.Files[0].Blob.HashSHA1, Integrity: "sha512-" + base64.StdEncoding.EncodeToString(hashBytes),