]> source.dussan.org Git - gitea.git/commitdiff
cargo registry - respect renamed dependencies (#32430)
authorAlbin Hedman <albin9604@gmail.com>
Tue, 12 Nov 2024 02:57:30 +0000 (03:57 +0100)
committerGitHub <noreply@github.com>
Tue, 12 Nov 2024 02:57:30 +0000 (02:57 +0000)
rust allows renaming dependencies such as when depending on multiple
versions of the same package. This is not supported by gitea as
discovered in #31500 . This PR tries to address that.

---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
modules/packages/cargo/parser.go
modules/packages/cargo/parser_test.go

index 36cd44df847aad67b644ba14e7f3f35d62e5d0c9..d82e0e2f058d74b630f7c6d08377635fb7cb7805 100644 (file)
@@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) {
 
        dependencies := make([]*Dependency, 0, len(meta.Deps))
        for _, dep := range meta.Deps {
+               // https://doc.rust-lang.org/cargo/reference/registry-web-api.html#publish
+               // It is a string of the new package name if the dependency is renamed, otherwise empty
+               name := dep.ExplicitNameInToml
+               pkg := &dep.Name
+               if name == "" {
+                       name = dep.Name
+                       pkg = nil
+               }
                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:         pkg,
                })
        }
 
index 2230a5b4999c94e3fef3da001972e09276cd68a2..0a120b8074cdfe79cfcfed6359a8bd92ae0dc22f 100644 (file)
@@ -13,16 +13,16 @@ import (
        "github.com/stretchr/testify/assert"
 )
 
-const (
-       description = "Package Description"
-       author      = "KN4CK3R"
-       homepage    = "https://gitea.io/"
-       license     = "MIT"
-)
-
 func TestParsePackage(t *testing.T) {
-       createPackage := func(name, version string) io.Reader {
-               metadata := `{
+       const (
+               description = "Package Description"
+               author      = "KN4CK3R"
+               homepage    = "https://gitea.io/"
+               license     = "MIT"
+               payload     = "gitea test dummy payload" // a fake payload for test only
+       )
+       makeDefaultPackageMeta := func(name, version string) string {
+               return `{
    "name":"` + name + `",
    "vers":"` + version + `",
    "description":"` + description + `",
@@ -36,18 +36,19 @@ func TestParsePackage(t *testing.T) {
    "homepage":"` + homepage + `",
    "license":"` + license + `"
 }`
-
+       }
+       createPackage := func(metadata string) io.Reader {
                var buf bytes.Buffer
                binary.Write(&buf, binary.LittleEndian, uint32(len(metadata)))
                buf.WriteString(metadata)
-               binary.Write(&buf, binary.LittleEndian, uint32(4))
-               buf.WriteString("test")
+               binary.Write(&buf, binary.LittleEndian, uint32(len(payload)))
+               buf.WriteString(payload)
                return &buf
        }
 
        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(makeDefaultPackageMeta(name, "1.0.0"))
 
                        cp, err := ParsePackage(data)
                        assert.Nil(t, cp)
@@ -57,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(makeDefaultPackageMeta("test", version))
 
                        cp, err := ParsePackage(data)
                        assert.Nil(t, cp)
@@ -66,7 +67,7 @@ func TestParsePackage(t *testing.T) {
        })
 
        t.Run("Valid", func(t *testing.T) {
-               data := createPackage("test", "1.0.0")
+               data := createPackage(makeDefaultPackageMeta("test", "1.0.0"))
 
                cp, err := ParsePackage(data)
                assert.NotNil(t, cp)
@@ -78,9 +79,34 @@ func TestParsePackage(t *testing.T) {
                assert.Equal(t, []string{author}, cp.Metadata.Authors)
                assert.Len(t, cp.Metadata.Dependencies, 1)
                assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name)
+               assert.Nil(t, cp.Metadata.Dependencies[0].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))
+               assert.Equal(t, payload, string(content))
+       })
+
+       t.Run("Renamed", func(t *testing.T) {
+               data := createPackage(`{
+   "name":"test-pkg",
+   "vers":"1.0",
+   "description":"test-desc",
+   "authors": ["test-author"],
+   "deps":[
+      {
+         "name":"dep-renamed",
+         "explicit_name_in_toml":"dep-explicit",
+         "version_req":"1.0"
+      }
+   ],
+   "homepage":"https://gitea.io/",
+   "license":"MIT"
+}`)
+               cp, err := ParsePackage(data)
+               assert.NoError(t, err)
+               assert.Equal(t, "test-pkg", cp.Name)
+               assert.Equal(t, "https://gitea.io/", cp.Metadata.ProjectURL)
+               assert.Equal(t, "dep-explicit", cp.Metadata.Dependencies[0].Name)
+               assert.Equal(t, "dep-renamed", *cp.Metadata.Dependencies[0].Package)
        })
 }