Skip to content

Commit 1660fea

Browse files
committed
feat: support checking if versions exist in crates.io
Signed-off-by: Gareth Jones <[email protected]>
1 parent f47e8b9 commit 1660fea

File tree

3 files changed

+87
-36
lines changed

3 files changed

+87
-36
lines changed

tools/osv-linter/internal/pkgchecker/ecosystems.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func VersionsExistInEcosystem(pkg string, versions []string, ecosystem string) e
133133
case "CRAN":
134134
return nil
135135
case "crates.io":
136-
return nil
136+
return versionsExistInCrates(pkg, versions)
137137
case "Debian":
138138
return nil
139139
case "GIT":

tools/osv-linter/internal/pkgchecker/ecosystems_test.go

Lines changed: 73 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,70 @@ package pkgchecker
22

33
import "testing"
44

5+
func Test_versionsExistInCrates(t *testing.T) {
6+
t.Parallel()
7+
8+
type args struct {
9+
pkg string
10+
versions []string
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
wantErr bool
16+
}{
17+
{
18+
name: "multiple_versions_which_all_exist",
19+
args: args{
20+
pkg: "defmt",
21+
versions: []string{"0.0.0", "0.3.0", "0.3.100-rc.1", "1.0.0-rc.1", "1.0.1"},
22+
},
23+
wantErr: false,
24+
},
25+
{
26+
name: "multiple_versions_with_one_that_does_not_exist",
27+
args: args{
28+
pkg: "defmt",
29+
versions: []string{"1.1", "0.3.6-beta", "1.1.2"},
30+
},
31+
wantErr: true,
32+
},
33+
{
34+
name: "an_invalid_version",
35+
args: args{
36+
pkg: "defmt",
37+
versions: []string{"!"},
38+
},
39+
wantErr: true,
40+
},
41+
{
42+
name: "an_invalid_package",
43+
args: args{
44+
pkg: "!",
45+
versions: []string{"1.0.0"},
46+
},
47+
wantErr: true,
48+
},
49+
{
50+
name: "a_package_that_does_not_exit",
51+
args: args{
52+
pkg: "not-a-real-package-hopefully",
53+
versions: []string{"1.0.0"},
54+
},
55+
wantErr: true,
56+
},
57+
}
58+
for _, tt := range tests {
59+
t.Run(tt.name, func(t *testing.T) {
60+
t.Parallel()
61+
62+
if err := versionsExistInCrates(tt.args.pkg, tt.args.versions); (err != nil) != tt.wantErr {
63+
t.Errorf("versionsExistInCrates() error = %v, wantErr %v", err, tt.wantErr)
64+
}
65+
})
66+
}
67+
}
68+
569
func Test_versionsExistInGo(t *testing.T) {
670
type args struct {
771
pkg string
@@ -115,52 +179,26 @@ func Test_versionsExistInNpm(t *testing.T) {
115179
wantErr bool
116180
}{
117181
{
118-
name: "multiple_versions_which_all_exist",
182+
name: "an unreleased package",
119183
args: args{
120-
pkg: "semver",
121-
versions: []string{"1.0.1", "2.0.0-beta", "5.7.1"},
184+
pkg: "github.com/nanobox-io/golang-nanoauth",
185+
versions: nil,
122186
},
123187
wantErr: false,
124188
},
125189
{
126-
name: "multiple_versions_with_one_that_does_not_exist",
127-
args: args{
128-
pkg: "semver",
129-
versions: []string{"1.1", "2.0.0-beta1", "3.1.5", "5.1rc1"},
130-
},
131-
wantErr: true,
132-
},
133-
{
134-
name: "an_invalid_version",
135-
args: args{
136-
pkg: "semver",
137-
versions: []string{"!"},
138-
},
139-
wantErr: true,
140-
},
141-
{
142-
name: "an_invalid_package",
143-
args: args{
144-
pkg: "!",
145-
versions: []string{"1.0.0"},
146-
},
147-
wantErr: true,
148-
},
149-
{
150-
name: "a_package_that_does_not_exit",
190+
name: "a released package",
151191
args: args{
152-
pkg: "not-a-real-package-hopefully",
153-
versions: []string{"1.0.0"},
192+
pkg: "github.com/oauth2-proxy/oauth2-proxy",
193+
versions: []string{"1.1.1"},
154194
},
155-
wantErr: true,
195+
wantErr: false,
156196
},
157197
}
158198
for _, tt := range tests {
159199
t.Run(tt.name, func(t *testing.T) {
160-
t.Parallel()
161-
162-
if err := versionsExistInNpm(tt.args.pkg, tt.args.versions); (err != nil) != tt.wantErr {
163-
t.Errorf("versionsExistInNpm() error = %v, wantErr %v", err, tt.wantErr)
200+
if err := versionsExistInGo(tt.args.pkg, tt.args.versions); (err != nil) != tt.wantErr {
201+
t.Errorf("versionsExistInGo() error = %v, wantErr %v", err, tt.wantErr)
164202
}
165203
})
166204
}

tools/osv-linter/internal/pkgchecker/version_check.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ func versionsExistInGeneric(
7272
return nil
7373
}
7474

75+
// Confirm that all specified versions of a package exist in crates.io.
76+
func versionsExistInCrates(pkg string, versions []string) error {
77+
// https://crates.io/api/v1/crates/A-Mazed
78+
packageInstanceURL := fmt.Sprintf("%s/%s", EcosystemBaseURLs["crates.io"], pkg)
79+
80+
return versionsExistInGeneric(
81+
pkg, versions,
82+
"crates.io",
83+
packageInstanceURL,
84+
"versions", "num",
85+
)
86+
}
87+
7588
// Confirm that all specified versions of a package exist in Go.
7689
func versionsExistInGo(pkg string, versions []string) error {
7790
if pkg == "stdlib" || pkg == "toolchain" {

0 commit comments

Comments
 (0)