From de389f2ecc070244d3065c1ca0390fa8e330dd51 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 13 Nov 2024 21:26:49 +0100 Subject: [PATCH] fix: handle renamed dependency for cargo registery - When a dependency is renamed, specified via `package="actual-name"` in Cargo.toml, this should become the name of the depedency when the package is retrieved from the registery by cargo and the old name should be available in the `package` field. - The reference implementation also does this: https://github.com/rust-lang/crates.io/blob/490e66a9d661f76cc5cfb4ed14dd8607855a0516/src/controllers/krate/publish.rs#L702-L705 - Resolves #5936 - Unit test added. (cherry picked from commit bb93d3e6c8341b0bbc37c7dfe456609e3e3d3e15) --- modules/packages/cargo/parser.go | 13 +++++++++-- modules/packages/cargo/parser_test.go | 31 ++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/modules/packages/cargo/parser.go b/modules/packages/cargo/parser.go index 36cd44df84..a09cfc1f73 100644 --- a/modules/packages/cargo/parser.go +++ b/modules/packages/cargo/parser.go @@ -96,7 +96,7 @@ func parsePackage(r io.Reader) (*Package, error) { Target *string `json:"target"` Kind string `json:"kind"` Registry *string `json:"registry"` - ExplicitNameInToml string `json:"explicit_name_in_toml"` + ExplicitNameInToml *string `json:"explicit_name_in_toml"` } `json:"deps"` Features map[string][]string `json:"features"` Authors []string `json:"authors"` @@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) { dependencies := make([]*Dependency, 0, len(meta.Deps)) for _, dep := range meta.Deps { + name := dep.Name + packageName := dep.ExplicitNameInToml + // If the explicit_name_in_toml field is set, the package is renamed and + // should be set accordingly. + if dep.ExplicitNameInToml != nil { + name = *dep.ExplicitNameInToml + packageName = &dep.Name + } dependencies = append(dependencies, &Dependency{ - Name: dep.Name, + Name: name, Req: dep.VersionReq, Features: dep.Features, Optional: dep.Optional, @@ -145,6 +153,7 @@ func parsePackage(r io.Reader) (*Package, error) { Target: dep.Target, Kind: dep.Kind, Registry: dep.Registry, + Package: packageName, }) } diff --git a/modules/packages/cargo/parser_test.go b/modules/packages/cargo/parser_test.go index 4b357cb869..8792a7a977 100644 --- a/modules/packages/cargo/parser_test.go +++ b/modules/packages/cargo/parser_test.go @@ -22,7 +22,7 @@ const ( ) func TestParsePackage(t *testing.T) { - createPackage := func(name, version string) io.Reader { + createPackage := func(name, version, dependency string) io.Reader { metadata := `{ "name":"` + name + `", "vers":"` + version + `", @@ -32,7 +32,7 @@ func TestParsePackage(t *testing.T) { { "name":"dep", "version_req":"1.0" - } + }` + dependency + ` ], "homepage":"` + homepage + `", "license":"` + license + `" @@ -48,7 +48,7 @@ func TestParsePackage(t *testing.T) { t.Run("InvalidName", func(t *testing.T) { for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} { - data := createPackage(name, "1.0.0") + data := createPackage(name, "1.0.0", "") cp, err := ParsePackage(data) assert.Nil(t, cp) @@ -58,7 +58,7 @@ func TestParsePackage(t *testing.T) { t.Run("InvalidVersion", func(t *testing.T) { for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} { - data := createPackage("test", version) + data := createPackage("test", version, "") cp, err := ParsePackage(data) assert.Nil(t, cp) @@ -67,7 +67,7 @@ func TestParsePackage(t *testing.T) { }) t.Run("Valid", func(t *testing.T) { - data := createPackage("test", "1.0.0") + data := createPackage("test", "1.0.0", "") cp, err := ParsePackage(data) assert.NotNil(t, cp) @@ -84,4 +84,25 @@ func TestParsePackage(t *testing.T) { content, _ := io.ReadAll(cp.Content) assert.Equal(t, "test", string(content)) }) + + t.Run("Renamed dependency", func(t *testing.T) { + data := createPackage("test", "1.0.0", `, {"name":"v4l2-sys", "version":"0.3.0", "explicit_name_in_toml":"v4l2-sys-mit"}`) + + cp, err := ParsePackage(data) + assert.NotNil(t, cp) + require.NoError(t, err) + + assert.Equal(t, "test", cp.Name) + assert.Equal(t, "1.0.0", cp.Version) + assert.Equal(t, description, cp.Metadata.Description) + assert.Equal(t, []string{author}, cp.Metadata.Authors) + assert.Len(t, cp.Metadata.Dependencies, 2) + assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name) + assert.EqualValues(t, "v4l2-sys-mit", cp.Metadata.Dependencies[1].Name) + assert.EqualValues(t, "v4l2-sys", *cp.Metadata.Dependencies[1].Package) + assert.Equal(t, homepage, cp.Metadata.ProjectURL) + assert.Equal(t, license, cp.Metadata.License) + content, _ := io.ReadAll(cp.Content) + assert.Equal(t, "test", string(content)) + }) }