dependabot-go_modules 0.143.4 → 0.145.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/helpers/Makefile +2 -2
- data/helpers/build +2 -2
- data/helpers/go.mod +2 -9
- data/helpers/go.sum +2 -3
- data/helpers/main.go +3 -3
- data/helpers/updatechecker/main.go +13 -37
- data/helpers/updater/helpers.go +16 -8
- data/helpers/updater/main.go +3 -1
- data/lib/dependabot/go_modules/file_parser.rb +15 -6
- data/lib/dependabot/go_modules/file_updater/go_mod_updater.rb +3 -31
- data/lib/dependabot/go_modules/replace_stubber.rb +55 -0
- data/lib/dependabot/go_modules/update_checker.rb +9 -59
- data/lib/dependabot/go_modules/update_checker/latest_version_finder.rb +147 -0
- metadata +6 -6
- data/helpers/updater/go.mod +0 -3
- data/helpers/updater/go.sum +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3550327e043cedb78207a2adc2118caec2ce9b489899c781060529f8c9603ba
|
4
|
+
data.tar.gz: 0f8dd232a699b2a5dbd4af229ae0cc377fad47b6a1d482650658261f63f818c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a183b6d5a4904b4726f6c41b75db08b0a46f024142c312506e4f9d7e5676e8274941c3c170f66f0f24e70b09b8dee3a434653d62cbbd144d73e01adf081a7dab
|
7
|
+
data.tar.gz: 3f66295d4afd99494995640be323a003e86ede3577ca8618da606e07606411026ddd31ef9ab33ede89ad7ab6de4bf011de4f886eecedd25e9000a76f7ec0fe8c
|
data/helpers/Makefile
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
all: darwin linux
|
4
4
|
|
5
5
|
darwin:
|
6
|
-
|
6
|
+
GOOS=darwin GOARCH=amd64 go build -o go-helpers.darwin64 .
|
7
7
|
|
8
8
|
linux:
|
9
|
-
|
9
|
+
GOOS=linux GOARCH=amd64 go build -o go-helpers.linux64 .
|
data/helpers/build
CHANGED
@@ -23,5 +23,5 @@ cd $helpers_dir
|
|
23
23
|
os="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
24
24
|
echo "building $install_dir/bin/helper"
|
25
25
|
|
26
|
-
|
27
|
-
go clean -cache -modcache
|
26
|
+
GOOS="$os" GOARCH=amd64 go build -o "$install_dir/bin/helper" .
|
27
|
+
go clean -cache -modcache
|
data/helpers/go.mod
CHANGED
@@ -1,16 +1,9 @@
|
|
1
1
|
module github.com/dependabot/dependabot-core/go_modules/helpers
|
2
2
|
|
3
|
-
go 1.
|
3
|
+
go 1.16
|
4
4
|
|
5
5
|
require (
|
6
6
|
github.com/Masterminds/vcs v1.13.1
|
7
|
-
github.com/dependabot/
|
8
|
-
github.com/dependabot/gomodules-extracted v1.2.0
|
7
|
+
github.com/dependabot/gomodules-extracted v1.3.0
|
9
8
|
golang.org/x/mod v0.4.2
|
10
9
|
)
|
11
|
-
|
12
|
-
replace github.com/dependabot/dependabot-core/go_modules/helpers/importresolver => ./importresolver
|
13
|
-
|
14
|
-
replace github.com/dependabot/dependabot-core/go_modules/helpers/updater => ./updater
|
15
|
-
|
16
|
-
replace github.com/dependabot/dependabot-core/go_modules/helpers/updatechecker => ./updatechecker
|
data/helpers/go.sum
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
github.com/Masterminds/vcs v1.13.1 h1:NL3G1X7/7xduQtA2sJLpVpfHTNBALVNSjob6KEjPXNQ=
|
2
2
|
github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
|
3
|
-
github.com/dependabot/gomodules-extracted
|
4
|
-
github.com/dependabot/gomodules-extracted v1.
|
5
|
-
github.com/dependabot/gomodules-extracted v1.2.0/go.mod h1:3NWkH8KcZVDM87JuZI8hCZzYbjfUSz98EZI53qjgMgY=
|
3
|
+
github.com/dependabot/gomodules-extracted v1.3.0 h1:Rsnl5uR+wjE+7ontePia/B3p48aBRsyEhyNrzCwbkaw=
|
4
|
+
github.com/dependabot/gomodules-extracted v1.3.0/go.mod h1:cpzrmDX1COyhSDQXHfkRMw0STb0vmguBFqmrkr51h1I=
|
6
5
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
7
6
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
|
8
7
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
data/helpers/main.go
CHANGED
@@ -33,10 +33,10 @@ func main() {
|
|
33
33
|
funcErr error
|
34
34
|
)
|
35
35
|
switch helperParams.Function {
|
36
|
-
case "
|
36
|
+
case "getVersions":
|
37
37
|
var args updatechecker.Args
|
38
38
|
parseArgs(helperParams.Args, &args)
|
39
|
-
funcOut, funcErr = updatechecker.
|
39
|
+
funcOut, funcErr = updatechecker.GetVersions(&args)
|
40
40
|
case "updateDependencyFile":
|
41
41
|
var args updater.Args
|
42
42
|
parseArgs(helperParams.Args, &args)
|
@@ -46,7 +46,7 @@ func main() {
|
|
46
46
|
parseArgs(helperParams.Args, &args)
|
47
47
|
funcOut, funcErr = importresolver.VCSRemoteForImport(&args)
|
48
48
|
default:
|
49
|
-
abort(fmt.Errorf("
|
49
|
+
abort(fmt.Errorf("unrecognised function '%s'", helperParams.Function))
|
50
50
|
}
|
51
51
|
|
52
52
|
if funcErr != nil {
|
@@ -1,9 +1,9 @@
|
|
1
1
|
package updatechecker
|
2
2
|
|
3
3
|
import (
|
4
|
+
"context"
|
4
5
|
"errors"
|
5
6
|
"io/ioutil"
|
6
|
-
"regexp"
|
7
7
|
|
8
8
|
"github.com/dependabot/gomodules-extracted/cmd/go/_internal_/modfetch"
|
9
9
|
"github.com/dependabot/gomodules-extracted/cmd/go/_internal_/modload"
|
@@ -11,44 +11,27 @@ import (
|
|
11
11
|
"golang.org/x/mod/semver"
|
12
12
|
)
|
13
13
|
|
14
|
-
var (
|
15
|
-
pseudoVersionRegexp = regexp.MustCompile(`\b\d{14}-[0-9a-f]{12}$`)
|
16
|
-
)
|
17
|
-
|
18
14
|
type Dependency struct {
|
19
|
-
Name
|
20
|
-
Version
|
21
|
-
Indirect bool `json:"indirect"`
|
22
|
-
}
|
23
|
-
|
24
|
-
type IgnoreRange struct {
|
25
|
-
MinVersionInclusive string `json:"min_version_inclusive"`
|
26
|
-
MaxVersionExclusive string `json:"max_version_exclusive"`
|
15
|
+
Name string `json:"name"`
|
16
|
+
Version string `json:"version"`
|
27
17
|
}
|
28
18
|
|
29
19
|
type Args struct {
|
30
|
-
Dependency
|
31
|
-
IgnoreRanges []*IgnoreRange `json:"ignore_ranges"`
|
20
|
+
Dependency *Dependency `json:"dependency"`
|
32
21
|
}
|
33
22
|
|
34
|
-
|
23
|
+
// GetVersions returns a list of versions for the given dependency that
|
24
|
+
// are within the same major version.
|
25
|
+
func GetVersions(args *Args) (interface{}, error) {
|
35
26
|
if args.Dependency == nil {
|
36
27
|
return nil, errors.New("Expected args.dependency to not be nil")
|
37
28
|
}
|
38
29
|
|
39
30
|
currentVersion := args.Dependency.Version
|
40
|
-
currentPrerelease := semver.Prerelease(currentVersion)
|
41
|
-
if pseudoVersionRegexp.MatchString(currentPrerelease) {
|
42
|
-
return currentVersion, nil
|
43
|
-
}
|
44
|
-
|
45
|
-
modload.InitMod()
|
46
31
|
|
47
|
-
|
48
|
-
if err != nil {
|
49
|
-
return nil, err
|
50
|
-
}
|
32
|
+
modload.LoadModFile(context.Background())
|
51
33
|
|
34
|
+
repo := modfetch.Lookup("direct", args.Dependency.Name)
|
52
35
|
versions, err := repo.Versions("")
|
53
36
|
if err != nil {
|
54
37
|
return nil, err
|
@@ -60,7 +43,8 @@ func GetUpdatedVersion(args *Args) (interface{}, error) {
|
|
60
43
|
}
|
61
44
|
|
62
45
|
currentMajor := semver.Major(currentVersion)
|
63
|
-
|
46
|
+
|
47
|
+
var candidateVersions []string
|
64
48
|
|
65
49
|
Outer:
|
66
50
|
for _, v := range versions {
|
@@ -68,24 +52,16 @@ Outer:
|
|
68
52
|
continue
|
69
53
|
}
|
70
54
|
|
71
|
-
if semver.Compare(v, latestVersion) < 1 {
|
72
|
-
continue
|
73
|
-
}
|
74
|
-
|
75
|
-
if currentPrerelease == "" && semver.Prerelease(v) != "" {
|
76
|
-
continue
|
77
|
-
}
|
78
|
-
|
79
55
|
for _, exclude := range excludes {
|
80
56
|
if v == exclude {
|
81
57
|
continue Outer
|
82
58
|
}
|
83
59
|
}
|
84
60
|
|
85
|
-
|
61
|
+
candidateVersions = append(candidateVersions, v)
|
86
62
|
}
|
87
63
|
|
88
|
-
return
|
64
|
+
return candidateVersions, nil
|
89
65
|
}
|
90
66
|
|
91
67
|
func goModExcludes(dependency string) ([]string, error) {
|
data/helpers/updater/helpers.go
CHANGED
@@ -6,7 +6,11 @@ import (
|
|
6
6
|
"golang.org/x/mod/modfile"
|
7
7
|
)
|
8
8
|
|
9
|
-
// Private methods lifted from the `modfile` package
|
9
|
+
// Private methods lifted from the `modfile` package.
|
10
|
+
// Last synced: 4/28/2021 from:
|
11
|
+
// https://github.com/golang/mod/blob/858fdbee9c245c8109c359106e89c6b8d321f19c/modfile/rule.go
|
12
|
+
|
13
|
+
var slashSlash = []byte("//")
|
10
14
|
|
11
15
|
// setIndirect sets line to have (or not have) a "// indirect" comment.
|
12
16
|
func setIndirect(line *modfile.Line, indirect bool) {
|
@@ -20,13 +24,17 @@ func setIndirect(line *modfile.Line, indirect bool) {
|
|
20
24
|
line.Suffix = []modfile.Comment{{Token: "// indirect", Suffix: true}}
|
21
25
|
return
|
22
26
|
}
|
23
|
-
|
27
|
+
|
24
28
|
com := &line.Suffix[0]
|
25
|
-
|
26
|
-
if
|
27
|
-
|
29
|
+
text := strings.TrimSpace(strings.TrimPrefix(com.Token, string(slashSlash)))
|
30
|
+
if text == "" {
|
31
|
+
// Empty comment.
|
32
|
+
com.Token = "// indirect"
|
33
|
+
return
|
28
34
|
}
|
29
|
-
|
35
|
+
|
36
|
+
// Insert at beginning of existing comment.
|
37
|
+
com.Token = "// indirect; " + text
|
30
38
|
return
|
31
39
|
}
|
32
40
|
|
@@ -52,6 +60,6 @@ func isIndirect(line *modfile.Line) bool {
|
|
52
60
|
if len(line.Suffix) == 0 {
|
53
61
|
return false
|
54
62
|
}
|
55
|
-
f := strings.Fields(line.Suffix[0].Token)
|
56
|
-
return (len(f) ==
|
63
|
+
f := strings.Fields(strings.TrimPrefix(line.Suffix[0].Token, string(slashSlash)))
|
64
|
+
return (len(f) == 1 && f[0] == "indirect" || len(f) > 1 && f[0] == "indirect;")
|
57
65
|
}
|
data/helpers/updater/main.go
CHANGED
@@ -28,7 +28,9 @@ func UpdateDependencyFile(args *Args) (interface{}, error) {
|
|
28
28
|
}
|
29
29
|
|
30
30
|
for _, dep := range args.Dependencies {
|
31
|
-
f.AddRequire(dep.Name, dep.Version)
|
31
|
+
if err := f.AddRequire(dep.Name, dep.Version); err != nil {
|
32
|
+
return nil, err
|
33
|
+
}
|
32
34
|
}
|
33
35
|
|
34
36
|
for _, r := range f.Require {
|
@@ -4,6 +4,7 @@ require "open3"
|
|
4
4
|
require "dependabot/dependency"
|
5
5
|
require "dependabot/file_parsers/base/dependency_set"
|
6
6
|
require "dependabot/go_modules/path_converter"
|
7
|
+
require "dependabot/go_modules/replace_stubber"
|
7
8
|
require "dependabot/errors"
|
8
9
|
require "dependabot/file_parsers"
|
9
10
|
require "dependabot/file_parsers/base"
|
@@ -17,7 +18,7 @@ module Dependabot
|
|
17
18
|
dependency_set = Dependabot::FileParsers::Base::DependencySet.new
|
18
19
|
|
19
20
|
required_packages.each do |dep|
|
20
|
-
dependency_set << dependency_from_details(dep) unless dep
|
21
|
+
dependency_set << dependency_from_details(dep) unless skip_dependency?(dep)
|
21
22
|
end
|
22
23
|
|
23
24
|
dependency_set.dependencies
|
@@ -109,11 +110,8 @@ module Dependabot
|
|
109
110
|
# we can use in their place. Using generated paths is safer as it
|
110
111
|
# means we don't need to worry about references to parent
|
111
112
|
# directories, etc.
|
112
|
-
|
113
|
-
|
114
|
-
compact.
|
115
|
-
select { |p| p.start_with?(".") || p.start_with?("/") }.
|
116
|
-
map { |p| [p, "./" + Digest::SHA2.hexdigest(p)] }
|
113
|
+
manifest = JSON.parse(stdout)
|
114
|
+
ReplaceStubber.new(repo_contents_path).stub_paths(manifest, go_mod.directory)
|
117
115
|
end
|
118
116
|
end
|
119
117
|
|
@@ -163,6 +161,17 @@ module Dependabot
|
|
163
161
|
|
164
162
|
raw_version.match(GIT_VERSION_REGEX).named_captures.fetch("sha")
|
165
163
|
end
|
164
|
+
|
165
|
+
def skip_dependency?(dep)
|
166
|
+
return true if dep["Indirect"]
|
167
|
+
|
168
|
+
begin
|
169
|
+
path_uri = URI.parse("https://#{dep['Path']}")
|
170
|
+
!path_uri.host.include?(".")
|
171
|
+
rescue URI::InvalidURIError
|
172
|
+
false
|
173
|
+
end
|
174
|
+
end
|
166
175
|
end
|
167
176
|
end
|
168
177
|
end
|
@@ -4,6 +4,7 @@ require "dependabot/shared_helpers"
|
|
4
4
|
require "dependabot/errors"
|
5
5
|
require "dependabot/go_modules/file_updater"
|
6
6
|
require "dependabot/go_modules/native_helpers"
|
7
|
+
require "dependabot/go_modules/replace_stubber"
|
7
8
|
require "dependabot/go_modules/resolvability_errors"
|
8
9
|
|
9
10
|
module Dependabot
|
@@ -222,37 +223,8 @@ module Dependabot
|
|
222
223
|
# process afterwards.
|
223
224
|
def replace_directive_substitutions(manifest)
|
224
225
|
@replace_directive_substitutions ||=
|
225
|
-
(
|
226
|
-
|
227
|
-
compact.
|
228
|
-
select { |p| stub_replace_path?(p) }.
|
229
|
-
map { |p| [p, "./" + Digest::SHA2.hexdigest(p)] }.
|
230
|
-
to_h
|
231
|
-
end
|
232
|
-
|
233
|
-
# returns true if the provided path should be replaced with a stub
|
234
|
-
def stub_replace_path?(path)
|
235
|
-
return true if absolute_path?(path)
|
236
|
-
return false unless relative_replacement_path?(path)
|
237
|
-
|
238
|
-
resolved_path = module_pathname.join(path).realpath
|
239
|
-
inside_repo_contents_path = resolved_path.to_s.start_with?(repo_contents_path.to_s)
|
240
|
-
!inside_repo_contents_path
|
241
|
-
rescue Errno::ENOENT
|
242
|
-
true
|
243
|
-
end
|
244
|
-
|
245
|
-
def absolute_path?(path)
|
246
|
-
path.start_with?("/")
|
247
|
-
end
|
248
|
-
|
249
|
-
def relative_replacement_path?(path)
|
250
|
-
# https://golang.org/ref/mod#go-mod-file-replace
|
251
|
-
path.start_with?("./") || path.start_with?("../")
|
252
|
-
end
|
253
|
-
|
254
|
-
def module_pathname
|
255
|
-
@module_pathname ||= Pathname.new(repo_contents_path).join(directory.sub(%r{^/}, ""))
|
226
|
+
Dependabot::GoModules::ReplaceStubber.new(repo_contents_path).
|
227
|
+
stub_paths(manifest, directory)
|
256
228
|
end
|
257
229
|
|
258
230
|
def substitute_all(substitutions)
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dependabot
|
4
|
+
module GoModules
|
5
|
+
# Given a go.mod file, find all `replace` directives pointing to a path
|
6
|
+
# on the local filesystem outside of the current checkout, and return a hash
|
7
|
+
# mapping the original path to a hash of the path.
|
8
|
+
#
|
9
|
+
# This lets us substitute all parts of the go.mod that are dependent on
|
10
|
+
# the layout of the filesystem with a structure we can reproduce (i.e.
|
11
|
+
# no paths such as ../../../foo), run the Go tooling, then reverse the
|
12
|
+
# process afterwards.
|
13
|
+
class ReplaceStubber
|
14
|
+
def initialize(repo_contents_path)
|
15
|
+
@repo_contents_path = repo_contents_path
|
16
|
+
end
|
17
|
+
|
18
|
+
def stub_paths(manifest, directory)
|
19
|
+
(manifest["Replace"] || []).
|
20
|
+
map { |r| r["New"]["Path"] }.
|
21
|
+
compact.
|
22
|
+
select { |p| stub_replace_path?(p, directory) }.
|
23
|
+
map { |p| [p, "./" + Digest::SHA2.hexdigest(p)] }.
|
24
|
+
to_h
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def stub_replace_path?(path, directory)
|
30
|
+
return true if absolute_path?(path)
|
31
|
+
return false unless relative_replacement_path?(path)
|
32
|
+
return true if @repo_contents_path.nil?
|
33
|
+
|
34
|
+
resolved_path = module_pathname(directory).join(path).realpath
|
35
|
+
inside_repo_contents_path = resolved_path.to_s.start_with?(@repo_contents_path.to_s)
|
36
|
+
!inside_repo_contents_path
|
37
|
+
rescue Errno::ENOENT
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def absolute_path?(path)
|
42
|
+
path.start_with?("/")
|
43
|
+
end
|
44
|
+
|
45
|
+
def relative_replacement_path?(path)
|
46
|
+
# https://golang.org/ref/mod#go-mod-file-replace
|
47
|
+
path.start_with?("./") || path.start_with?("../")
|
48
|
+
end
|
49
|
+
|
50
|
+
def module_pathname(directory)
|
51
|
+
@module_pathname ||= Pathname.new(@repo_contents_path).join(directory.sub(%r{^/}, ""))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -5,26 +5,19 @@ require "dependabot/update_checkers/base"
|
|
5
5
|
require "dependabot/shared_helpers"
|
6
6
|
require "dependabot/errors"
|
7
7
|
require "dependabot/go_modules/native_helpers"
|
8
|
-
require "dependabot/go_modules/resolvability_errors"
|
9
8
|
require "dependabot/go_modules/version"
|
10
9
|
|
11
10
|
module Dependabot
|
12
11
|
module GoModules
|
13
12
|
class UpdateChecker < Dependabot::UpdateCheckers::Base
|
14
|
-
|
15
|
-
# Package url/proxy doesn't include any redirect meta tags
|
16
|
-
/no go-import meta tags/,
|
17
|
-
# Package url 404s
|
18
|
-
/404 Not Found/,
|
19
|
-
/Repository not found/
|
20
|
-
].freeze
|
13
|
+
require_relative "update_checker/latest_version_finder"
|
21
14
|
|
22
15
|
def latest_resolvable_version
|
23
16
|
# We don't yet support updating indirect dependencies for go_modules
|
24
17
|
#
|
25
18
|
# To update indirect dependencies we'll need to promote the indirect
|
26
19
|
# dependency to the go.mod file forcing the resolver to pick this
|
27
|
-
# version (possibly as
|
20
|
+
# version (possibly as `// indirect`)
|
28
21
|
unless dependency.top_level?
|
29
22
|
return unless dependency.version
|
30
23
|
|
@@ -32,7 +25,13 @@ module Dependabot
|
|
32
25
|
end
|
33
26
|
|
34
27
|
@latest_resolvable_version ||=
|
35
|
-
|
28
|
+
LatestVersionFinder.new(
|
29
|
+
dependency: dependency,
|
30
|
+
dependency_files: dependency_files,
|
31
|
+
credentials: credentials,
|
32
|
+
ignored_versions: ignored_versions,
|
33
|
+
raise_on_ignored: raise_on_ignored,
|
34
|
+
).latest_version
|
36
35
|
end
|
37
36
|
|
38
37
|
# This is currently used to short-circuit latest_resolvable_version,
|
@@ -55,51 +54,6 @@ module Dependabot
|
|
55
54
|
|
56
55
|
private
|
57
56
|
|
58
|
-
def find_latest_resolvable_version
|
59
|
-
SharedHelpers.in_a_temporary_directory do
|
60
|
-
SharedHelpers.with_git_configured(credentials: credentials) do
|
61
|
-
File.write("go.mod", go_mod.content)
|
62
|
-
|
63
|
-
# Turn off the module proxy for now, as it's causing issues with
|
64
|
-
# private git dependencies
|
65
|
-
env = { "GOPRIVATE" => "*" }
|
66
|
-
|
67
|
-
SharedHelpers.run_helper_subprocess(
|
68
|
-
command: NativeHelpers.helper_path,
|
69
|
-
env: env,
|
70
|
-
function: "getUpdatedVersion",
|
71
|
-
args: {
|
72
|
-
dependency: {
|
73
|
-
name: dependency.name,
|
74
|
-
version: "v" + dependency.version,
|
75
|
-
indirect: dependency.requirements.empty?
|
76
|
-
}
|
77
|
-
}
|
78
|
-
)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
rescue SharedHelpers::HelperSubprocessFailed => e
|
82
|
-
retry_count ||= 0
|
83
|
-
retry_count += 1
|
84
|
-
retry if transitory_failure?(e) && retry_count < 2
|
85
|
-
|
86
|
-
handle_subprocess_error(e)
|
87
|
-
end
|
88
|
-
|
89
|
-
def handle_subprocess_error(error)
|
90
|
-
if RESOLVABILITY_ERROR_REGEXES.any? { |rgx| error.message =~ rgx }
|
91
|
-
ResolvabilityErrors.handle(error.message, credentials: credentials)
|
92
|
-
end
|
93
|
-
|
94
|
-
raise
|
95
|
-
end
|
96
|
-
|
97
|
-
def transitory_failure?(error)
|
98
|
-
return true if error.message.include?("EOF")
|
99
|
-
|
100
|
-
error.message.include?("Internal Server Error")
|
101
|
-
end
|
102
|
-
|
103
57
|
def latest_version_resolvable_with_full_unlock?
|
104
58
|
# Full unlock checks aren't implemented for Go (yet)
|
105
59
|
false
|
@@ -136,10 +90,6 @@ module Dependabot
|
|
136
90
|
{ type: "default", source: dependency.name }
|
137
91
|
end
|
138
92
|
|
139
|
-
def go_mod
|
140
|
-
@go_mod ||= dependency_files.find { |f| f.name == "go.mod" }
|
141
|
-
end
|
142
|
-
|
143
93
|
def git_commit_checker
|
144
94
|
@git_commit_checker ||=
|
145
95
|
GitCommitChecker.new(
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "excon"
|
4
|
+
|
5
|
+
require "dependabot/shared_helpers"
|
6
|
+
require "dependabot/errors"
|
7
|
+
require "dependabot/go_modules/requirement"
|
8
|
+
require "dependabot/go_modules/resolvability_errors"
|
9
|
+
|
10
|
+
module Dependabot
|
11
|
+
module GoModules
|
12
|
+
class UpdateChecker
|
13
|
+
class LatestVersionFinder
|
14
|
+
RESOLVABILITY_ERROR_REGEXES = [
|
15
|
+
# Package url/proxy doesn't include any redirect meta tags
|
16
|
+
/no go-import meta tags/,
|
17
|
+
# Package url 404s
|
18
|
+
/404 Not Found/,
|
19
|
+
/Repository not found/,
|
20
|
+
/unrecognized import path/
|
21
|
+
].freeze
|
22
|
+
PSEUDO_VERSION_REGEX = /\b\d{14}-[0-9a-f]{12}$/.freeze
|
23
|
+
|
24
|
+
def initialize(dependency:, dependency_files:, credentials:,
|
25
|
+
ignored_versions:, raise_on_ignored: false)
|
26
|
+
@dependency = dependency
|
27
|
+
@dependency_files = dependency_files
|
28
|
+
@credentials = credentials
|
29
|
+
@ignored_versions = ignored_versions
|
30
|
+
@raise_on_ignored = raise_on_ignored
|
31
|
+
end
|
32
|
+
|
33
|
+
def latest_version
|
34
|
+
@latest_version ||= fetch_latest_version
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
attr_reader :dependency, :dependency_files, :credentials, :ignored_versions
|
40
|
+
|
41
|
+
def fetch_latest_version
|
42
|
+
return dependency.version if dependency.version =~ PSEUDO_VERSION_REGEX
|
43
|
+
|
44
|
+
candidate_versions = available_versions
|
45
|
+
candidate_versions = filter_prerelease_versions(candidate_versions)
|
46
|
+
candidate_versions = filter_lower_versions(candidate_versions)
|
47
|
+
candidate_versions = filter_ignored_versions(candidate_versions)
|
48
|
+
|
49
|
+
candidate_versions.max
|
50
|
+
end
|
51
|
+
|
52
|
+
def available_versions
|
53
|
+
SharedHelpers.in_a_temporary_directory do
|
54
|
+
SharedHelpers.with_git_configured(credentials: credentials) do
|
55
|
+
File.write("go.mod", go_mod.content)
|
56
|
+
|
57
|
+
# Turn off the module proxy for now, as it's causing issues with
|
58
|
+
# private git dependencies
|
59
|
+
env = { "GOPRIVATE" => "*" }
|
60
|
+
|
61
|
+
version_strings = SharedHelpers.run_helper_subprocess(
|
62
|
+
command: NativeHelpers.helper_path,
|
63
|
+
env: env,
|
64
|
+
function: "getVersions",
|
65
|
+
args: {
|
66
|
+
dependency: {
|
67
|
+
name: dependency.name,
|
68
|
+
version: "v" + dependency.version,
|
69
|
+
}
|
70
|
+
}
|
71
|
+
)
|
72
|
+
|
73
|
+
version_strings.select { |v| version_class.correct?(v) }
|
74
|
+
.map { |v| version_class.new(v) }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
rescue SharedHelpers::HelperSubprocessFailed => e
|
78
|
+
retry_count ||= 0
|
79
|
+
retry_count += 1
|
80
|
+
retry if transitory_failure?(e) && retry_count < 2
|
81
|
+
|
82
|
+
handle_subprocess_error(e)
|
83
|
+
end
|
84
|
+
|
85
|
+
def handle_subprocess_error(error)
|
86
|
+
if RESOLVABILITY_ERROR_REGEXES.any? { |rgx| error.message =~ rgx }
|
87
|
+
ResolvabilityErrors.handle(error.message, credentials: credentials)
|
88
|
+
end
|
89
|
+
|
90
|
+
raise
|
91
|
+
end
|
92
|
+
|
93
|
+
def transitory_failure?(error)
|
94
|
+
return true if error.message.include?("EOF")
|
95
|
+
|
96
|
+
error.message.include?("Internal Server Error")
|
97
|
+
end
|
98
|
+
|
99
|
+
def go_mod
|
100
|
+
@go_mod ||= dependency_files.find { |f| f.name == "go.mod" }
|
101
|
+
end
|
102
|
+
|
103
|
+
def filter_prerelease_versions(versions_array)
|
104
|
+
return versions_array if wants_prerelease?
|
105
|
+
|
106
|
+
versions_array.reject(&:prerelease?)
|
107
|
+
end
|
108
|
+
|
109
|
+
def filter_lower_versions(versions_array)
|
110
|
+
versions_array.
|
111
|
+
select { |version| version >= version_class.new(dependency.version) }
|
112
|
+
end
|
113
|
+
|
114
|
+
def filter_ignored_versions(versions_array)
|
115
|
+
filtered = versions_array.
|
116
|
+
reject { |v| ignore_requirements.any? { |r| r.satisfied_by?(v) } }
|
117
|
+
raise AllVersionsIgnored if @raise_on_ignored && filtered.empty? && versions_array.any?
|
118
|
+
|
119
|
+
filtered
|
120
|
+
end
|
121
|
+
|
122
|
+
def wants_prerelease?
|
123
|
+
@wants_prerelease ||=
|
124
|
+
begin
|
125
|
+
current_version = dependency.version
|
126
|
+
current_version && version_class.correct?(current_version) &&
|
127
|
+
version_class.new(current_version).prerelease?
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def ignore_requirements
|
132
|
+
ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
|
133
|
+
end
|
134
|
+
|
135
|
+
def requirement_class
|
136
|
+
Utils.requirement_class_for_package_manager(
|
137
|
+
dependency.package_manager
|
138
|
+
)
|
139
|
+
end
|
140
|
+
|
141
|
+
def version_class
|
142
|
+
Utils.version_class_for_package_manager(dependency.package_manager)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-go_modules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.145.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dependabot-common
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.145.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.145.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: byebug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,8 +192,6 @@ files:
|
|
192
192
|
- helpers/importresolver/main.go
|
193
193
|
- helpers/main.go
|
194
194
|
- helpers/updatechecker/main.go
|
195
|
-
- helpers/updater/go.mod
|
196
|
-
- helpers/updater/go.sum
|
197
195
|
- helpers/updater/helpers.go
|
198
196
|
- helpers/updater/main.go
|
199
197
|
- lib/dependabot/go_modules.rb
|
@@ -204,9 +202,11 @@ files:
|
|
204
202
|
- lib/dependabot/go_modules/metadata_finder.rb
|
205
203
|
- lib/dependabot/go_modules/native_helpers.rb
|
206
204
|
- lib/dependabot/go_modules/path_converter.rb
|
205
|
+
- lib/dependabot/go_modules/replace_stubber.rb
|
207
206
|
- lib/dependabot/go_modules/requirement.rb
|
208
207
|
- lib/dependabot/go_modules/resolvability_errors.rb
|
209
208
|
- lib/dependabot/go_modules/update_checker.rb
|
209
|
+
- lib/dependabot/go_modules/update_checker/latest_version_finder.rb
|
210
210
|
- lib/dependabot/go_modules/version.rb
|
211
211
|
homepage: https://github.com/dependabot/dependabot-core
|
212
212
|
licenses:
|
data/helpers/updater/go.mod
DELETED
data/helpers/updater/go.sum
DELETED