dependabot-go_modules 0.144.0 → 0.145.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2505607e3f2717b5a8cb513b12801baa4ff1ff575e1a3a54ae21724ab1f1353d
4
- data.tar.gz: fbac460701747cdeacd631163234633ea5d8e5779d3c8dc78e66f2721166d18d
3
+ metadata.gz: 188b8a3d57a2aab4951a052e3bc5f6c0fa4100acf03ad8938b75662e9aa406af
4
+ data.tar.gz: 45c941ba31bea403d2b371581e472415ddd7132e26226fab5aaa8417fb90bd46
5
5
  SHA512:
6
- metadata.gz: 5ea7b06a9c99783e6cc6301ceda812b728b929a1a5fc5909c6654f1b1f17c030d630a5c0e6307a39cd5f0647bb2866e6261e95e9e79d2d279f009abf803e72e9
7
- data.tar.gz: 18b9e5f44a0f99612f53579abadc77b25b71621dfea5867b1b59f7452657e65c100990ae12ebc0b9ff27f19803260cfb667d9cd9194acb41f8fdb92f9351f786
6
+ metadata.gz: d7ecb464fdc1c156b167c8cba23baae92fc25d5d2f45cccf034497381d87e399141fdff4b7375781976b18feb6a8e1f8080c3c3058df82f6311e9036931b9ad1
7
+ data.tar.gz: f8d4de5ddc67198ba2a832a6b592b4649a57992c1991247287f993c8df38ec83750d0d1922f67c7a4ee2086450f8ad713c0d6310b3235b8772c555ccd4f24828
data/helpers/go.mod CHANGED
@@ -4,6 +4,6 @@ go 1.16
4
4
 
5
5
  require (
6
6
  github.com/Masterminds/vcs v1.13.1
7
- github.com/dependabot/gomodules-extracted v1.2.0
7
+ github.com/dependabot/gomodules-extracted v1.3.0
8
8
  golang.org/x/mod v0.4.2
9
9
  )
data/helpers/go.sum CHANGED
@@ -1,7 +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 v1.2.0 h1:K/gTyOyhasOt4cjULvOPNiD3MAFGytp4F7e39aB+0Y0=
4
- 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=
5
5
  golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
6
6
  golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
7
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 "getUpdatedVersion":
36
+ case "getVersions":
37
37
  var args updatechecker.Args
38
38
  parseArgs(helperParams.Args, &args)
39
- funcOut, funcErr = updatechecker.GetUpdatedVersion(&args)
39
+ funcOut, funcErr = updatechecker.GetVersions(&args)
40
40
  case "updateDependencyFile":
41
41
  var args updater.Args
42
42
  parseArgs(helperParams.Args, &args)
@@ -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 string `json:"name"`
20
- Version string `json:"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 *Dependency `json:"dependency"`
31
- IgnoreRanges []*IgnoreRange `json:"ignore_ranges"`
20
+ Dependency *Dependency `json:"dependency"`
32
21
  }
33
22
 
34
- func GetUpdatedVersion(args *Args) (interface{}, error) {
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
- repo, err := modfetch.Lookup("direct", args.Dependency.Name)
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
- latestVersion := args.Dependency.Version
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
- latestVersion = v
61
+ candidateVersions = append(candidateVersions, v)
86
62
  }
87
63
 
88
- return latestVersion, nil
64
+ return candidateVersions, nil
89
65
  }
90
66
 
91
67
  func goModExcludes(dependency string) ([]string, error) {
@@ -39,10 +39,9 @@ module Dependabot
39
39
  ].freeze
40
40
 
41
41
  MODULE_PATH_MISMATCH_REGEXES = [
42
- /go get: \S+ updating to\n\s+\S+\sparsing\sgo.mod:\n\s+module declares its path as: \S+\n\s+but was required as: \S+/,
43
42
  /go: ([^@\s]+)(?:@[^\s]+)?: .* has non-.* module path "(.*)" at/,
44
43
  /go: ([^@\s]+)(?:@[^\s]+)?: .* unexpected module path "(.*)"/,
45
- /go: ([^@\s]+)(?:@[^\s]+)?: .* declares its path as: ([\S]*)/m
44
+ /go(?: get)?: ([^@\s]+)(?:@[^\s]+)?:? .* declares its path as: ([\S]*)/m
46
45
  ].freeze
47
46
 
48
47
  OUT_OF_DISK_REGEXES = [
@@ -235,7 +234,7 @@ module Dependabot
235
234
  write_go_mod(body)
236
235
  end
237
236
 
238
- def handle_subprocess_error(stderr)
237
+ def handle_subprocess_error(stderr) # rubocop:disable Metrics/AbcSize
239
238
  stderr = stderr.gsub(Dir.getwd, "")
240
239
 
241
240
  # Package version doesn't match the module major version
@@ -5,20 +5,12 @@ 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
- 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
13
+ require_relative "update_checker/latest_version_finder"
22
14
 
23
15
  def latest_resolvable_version
24
16
  # We don't yet support updating indirect dependencies for go_modules
@@ -33,7 +25,13 @@ module Dependabot
33
25
  end
34
26
 
35
27
  @latest_resolvable_version ||=
36
- version_class.new(find_latest_resolvable_version.gsub(/^v/, ""))
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
37
35
  end
38
36
 
39
37
  # This is currently used to short-circuit latest_resolvable_version,
@@ -56,51 +54,6 @@ module Dependabot
56
54
 
57
55
  private
58
56
 
59
- def find_latest_resolvable_version
60
- SharedHelpers.in_a_temporary_directory do
61
- SharedHelpers.with_git_configured(credentials: credentials) do
62
- File.write("go.mod", go_mod.content)
63
-
64
- # Turn off the module proxy for now, as it's causing issues with
65
- # private git dependencies
66
- env = { "GOPRIVATE" => "*" }
67
-
68
- SharedHelpers.run_helper_subprocess(
69
- command: NativeHelpers.helper_path,
70
- env: env,
71
- function: "getUpdatedVersion",
72
- args: {
73
- dependency: {
74
- name: dependency.name,
75
- version: "v" + dependency.version,
76
- indirect: dependency.requirements.empty?
77
- }
78
- }
79
- )
80
- end
81
- end
82
- rescue SharedHelpers::HelperSubprocessFailed => e
83
- retry_count ||= 0
84
- retry_count += 1
85
- retry if transitory_failure?(e) && retry_count < 2
86
-
87
- handle_subprocess_error(e)
88
- end
89
-
90
- def handle_subprocess_error(error)
91
- if RESOLVABILITY_ERROR_REGEXES.any? { |rgx| error.message =~ rgx }
92
- ResolvabilityErrors.handle(error.message, credentials: credentials)
93
- end
94
-
95
- raise
96
- end
97
-
98
- def transitory_failure?(error)
99
- return true if error.message.include?("EOF")
100
-
101
- error.message.include?("Internal Server Error")
102
- end
103
-
104
57
  def latest_version_resolvable_with_full_unlock?
105
58
  # Full unlock checks aren't implemented for Go (yet)
106
59
  false
@@ -137,10 +90,6 @@ module Dependabot
137
90
  { type: "default", source: dependency.name }
138
91
  end
139
92
 
140
- def go_mod
141
- @go_mod ||= dependency_files.find { |f| f.name == "go.mod" }
142
- end
143
-
144
93
  def git_commit_checker
145
94
  @git_commit_checker ||=
146
95
  GitCommitChecker.new(
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+
5
+ require "dependabot/go_modules/update_checker"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+ require "dependabot/go_modules/requirement"
9
+ require "dependabot/go_modules/resolvability_errors"
10
+
11
+ module Dependabot
12
+ module GoModules
13
+ class UpdateChecker
14
+ class LatestVersionFinder
15
+ RESOLVABILITY_ERROR_REGEXES = [
16
+ # Package url/proxy doesn't include any redirect meta tags
17
+ /no go-import meta tags/,
18
+ # Package url 404s
19
+ /404 Not Found/,
20
+ /Repository not found/,
21
+ /unrecognized import path/
22
+ ].freeze
23
+ PSEUDO_VERSION_REGEX = /\b\d{14}-[0-9a-f]{12}$/.freeze
24
+
25
+ def initialize(dependency:, dependency_files:, credentials:,
26
+ ignored_versions:, raise_on_ignored: false)
27
+ @dependency = dependency
28
+ @dependency_files = dependency_files
29
+ @credentials = credentials
30
+ @ignored_versions = ignored_versions
31
+ @raise_on_ignored = raise_on_ignored
32
+ end
33
+
34
+ def latest_version
35
+ @latest_version ||= fetch_latest_version
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :dependency, :dependency_files, :credentials, :ignored_versions
41
+
42
+ def fetch_latest_version
43
+ return dependency.version if dependency.version =~ PSEUDO_VERSION_REGEX
44
+
45
+ candidate_versions = available_versions
46
+ candidate_versions = filter_prerelease_versions(candidate_versions)
47
+ candidate_versions = filter_lower_versions(candidate_versions)
48
+ candidate_versions = filter_ignored_versions(candidate_versions)
49
+
50
+ candidate_versions.max
51
+ end
52
+
53
+ def available_versions
54
+ SharedHelpers.in_a_temporary_directory do
55
+ SharedHelpers.with_git_configured(credentials: credentials) do
56
+ File.write("go.mod", go_mod.content)
57
+
58
+ # Turn off the module proxy for now, as it's causing issues with
59
+ # private git dependencies
60
+ env = { "GOPRIVATE" => "*" }
61
+
62
+ version_strings = SharedHelpers.run_helper_subprocess(
63
+ command: NativeHelpers.helper_path,
64
+ env: env,
65
+ function: "getVersions",
66
+ args: {
67
+ dependency: {
68
+ name: dependency.name,
69
+ version: "v" + dependency.version
70
+ }
71
+ }
72
+ )
73
+
74
+ return [version_class.new(dependency.version)] if version_strings.nil?
75
+
76
+ version_strings.select { |v| version_class.correct?(v) }.
77
+ map { |v| version_class.new(v) }
78
+ end
79
+ end
80
+ rescue SharedHelpers::HelperSubprocessFailed => e
81
+ retry_count ||= 0
82
+ retry_count += 1
83
+ retry if transitory_failure?(e) && retry_count < 2
84
+
85
+ handle_subprocess_error(e)
86
+ end
87
+
88
+ def handle_subprocess_error(error)
89
+ if RESOLVABILITY_ERROR_REGEXES.any? { |rgx| error.message =~ rgx }
90
+ ResolvabilityErrors.handle(error.message, credentials: credentials)
91
+ end
92
+
93
+ raise
94
+ end
95
+
96
+ def transitory_failure?(error)
97
+ return true if error.message.include?("EOF")
98
+
99
+ error.message.include?("Internal Server Error")
100
+ end
101
+
102
+ def go_mod
103
+ @go_mod ||= dependency_files.find { |f| f.name == "go.mod" }
104
+ end
105
+
106
+ def filter_prerelease_versions(versions_array)
107
+ return versions_array if wants_prerelease?
108
+
109
+ versions_array.reject(&:prerelease?)
110
+ end
111
+
112
+ def filter_lower_versions(versions_array)
113
+ versions_array.
114
+ select { |version| version >= version_class.new(dependency.version) }
115
+ end
116
+
117
+ def filter_ignored_versions(versions_array)
118
+ filtered = versions_array.
119
+ reject { |v| ignore_requirements.any? { |r| r.satisfied_by?(v) } }
120
+ raise AllVersionsIgnored if @raise_on_ignored && filtered.empty? && versions_array.any?
121
+
122
+ filtered
123
+ end
124
+
125
+ def wants_prerelease?
126
+ @wants_prerelease ||=
127
+ begin
128
+ current_version = dependency.version
129
+ current_version && version_class.correct?(current_version) &&
130
+ version_class.new(current_version).prerelease?
131
+ end
132
+ end
133
+
134
+ def ignore_requirements
135
+ ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
136
+ end
137
+
138
+ def requirement_class
139
+ Utils.requirement_class_for_package_manager(
140
+ dependency.package_manager
141
+ )
142
+ end
143
+
144
+ def version_class
145
+ Utils.version_class_for_package_manager(dependency.package_manager)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ 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.144.0
4
+ version: 0.145.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-05 00:00:00.000000000 Z
11
+ date: 2021-05-10 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.144.0
19
+ version: 0.145.4
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.144.0
26
+ version: 0.145.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.13.0
103
+ version: 1.14.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.13.0
110
+ version: 1.14.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: simplecov
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +206,7 @@ files:
206
206
  - lib/dependabot/go_modules/requirement.rb
207
207
  - lib/dependabot/go_modules/resolvability_errors.rb
208
208
  - lib/dependabot/go_modules/update_checker.rb
209
+ - lib/dependabot/go_modules/update_checker/latest_version_finder.rb
209
210
  - lib/dependabot/go_modules/version.rb
210
211
  homepage: https://github.com/dependabot/dependabot-core
211
212
  licenses: