Skip to content

Commit 467269d

Browse files
authored
Merge branch 'main' into deps-102
2 parents defc618 + 98eb2b0 commit 467269d

File tree

13 files changed

+240
-95
lines changed

13 files changed

+240
-95
lines changed

go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,13 @@ require (
117117
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
118118
github.com/yuin/goldmark-meta v1.1.0
119119
gitlab.com/gitlab-org/api/client-go v0.142.4
120-
golang.org/x/crypto v0.43.0
120+
golang.org/x/crypto v0.45.0
121121
golang.org/x/image v0.30.0
122-
golang.org/x/net v0.45.0
122+
golang.org/x/net v0.47.0
123123
golang.org/x/oauth2 v0.30.0
124-
golang.org/x/sync v0.17.0
125-
golang.org/x/sys v0.37.0
126-
golang.org/x/text v0.30.0
124+
golang.org/x/sync v0.18.0
125+
golang.org/x/sys v0.38.0
126+
golang.org/x/text v0.31.0
127127
google.golang.org/grpc v1.75.0
128128
google.golang.org/protobuf v1.36.8
129129
gopkg.in/ini.v1 v1.67.0
@@ -281,9 +281,9 @@ require (
281281
go.uber.org/zap/exp v0.3.0 // indirect
282282
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
283283
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect
284-
golang.org/x/mod v0.28.0 // indirect
284+
golang.org/x/mod v0.29.0 // indirect
285285
golang.org/x/time v0.12.0 // indirect
286-
golang.org/x/tools v0.37.0 // indirect
286+
golang.org/x/tools v0.38.0 // indirect
287287
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect
288288
gopkg.in/warnings.v0 v0.1.2 // indirect
289289
gopkg.in/yaml.v2 v2.4.0 // indirect

go.sum

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -840,8 +840,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf
840840
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
841841
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
842842
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
843-
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
844-
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
843+
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
844+
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
845845
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
846846
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
847847
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -878,8 +878,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
878878
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
879879
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
880880
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
881-
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
882-
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
881+
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
882+
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
883883
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
884884
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
885885
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -908,8 +908,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
908908
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
909909
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
910910
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
911-
golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM=
912-
golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
911+
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
912+
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
913913
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
914914
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
915915
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -932,8 +932,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
932932
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
933933
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
934934
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
935-
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
936-
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
935+
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
936+
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
937937
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
938938
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
939939
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -975,8 +975,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
975975
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
976976
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
977977
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
978-
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
979-
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
978+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
979+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
980980
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
981981
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
982982
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -987,8 +987,8 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
987987
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
988988
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
989989
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
990-
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
991-
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
990+
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
991+
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
992992
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
993993
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
994994
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1002,8 +1002,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
10021002
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
10031003
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
10041004
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
1005-
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
1006-
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
1005+
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
1006+
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
10071007
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
10081008
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
10091009
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
@@ -1039,8 +1039,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
10391039
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
10401040
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
10411041
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
1042-
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
1043-
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
1042+
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
1043+
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
10441044
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
10451045
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
10461046
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

modules/packages/composer/metadata.go

Lines changed: 123 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
package composer
55

66
import (
7+
"archive/tar"
78
"archive/zip"
9+
"compress/bzip2"
10+
"compress/gzip"
11+
"errors"
812
"io"
13+
"io/fs"
914
"path"
1015
"regexp"
1116
"strings"
@@ -29,8 +34,10 @@ var (
2934
ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid")
3035
)
3136

32-
// Package represents a Composer package
33-
type Package struct {
37+
// PackageInfo represents Composer package info
38+
type PackageInfo struct {
39+
Filename string
40+
3441
Name string
3542
Version string
3643
Type string
@@ -44,7 +51,7 @@ type Metadata struct {
4451
Description string `json:"description,omitempty"`
4552
Readme string `json:"readme,omitempty"`
4653
Keywords []string `json:"keywords,omitempty"`
47-
Comments Comments `json:"_comments,omitempty"`
54+
Comments Comments `json:"_comment,omitempty"`
4855
Homepage string `json:"homepage,omitempty"`
4956
License Licenses `json:"license,omitempty"`
5057
Authors []Author `json:"authors,omitempty"`
@@ -75,7 +82,7 @@ func (l *Licenses) UnmarshalJSON(data []byte) error {
7582
if err := json.Unmarshal(data, &values); err != nil {
7683
return err
7784
}
78-
*l = Licenses(values)
85+
*l = values
7986
}
8087
return nil
8188
}
@@ -97,7 +104,7 @@ func (c *Comments) UnmarshalJSON(data []byte) error {
97104
if err := json.Unmarshal(data, &values); err != nil {
98105
return err
99106
}
100-
*c = Comments(values)
107+
*c = values
101108
}
102109
return nil
103110
}
@@ -111,46 +118,131 @@ type Author struct {
111118

112119
var nameMatch = regexp.MustCompile(`\A[a-z0-9]([_\.-]?[a-z0-9]+)*/[a-z0-9](([_\.]?|-{0,2})[a-z0-9]+)*\z`)
113120

114-
// ParsePackage parses the metadata of a Composer package file
115-
func ParsePackage(r io.ReaderAt, size int64) (*Package, error) {
116-
archive, err := zip.NewReader(r, size)
121+
type ReadSeekAt interface {
122+
io.Reader
123+
io.ReaderAt
124+
io.Seeker
125+
Size() int64
126+
}
127+
128+
func readPackageFileZip(r ReadSeekAt, filename string, limit int) ([]byte, error) {
129+
archive, err := zip.NewReader(r, r.Size())
117130
if err != nil {
118131
return nil, err
119132
}
120133

121134
for _, file := range archive.File {
122-
if strings.Count(file.Name, "/") > 1 {
123-
continue
124-
}
125-
if strings.HasSuffix(strings.ToLower(file.Name), "composer.json") {
135+
filePath := path.Clean(file.Name)
136+
if util.AsciiEqualFold(filePath, filename) {
126137
f, err := archive.Open(file.Name)
127138
if err != nil {
128139
return nil, err
129140
}
130141
defer f.Close()
131142

132-
return ParseComposerFile(archive, path.Dir(file.Name), f)
143+
return util.ReadWithLimit(f, limit)
144+
}
145+
}
146+
return nil, fs.ErrNotExist
147+
}
148+
149+
func readPackageFileTar(r io.Reader, filename string, limit int) ([]byte, error) {
150+
tarReader := tar.NewReader(r)
151+
for {
152+
header, err := tarReader.Next()
153+
if err == io.EOF {
154+
break
155+
} else if err != nil {
156+
return nil, err
157+
}
158+
159+
filePath := path.Clean(header.Name)
160+
if util.AsciiEqualFold(filePath, filename) {
161+
return util.ReadWithLimit(tarReader, limit)
133162
}
134163
}
135-
return nil, ErrMissingComposerFile
164+
return nil, fs.ErrNotExist
136165
}
137166

138-
// ParseComposerFile parses a composer.json file to retrieve the metadata of a Composer package
139-
func ParseComposerFile(archive *zip.Reader, pathPrefix string, r io.Reader) (*Package, error) {
167+
const (
168+
pkgExtZip = ".zip"
169+
pkgExtTarGz = ".tar.gz"
170+
pkgExtTarBz2 = ".tar.bz2"
171+
)
172+
173+
func detectPackageExtName(r ReadSeekAt) (string, error) {
174+
headBytes := make([]byte, 4)
175+
_, err := r.ReadAt(headBytes, 0)
176+
if err != nil {
177+
return "", err
178+
}
179+
_, err = r.Seek(0, io.SeekStart)
180+
if err != nil {
181+
return "", err
182+
}
183+
switch {
184+
case headBytes[0] == 'P' && headBytes[1] == 'K':
185+
return pkgExtZip, nil
186+
case string(headBytes[:3]) == "BZh":
187+
return pkgExtTarBz2, nil
188+
case headBytes[0] == 0x1f && headBytes[1] == 0x8b:
189+
return pkgExtTarGz, nil
190+
}
191+
return "", util.NewInvalidArgumentErrorf("not a valid package file")
192+
}
193+
194+
func readPackageFile(pkgExt string, r ReadSeekAt, filename string, limit int) ([]byte, error) {
195+
_, err := r.Seek(0, io.SeekStart)
196+
if err != nil {
197+
return nil, err
198+
}
199+
200+
switch pkgExt {
201+
case pkgExtZip:
202+
return readPackageFileZip(r, filename, limit)
203+
case pkgExtTarBz2:
204+
bzip2Reader := bzip2.NewReader(r)
205+
return readPackageFileTar(bzip2Reader, filename, limit)
206+
case pkgExtTarGz:
207+
gzReader, err := gzip.NewReader(r)
208+
if err != nil {
209+
return nil, err
210+
}
211+
return readPackageFileTar(gzReader, filename, limit)
212+
}
213+
return nil, util.NewInvalidArgumentErrorf("not a valid package file")
214+
}
215+
216+
// ParsePackage parses the metadata of a Composer package file
217+
func ParsePackage(r ReadSeekAt, optVersion ...string) (*PackageInfo, error) {
218+
pkgExt, err := detectPackageExtName(r)
219+
if err != nil {
220+
return nil, err
221+
}
222+
dataComposerJSON, err := readPackageFile(pkgExt, r, "composer.json", 10*1024*1024)
223+
if errors.Is(err, fs.ErrNotExist) {
224+
return nil, ErrMissingComposerFile
225+
} else if err != nil {
226+
return nil, err
227+
}
228+
140229
var cj struct {
141230
Name string `json:"name"`
142231
Version string `json:"version"`
143232
Type string `json:"type"`
144233
Metadata
145234
}
146-
if err := json.NewDecoder(r).Decode(&cj); err != nil {
235+
if err := json.Unmarshal(dataComposerJSON, &cj); err != nil {
147236
return nil, err
148237
}
149238

150239
if !nameMatch.MatchString(cj.Name) {
151240
return nil, ErrInvalidName
152241
}
153242

243+
if cj.Version == "" {
244+
cj.Version = util.OptionalArg(optVersion)
245+
}
154246
if cj.Version != "" {
155247
if _, err := version.NewSemver(cj.Version); err != nil {
156248
return nil, ErrInvalidVersion
@@ -168,17 +260,23 @@ func ParseComposerFile(archive *zip.Reader, pathPrefix string, r io.Reader) (*Pa
168260
if cj.Readme == "" {
169261
cj.Readme = "README.md"
170262
}
171-
f, err := archive.Open(path.Join(pathPrefix, cj.Readme))
172-
if err == nil {
173-
// 10kb limit for readme content
174-
buf, _ := io.ReadAll(io.LimitReader(f, 10*1024))
175-
cj.Readme = string(buf)
176-
_ = f.Close()
177-
} else {
263+
dataReadmeMd, _ := readPackageFile(pkgExt, r, cj.Readme, 10*1024)
264+
265+
// FIXME: legacy problem, the "Readme" field is abused, it should always be the path to the readme file
266+
if len(dataReadmeMd) == 0 {
178267
cj.Readme = ""
268+
} else {
269+
cj.Readme = string(dataReadmeMd)
179270
}
180271

181-
return &Package{
272+
// FIXME: legacy format: strings.ToLower(fmt.Sprintf("%s.%s.zip", strings.ReplaceAll(cp.Name, "/", "-"), cp.Version)), doesn't read good
273+
pkgFilename := strings.ReplaceAll(cj.Name, "/", "-")
274+
if cj.Version != "" {
275+
pkgFilename += "." + cj.Version
276+
}
277+
pkgFilename += pkgExt
278+
return &PackageInfo{
279+
Filename: pkgFilename,
182280
Name: cj.Name,
183281
Version: cj.Version,
184282
Type: cj.Type,

0 commit comments

Comments
 (0)