bundler-multilock 1.3.0 → 1.3.2
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/lib/bundler/multilock/cache.rb +18 -2
- data/lib/bundler/multilock/check.rb +3 -2
- data/lib/bundler/multilock/ext/cli.rb +20 -0
- data/lib/bundler/multilock/ext/dsl.rb +2 -1
- data/lib/bundler/multilock/lockfile_generator.rb +2 -0
- data/lib/bundler/multilock/version.rb +1 -1
- data/lib/bundler/multilock.rb +38 -48
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7796ee7b54f841aa9c6d127e05f878a1045078c94e842f04bf4e4f0ebb09ac1d
|
4
|
+
data.tar.gz: f1a35917e5fcfdf2eab572b4052d14766506e13253130c373114779d4598420e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1b5840035aab37b5a54bcb289649c40e6dd9451aff3d5858d45faea4750452381e7af904ac7c96146edd595e173143db07c827aa4f590701a513ac9e426979a
|
7
|
+
data.tar.gz: 9abece5b78beb3c5005a96577bf714ca3477865a4bfa897899628a2fd7556596f0697b2cef5cd530866079483e01c5aa46d1511a69343c3229fcebe7fe65acd4
|
@@ -57,11 +57,27 @@ module Bundler
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def specs(lockfile_name)
|
60
|
-
@specs[lockfile_name] ||=
|
61
|
-
|
60
|
+
@specs[lockfile_name] ||= begin
|
61
|
+
specs = {}
|
62
|
+
parser(lockfile_name).specs.each do |spec|
|
63
|
+
(specs[spec.name] ||= {})[spec.platform] = spec
|
64
|
+
end
|
65
|
+
specs
|
62
66
|
end
|
63
67
|
end
|
64
68
|
|
69
|
+
# sometimes a gem changes platforms with a new version, such as from aarch64-linux
|
70
|
+
# to aarch64-linux-gnu. we need to still sync it
|
71
|
+
def find_matching_spec(specs, spec)
|
72
|
+
specs = self.specs(specs) unless specs.is_a?(Hash)
|
73
|
+
platform_specs = specs[spec.name]
|
74
|
+
return unless platform_specs
|
75
|
+
|
76
|
+
parent_spec = platform_specs[spec.platform]
|
77
|
+
parent_spec ||= platform_specs.find { |platform, _| platform =~ spec.platform }&.last
|
78
|
+
parent_spec || platform_specs.find { |platform, _| platform == "ruby" }&.last
|
79
|
+
end
|
80
|
+
|
65
81
|
# @param lockfile_name [Pathname]
|
66
82
|
# @return [Hash<String, Set<String>>] hash of gem name to set of gem names that depend on it
|
67
83
|
def reverse_dependencies(lockfile_name)
|
@@ -88,7 +88,7 @@ module Bundler
|
|
88
88
|
|
89
89
|
# this checks for mismatches between the parent lockfile and the given lockfile,
|
90
90
|
# and for pinned dependencies in lockfiles requiring them
|
91
|
-
def deep_check(lockfile_definition)
|
91
|
+
def deep_check(lockfile_definition, conflicts: nil)
|
92
92
|
lockfile_name = lockfile_definition[:lockfile]
|
93
93
|
@cache.deep_check(lockfile_name) do
|
94
94
|
success = true
|
@@ -120,7 +120,7 @@ module Bundler
|
|
120
120
|
|
121
121
|
# check for conflicting requirements (and build list of pins, in the same loop)
|
122
122
|
parser.specs.each do |spec|
|
123
|
-
parent_spec = @cache.
|
123
|
+
parent_spec = @cache.find_matching_spec(parent_lockfile_name, spec)
|
124
124
|
|
125
125
|
if lockfile_definition[:enforce_pinned_additional_dependencies]
|
126
126
|
# look through what this spec depends on, and keep track of all pinned requirements
|
@@ -156,6 +156,7 @@ module Bundler
|
|
156
156
|
"does not match the parent lockfile's version " \
|
157
157
|
"(@#{parent_spec.version}#{parent_spec.git_version}); " \
|
158
158
|
"this may be due to a conflicting requirement, which would require manual resolution.")
|
159
|
+
conflicts&.add(spec.name)
|
159
160
|
success = false
|
160
161
|
end
|
161
162
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
module Multilock
|
5
|
+
module Ext
|
6
|
+
module CLI
|
7
|
+
module ClassMethods
|
8
|
+
def instance
|
9
|
+
return @instance if instance_variable_defined?(:@instance)
|
10
|
+
|
11
|
+
# this is a little icky, but there's no other way to determine which command was run
|
12
|
+
@instance = ObjectSpace.each_object(::Bundler::CLI).first
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
::Bundler::CLI.extend(ClassMethods)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -20,7 +20,8 @@ module Bundler
|
|
20
20
|
builder = new
|
21
21
|
builder.eval_gemfile(gemfile, &Multilock.prepare_block) if Multilock.prepare_block
|
22
22
|
builder.eval_gemfile(gemfile)
|
23
|
-
if (ruby_version_requirement = builder.instance_variable_get(:@ruby_version))
|
23
|
+
if (ruby_version_requirement = builder.instance_variable_get(:@ruby_version)) &&
|
24
|
+
Multilock.lockfile_definitions[lockfile]
|
24
25
|
Multilock.lockfile_definitions[lockfile][:ruby_version_requirement] = ruby_version_requirement
|
25
26
|
elsif (parent_lockfile = Multilock.lockfile_definitions.dig(lockfile, :parent)) &&
|
26
27
|
(parent_lockfile_definition = Multilock.lockfile_definitions[parent_lockfile]) &&
|
data/lib/bundler/multilock.rb
CHANGED
@@ -82,17 +82,13 @@ module Bundler
|
|
82
82
|
enforce_pinned_additional_dependencies: enforce_pinned_additional_dependencies
|
83
83
|
})
|
84
84
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
85
|
+
# If they're using BUNDLE_LOCKFILE, then they really do want to
|
86
|
+
# use a particular lockfile, and it overrides whatever they
|
87
|
+
# dynamically set in their gemfile
|
88
|
+
if !env_lockfile && defined?(CLI) &&
|
89
|
+
%i[check install lock update].include?(CLI.instance&.current_command_chain&.first)
|
90
90
|
# always use Gemfile.lock for `bundle check`, `bundle install`,
|
91
|
-
# `bundle lock`, and `bundle update`.
|
92
|
-
# `bundle install`, but we want that to run as normal.
|
93
|
-
# If they're using BUNDLE_LOCKFILE, then they really do want to
|
94
|
-
# use a particular lockfile, and it overrides whatever they
|
95
|
-
# dynamically set in their gemfile
|
91
|
+
# `bundle lock`, and `bundle update`.
|
96
92
|
active = lockfile == Bundler.default_lockfile(force_original: true)
|
97
93
|
end
|
98
94
|
|
@@ -179,10 +175,11 @@ module Bundler
|
|
179
175
|
|
180
176
|
# already up to date?
|
181
177
|
up_to_date = false
|
178
|
+
conflicts = Set.new
|
182
179
|
Bundler.settings.temporary(frozen: true) do
|
183
180
|
Bundler.ui.silence do
|
184
181
|
up_to_date = checker.base_check(lockfile_definition, check_missing_deps: true) &&
|
185
|
-
checker.deep_check(lockfile_definition)
|
182
|
+
checker.deep_check(lockfile_definition, conflicts: conflicts)
|
186
183
|
end
|
187
184
|
end
|
188
185
|
if up_to_date
|
@@ -206,7 +203,6 @@ module Bundler
|
|
206
203
|
Bundler.ui.info("Syncing to #{relative_lockfile}...") if attempts == 1
|
207
204
|
synced_any = true
|
208
205
|
|
209
|
-
specs = lockfile_name.exist? ? cache.specs(lockfile_name) : {}
|
210
206
|
parent_lockfile_name = lockfile_definition[:parent]
|
211
207
|
parent_root = parent_lockfile_name.dirname
|
212
208
|
parent_specs = cache.specs(parent_lockfile_name)
|
@@ -222,7 +218,7 @@ module Bundler
|
|
222
218
|
end
|
223
219
|
|
224
220
|
# add a source for the current gem
|
225
|
-
gem_spec = parent_specs
|
221
|
+
gem_spec = parent_specs.dig(File.basename(Bundler.root), "ruby")
|
226
222
|
|
227
223
|
if gem_spec
|
228
224
|
adjusted_parent_lockfile_contents += <<~TEXT
|
@@ -252,32 +248,22 @@ module Bundler
|
|
252
248
|
next :self if parent_spec.nil?
|
253
249
|
next spec_precedences[spec.name] if spec_precedences.key?(spec.name)
|
254
250
|
|
255
|
-
precedence =
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
[cache.reverse_dependencies(lockfile_name),
|
264
|
-
cache.reverse_dependencies(parent_lockfile_name)].each do |reverse_dependencies|
|
265
|
-
break if precedence == :self
|
266
|
-
|
267
|
-
reverse_dependencies[spec.name].each do |dep_name|
|
268
|
-
precedence = check_precedence.call(specs[dep_name], parent_specs[dep_name])
|
269
|
-
break if precedence == :self
|
270
|
-
end
|
271
|
-
end
|
251
|
+
precedence = if !(cache.reverse_dependencies(lockfile_name)[spec.name] & conflicts).empty?
|
252
|
+
:parent
|
253
|
+
elsif cache.conflicting_requirements?(lockfile_name,
|
254
|
+
parent_lockfile_name,
|
255
|
+
spec,
|
256
|
+
parent_spec)
|
257
|
+
:self
|
258
|
+
end
|
272
259
|
|
273
260
|
spec_precedences[spec.name] = precedence || :parent
|
274
261
|
end
|
275
262
|
|
276
263
|
# replace any duplicate specs with what's in the parent lockfile
|
277
264
|
lockfile.specs.map! do |spec|
|
278
|
-
parent_spec = parent_specs
|
265
|
+
parent_spec = cache.find_matching_spec(parent_specs, spec)
|
279
266
|
next spec unless parent_spec
|
280
|
-
|
281
267
|
next spec if check_precedence.call(spec, parent_spec) == :self
|
282
268
|
|
283
269
|
dependency_changes ||= spec != parent_spec
|
@@ -577,25 +563,29 @@ end
|
|
577
563
|
Bundler::LazySpecification.include(Bundler::MatchMetadata) if defined?(Bundler::MatchMetadata)
|
578
564
|
Bundler::Multilock.inject_preamble unless Bundler::Multilock.loaded?
|
579
565
|
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
566
|
+
if defined?(Bundler::CLI)
|
567
|
+
require_relative "multilock/ext/cli"
|
568
|
+
|
569
|
+
# this is terrible, but we can't prepend into these modules because we only load
|
570
|
+
# _inside_ of the CLI commands already running
|
571
|
+
if Bundler::CLI.instance&.current_command_chain&.first == :check
|
572
|
+
require_relative "multilock/check"
|
573
|
+
at_exit do
|
574
|
+
next unless $!.nil?
|
575
|
+
next if $!.is_a?(SystemExit) && !$!.success?
|
587
576
|
|
588
|
-
|
577
|
+
next if Bundler::Multilock::Check.run
|
589
578
|
|
590
|
-
|
591
|
-
|
579
|
+
Bundler.ui.warn("You can attempt to fix by running `bundle install`")
|
580
|
+
exit 1
|
581
|
+
end
|
592
582
|
end
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
next if $!.is_a?(SystemExit) && !$!.success?
|
583
|
+
if Bundler::CLI.instance&.current_command_chain&.first == :lock
|
584
|
+
at_exit do
|
585
|
+
next unless $!.nil?
|
586
|
+
next if $!.is_a?(SystemExit) && !$!.success?
|
598
587
|
|
599
|
-
|
588
|
+
Bundler::Multilock.after_install_all(install: false)
|
589
|
+
end
|
600
590
|
end
|
601
591
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bundler-multilock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Instructure
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- lib/bundler/multilock/cache.rb
|
83
83
|
- lib/bundler/multilock/check.rb
|
84
84
|
- lib/bundler/multilock/ext/bundler.rb
|
85
|
+
- lib/bundler/multilock/ext/cli.rb
|
85
86
|
- lib/bundler/multilock/ext/definition.rb
|
86
87
|
- lib/bundler/multilock/ext/dsl.rb
|
87
88
|
- lib/bundler/multilock/ext/plugin.rb
|
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
114
|
- !ruby/object:Gem::Version
|
114
115
|
version: '0'
|
115
116
|
requirements: []
|
116
|
-
rubygems_version: 3.5.
|
117
|
+
rubygems_version: 3.5.10
|
117
118
|
signing_key:
|
118
119
|
specification_version: 4
|
119
120
|
summary: Support Multiple Lockfiles
|