dependabot-bundler 0.137.1 → 0.138.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/v1/build +2 -1
  3. data/helpers/v1/run.rb +14 -0
  4. data/helpers/v2/.gitignore +8 -0
  5. data/helpers/v2/Gemfile +12 -0
  6. data/helpers/v2/build +24 -0
  7. data/helpers/v2/lib/functions.rb +122 -0
  8. data/helpers/v2/lib/functions/conflicting_dependency_resolver.rb +86 -0
  9. data/helpers/v2/lib/functions/file_parser.rb +106 -0
  10. data/helpers/v2/monkey_patches/definition_bundler_version_patch.rb +15 -0
  11. data/helpers/v2/monkey_patches/definition_ruby_version_patch.rb +20 -0
  12. data/helpers/v2/monkey_patches/git_source_patch.rb +62 -0
  13. data/helpers/v2/run.rb +44 -0
  14. data/helpers/v2/spec/functions/conflicting_dependency_resolver_spec.rb +133 -0
  15. data/helpers/v2/spec/functions/file_parser_spec.rb +142 -0
  16. data/helpers/v2/spec/functions_spec.rb +33 -0
  17. data/helpers/v2/spec/native_spec_helper.rb +49 -0
  18. data/helpers/v2/spec/shared_contexts.rb +60 -0
  19. data/lib/dependabot/bundler/file_parser.rb +13 -1
  20. data/lib/dependabot/bundler/file_updater.rb +3 -2
  21. data/lib/dependabot/bundler/file_updater/lockfile_updater.rb +4 -3
  22. data/lib/dependabot/bundler/helpers.rb +15 -3
  23. data/lib/dependabot/bundler/native_helpers.rb +8 -1
  24. data/lib/dependabot/bundler/update_checker.rb +12 -6
  25. data/lib/dependabot/bundler/update_checker/conflicting_dependency_resolver.rb +5 -2
  26. data/lib/dependabot/bundler/update_checker/force_updater.rb +6 -3
  27. data/lib/dependabot/bundler/update_checker/latest_version_finder.rb +6 -3
  28. data/lib/dependabot/bundler/update_checker/latest_version_finder/dependency_source.rb +5 -3
  29. data/lib/dependabot/bundler/update_checker/shared_bundler_helpers.rb +0 -4
  30. data/lib/dependabot/bundler/update_checker/version_resolver.rb +8 -4
  31. metadata +19 -4
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tmpdir"
4
+ require "bundler/compact_index_client"
5
+ require "bundler/compact_index_client/updater"
6
+
7
+ TMP_DIR_PATH = File.expand_path("../tmp", __dir__)
8
+
9
+ RSpec.shared_context "in a temporary bundler directory" do
10
+ let(:project_name) { "gemfile" }
11
+
12
+ let(:tmp_path) do
13
+ Dir.mkdir(TMP_DIR_PATH) unless Dir.exist?(TMP_DIR_PATH)
14
+ dir = Dir.mktmpdir("native_helper_spec_", TMP_DIR_PATH)
15
+ Pathname.new(dir).expand_path
16
+ end
17
+
18
+ before do
19
+ project_dependency_files(project_name).each do |file|
20
+ File.write(File.join(tmp_path, file[:name]), file[:content])
21
+ end
22
+ end
23
+
24
+ def in_tmp_folder(&block)
25
+ Dir.chdir(tmp_path, &block)
26
+ end
27
+ end
28
+
29
+ RSpec.shared_context "without caching rubygems" do
30
+ before do
31
+ # Stub Bundler to stop it using a cached versions of Rubygems
32
+ allow_any_instance_of(Bundler::CompactIndexClient::Updater).
33
+ to receive(:etag_for).and_return("")
34
+ end
35
+ end
36
+
37
+ RSpec.shared_context "stub rubygems compact index" do
38
+ include_context "without caching rubygems"
39
+
40
+ before do
41
+ # Stub the Rubygems index
42
+ stub_request(:get, "https://index.rubygems.org/versions").
43
+ to_return(
44
+ status: 200,
45
+ body: fixture("ruby", "rubygems_responses", "index")
46
+ )
47
+
48
+ # Stub the Rubygems response for each dependency we have a fixture for
49
+ fixtures =
50
+ Dir[File.join("../../spec", "fixtures", "ruby", "rubygems_responses", "info-*")]
51
+ fixtures.each do |path|
52
+ dep_name = path.split("/").last.gsub("info-", "")
53
+ stub_request(:get, "https://index.rubygems.org/info/#{dep_name}").
54
+ to_return(
55
+ status: 200,
56
+ body: fixture("ruby", "rubygems_responses", "info-#{dep_name}")
57
+ )
58
+ end
59
+ end
60
+ end
@@ -23,6 +23,7 @@ module Dependabot
23
23
  dependency_set += gemspec_dependencies
24
24
  dependency_set += lockfile_dependencies
25
25
  check_external_code(dependency_set.dependencies)
26
+ instrument_package_manager_version
26
27
  dependency_set.dependencies
27
28
  end
28
29
 
@@ -42,6 +43,17 @@ module Dependabot
42
43
  end
43
44
  end
44
45
 
46
+ def instrument_package_manager_version
47
+ version = Helpers.detected_bundler_version(lockfile)
48
+ Dependabot.instrument(
49
+ Notifications::FILE_PARSER_PACKAGE_MANAGER_VERSION_PARSED,
50
+ ecosystem: "bundler",
51
+ package_managers: {
52
+ "bundler" => version
53
+ }
54
+ )
55
+ end
56
+
45
57
  def gemfile_dependencies
46
58
  dependencies = DependencySet.new
47
59
 
@@ -301,7 +313,7 @@ module Dependabot
301
313
  end
302
314
 
303
315
  def bundler_version
304
- @bundler_version ||= Helpers.bundler_version(lockfile)
316
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
305
317
  end
306
318
  end
307
319
  end
@@ -151,7 +151,8 @@ module Dependabot
151
151
  dependencies: dependencies,
152
152
  dependency_files: dependency_files,
153
153
  repo_contents_path: repo_contents_path,
154
- credentials: credentials
154
+ credentials: credentials,
155
+ options: options
155
156
  ).updated_lockfile_content
156
157
  end
157
158
 
@@ -162,7 +163,7 @@ module Dependabot
162
163
  end
163
164
 
164
165
  def bundler_version
165
- @bundler_version ||= Helpers.bundler_version(lockfile)
166
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
166
167
  end
167
168
  end
168
169
  end
@@ -33,11 +33,12 @@ module Dependabot
33
33
  end
34
34
 
35
35
  def initialize(dependencies:, dependency_files:,
36
- repo_contents_path: nil, credentials:)
36
+ repo_contents_path: nil, credentials:, options:)
37
37
  @dependencies = dependencies
38
38
  @dependency_files = dependency_files
39
39
  @repo_contents_path = repo_contents_path
40
40
  @credentials = credentials
41
+ @options = options
41
42
  end
42
43
 
43
44
  def updated_lockfile_content
@@ -54,7 +55,7 @@ module Dependabot
54
55
  private
55
56
 
56
57
  attr_reader :dependencies, :dependency_files, :repo_contents_path,
57
- :credentials
58
+ :credentials, :options
58
59
 
59
60
  def build_updated_lockfile
60
61
  base_dir = dependency_files.first.directory
@@ -304,7 +305,7 @@ module Dependabot
304
305
  end
305
306
 
306
307
  def bundler_version
307
- @bundler_version ||= Helpers.bundler_version(lockfile)
308
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
308
309
  end
309
310
  end
310
311
  end
@@ -6,9 +6,21 @@ module Dependabot
6
6
  V1 = "1"
7
7
  V2 = "2"
8
8
 
9
- # TODO: Add support for bundler v2
10
- # return "v2" if lockfile.content.match?(/BUNDLED WITH\s+2/m)
11
- def self.bundler_version(_lockfile)
9
+ # NOTE: options is a manditory argument to ensure we pass it from all calling classes
10
+ def self.bundler_version(_lockfile, options:)
11
+ # For now, force V2 if bundler_2_available
12
+ return V2 if options[:bundler_2_available]
13
+
14
+ # TODO: Add support for bundler v2 based on lockfile
15
+ # return V2 if lockfile.content.match?(/BUNDLED WITH\s+2/m)
16
+
17
+ V1
18
+ end
19
+
20
+ def self.detected_bundler_version(lockfile)
21
+ return "unknown" unless lockfile
22
+ return V2 if lockfile.content.match?(/BUNDLED WITH\s+2/m)
23
+
12
24
  V1
13
25
  end
14
26
  end
@@ -17,9 +17,16 @@ module Dependabot
17
17
  # Bundler will pick the matching installed major version
18
18
  "BUNDLER_VERSION" => bundler_version,
19
19
  "BUNDLE_GEMFILE" => File.join(versioned_helper_path(bundler_version: bundler_version), "Gemfile"),
20
- "BUNDLE_PATH" => File.join(versioned_helper_path(bundler_version: bundler_version), ".bundle")
20
+ "BUNDLE_PATH" => File.join(versioned_helper_path(bundler_version: bundler_version), ".bundle"),
21
+ # Prevent the GEM_HOME from being set to a folder owned by root
22
+ "GEM_HOME" => File.join(versioned_helper_path(bundler_version: bundler_version), ".bundle")
21
23
  }
22
24
  )
25
+ rescue SharedHelpers::HelperSubprocessFailed => e
26
+ # TODO: Remove once we stop stubbing out the V2 native helper
27
+ raise Dependabot::NotImplemented, e.message if e.error_class == "Functions::NotImplementedError"
28
+
29
+ raise
23
30
  end
24
31
  end
25
32
 
@@ -110,7 +110,8 @@ module Dependabot
110
110
  ConflictingDependencyResolver.new(
111
111
  dependency_files: dependency_files,
112
112
  repo_contents_path: repo_contents_path,
113
- credentials: credentials
113
+ credentials: credentials,
114
+ options: options
114
115
  ).conflicting_dependencies(
115
116
  dependency: dependency,
116
117
  target_version: lowest_security_fix_version
@@ -162,7 +163,8 @@ module Dependabot
162
163
  credentials: credentials,
163
164
  target_version: version,
164
165
  requirements_update_strategy: requirements_update_strategy,
165
- update_multiple_dependencies: false
166
+ update_multiple_dependencies: false,
167
+ options: options
166
168
  ).updated_dependencies
167
169
  true
168
170
  rescue Dependabot::DependencyFileNotResolvable
@@ -183,7 +185,8 @@ module Dependabot
183
185
  credentials: credentials,
184
186
  ignored_versions: ignored_versions,
185
187
  raise_on_ignored: raise_on_ignored,
186
- replacement_git_pin: tag
188
+ replacement_git_pin: tag,
189
+ options: options
187
190
  ).latest_resolvable_version_details
188
191
  true
189
192
  rescue Dependabot::DependencyFileNotResolvable
@@ -339,7 +342,8 @@ module Dependabot
339
342
  repo_contents_path: repo_contents_path,
340
343
  credentials: credentials,
341
344
  target_version: latest_version,
342
- requirements_update_strategy: requirements_update_strategy
345
+ requirements_update_strategy: requirements_update_strategy,
346
+ options: options
343
347
  )
344
348
  end
345
349
 
@@ -365,7 +369,8 @@ module Dependabot
365
369
  raise_on_ignored: raise_on_ignored,
366
370
  remove_git_source: remove_git_source,
367
371
  unlock_requirement: unlock_requirement,
368
- latest_allowable_version: latest_version
372
+ latest_allowable_version: latest_version,
373
+ options: options
369
374
  )
370
375
  end
371
376
  end
@@ -386,7 +391,8 @@ module Dependabot
386
391
  credentials: credentials,
387
392
  ignored_versions: ignored_versions,
388
393
  raise_on_ignored: raise_on_ignored,
389
- security_advisories: security_advisories
394
+ security_advisories: security_advisories,
395
+ options: options
390
396
  )
391
397
  end
392
398
  end
@@ -12,10 +12,13 @@ module Dependabot
12
12
  require_relative "shared_bundler_helpers"
13
13
  include SharedBundlerHelpers
14
14
 
15
- def initialize(dependency_files:, repo_contents_path:, credentials:)
15
+ attr_reader :options
16
+
17
+ def initialize(dependency_files:, repo_contents_path:, credentials:, options:)
16
18
  @dependency_files = dependency_files
17
19
  @repo_contents_path = repo_contents_path
18
20
  @credentials = credentials
21
+ @options = options
19
22
  end
20
23
 
21
24
  # Finds any dependencies in the lockfile that have a subdependency on
@@ -47,7 +50,7 @@ module Dependabot
47
50
  private
48
51
 
49
52
  def bundler_version
50
- @bundler_version ||= Helpers.bundler_version(lockfile)
53
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
51
54
  end
52
55
  end
53
56
  end
@@ -19,7 +19,8 @@ module Dependabot
19
19
  def initialize(dependency:, dependency_files:, repo_contents_path: nil,
20
20
  credentials:, target_version:,
21
21
  requirements_update_strategy:,
22
- update_multiple_dependencies: true)
22
+ update_multiple_dependencies: true,
23
+ options:)
23
24
  @dependency = dependency
24
25
  @dependency_files = dependency_files
25
26
  @repo_contents_path = repo_contents_path
@@ -27,6 +28,7 @@ module Dependabot
27
28
  @target_version = target_version
28
29
  @requirements_update_strategy = requirements_update_strategy
29
30
  @update_multiple_dependencies = update_multiple_dependencies
31
+ @options = options
30
32
  end
31
33
 
32
34
  def updated_dependencies
@@ -36,7 +38,8 @@ module Dependabot
36
38
  private
37
39
 
38
40
  attr_reader :dependency, :dependency_files, :repo_contents_path,
39
- :credentials, :target_version, :requirements_update_strategy
41
+ :credentials, :target_version, :requirements_update_strategy,
42
+ :options
40
43
 
41
44
  def update_multiple_dependencies?
42
45
  @update_multiple_dependencies
@@ -149,7 +152,7 @@ module Dependabot
149
152
  end
150
153
 
151
154
  def bundler_version
152
- @bundler_version ||= Helpers.bundler_version(lockfile)
155
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
153
156
  end
154
157
  end
155
158
  end
@@ -15,7 +15,7 @@ module Dependabot
15
15
  class LatestVersionFinder
16
16
  def initialize(dependency:, dependency_files:, repo_contents_path: nil,
17
17
  credentials:, ignored_versions:, raise_on_ignored: false,
18
- security_advisories:)
18
+ security_advisories:, options:)
19
19
  @dependency = dependency
20
20
  @dependency_files = dependency_files
21
21
  @repo_contents_path = repo_contents_path
@@ -23,6 +23,7 @@ module Dependabot
23
23
  @ignored_versions = ignored_versions
24
24
  @raise_on_ignored = raise_on_ignored
25
25
  @security_advisories = security_advisories
26
+ @options = options
26
27
  end
27
28
 
28
29
  def latest_version_details
@@ -36,7 +37,8 @@ module Dependabot
36
37
  private
37
38
 
38
39
  attr_reader :dependency, :dependency_files, :repo_contents_path,
39
- :credentials, :ignored_versions, :security_advisories
40
+ :credentials, :ignored_versions, :security_advisories,
41
+ :options
40
42
 
41
43
  def fetch_latest_version_details
42
44
  return dependency_source.latest_git_version_details if dependency_source.git?
@@ -103,7 +105,8 @@ module Dependabot
103
105
  @dependency_source ||= DependencySource.new(
104
106
  dependency: dependency,
105
107
  dependency_files: dependency_files,
106
- credentials: credentials
108
+ credentials: credentials,
109
+ options: options
107
110
  )
108
111
  end
109
112
 
@@ -17,14 +17,16 @@ module Dependabot
17
17
  OTHER = "other"
18
18
 
19
19
  attr_reader :dependency, :dependency_files, :repo_contents_path,
20
- :credentials
20
+ :credentials, :options
21
21
 
22
22
  def initialize(dependency:,
23
23
  dependency_files:,
24
- credentials:)
24
+ credentials:,
25
+ options:)
25
26
  @dependency = dependency
26
27
  @dependency_files = dependency_files
27
28
  @credentials = credentials
29
+ @options = options
28
30
  end
29
31
 
30
32
  # The latest version details for the dependency from a registry
@@ -145,7 +147,7 @@ module Dependabot
145
147
  end
146
148
 
147
149
  def bundler_version
148
- @bundler_version ||= Helpers.bundler_version(lockfile)
150
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
149
151
  end
150
152
  end
151
153
  end
@@ -237,10 +237,6 @@ module Dependabot
237
237
 
238
238
  lockfile.content.match?(/BUNDLED WITH\s+2/m)
239
239
  end
240
-
241
- def bundler_version
242
- @bundler_version ||= Helpers.bundler_version(lockfile)
243
- end
244
240
  end
245
241
  end
246
242
  end
@@ -23,7 +23,8 @@ module Dependabot
23
23
  raise_on_ignored: false,
24
24
  replacement_git_pin: nil, remove_git_source: false,
25
25
  unlock_requirement: true,
26
- latest_allowable_version: nil)
26
+ latest_allowable_version: nil,
27
+ options:)
27
28
  @dependency = dependency
28
29
  @unprepared_dependency_files = unprepared_dependency_files
29
30
  @credentials = credentials
@@ -34,6 +35,7 @@ module Dependabot
34
35
  @remove_git_source = remove_git_source
35
36
  @unlock_requirement = unlock_requirement
36
37
  @latest_allowable_version = latest_allowable_version
38
+ @options = options
37
39
  end
38
40
 
39
41
  def latest_resolvable_version_details
@@ -45,7 +47,8 @@ module Dependabot
45
47
 
46
48
  attr_reader :dependency, :unprepared_dependency_files,
47
49
  :repo_contents_path, :credentials, :ignored_versions,
48
- :replacement_git_pin, :latest_allowable_version
50
+ :replacement_git_pin, :latest_allowable_version,
51
+ :options
49
52
 
50
53
  def remove_git_source?
51
54
  @remove_git_source
@@ -164,7 +167,8 @@ module Dependabot
164
167
  credentials: credentials,
165
168
  ignored_versions: ignored_versions,
166
169
  raise_on_ignored: @raise_on_ignored,
167
- security_advisories: []
170
+ security_advisories: [],
171
+ options: options
168
172
  ).latest_version_details
169
173
  end
170
174
 
@@ -221,7 +225,7 @@ module Dependabot
221
225
  end
222
226
 
223
227
  def bundler_version
224
- @bundler_version ||= Helpers.bundler_version(lockfile)
228
+ @bundler_version ||= Helpers.bundler_version(lockfile, options: options)
225
229
  end
226
230
  end
227
231
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-bundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.137.1
4
+ version: 0.138.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-15 00:00:00.000000000 Z
11
+ date: 2021-03-24 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.137.1
19
+ version: 0.138.3
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.137.1
26
+ version: 0.138.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +206,21 @@ files:
206
206
  - helpers/v1/spec/functions/version_resolver_spec.rb
207
207
  - helpers/v1/spec/native_spec_helper.rb
208
208
  - helpers/v1/spec/shared_contexts.rb
209
+ - helpers/v2/.gitignore
210
+ - helpers/v2/Gemfile
211
+ - helpers/v2/build
212
+ - helpers/v2/lib/functions.rb
213
+ - helpers/v2/lib/functions/conflicting_dependency_resolver.rb
214
+ - helpers/v2/lib/functions/file_parser.rb
215
+ - helpers/v2/monkey_patches/definition_bundler_version_patch.rb
216
+ - helpers/v2/monkey_patches/definition_ruby_version_patch.rb
217
+ - helpers/v2/monkey_patches/git_source_patch.rb
218
+ - helpers/v2/run.rb
219
+ - helpers/v2/spec/functions/conflicting_dependency_resolver_spec.rb
220
+ - helpers/v2/spec/functions/file_parser_spec.rb
221
+ - helpers/v2/spec/functions_spec.rb
222
+ - helpers/v2/spec/native_spec_helper.rb
223
+ - helpers/v2/spec/shared_contexts.rb
209
224
  - lib/dependabot/bundler.rb
210
225
  - lib/dependabot/bundler/file_fetcher.rb
211
226
  - lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb