bundler-patch 0.10.4 → 1.0.0.pre.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/.travis.yml +14 -12
- data/README.md +86 -51
- data/lib/bundler/patch/advisory_consolidator.rb +1 -0
- data/lib/bundler/patch/cli.rb +30 -9
- data/lib/bundler/patch/conservative_definition.rb +8 -3
- data/lib/bundler/patch/version.rb +1 -1
- metadata +4 -5
- data/BUNDLER.md +0 -258
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28562c56f8a370cf07b84a98031b022906c83302
|
4
|
+
data.tar.gz: c8402af554da11c8e0296e9ded6f0d32221bc6b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6662076fad605bad8b8b01c0de0ab948416359ef80648a12b955e9911941ce230cd70cdb07e3f2fa19b52334577af091532fc80e08b89f58852c8ff6d66b8d5
|
7
|
+
data.tar.gz: cccc7f7319d86baa566f7121b1869036ee8d52f7a1a15ebf17d373f2c989896eedc98d03ec707d38ec8741bb0e1e799eb70b8ad2b6622c6c83dbeb18491e8303
|
data/.travis.yml
CHANGED
@@ -9,19 +9,21 @@ script: bundle exec rake test:all
|
|
9
9
|
|
10
10
|
matrix:
|
11
11
|
include:
|
12
|
-
- rvm: 2.
|
13
|
-
env: BUNDLER_TEST_VERSION=1.12.5
|
14
|
-
- rvm: 2.2.5
|
15
|
-
env: BUNDLER_TEST_VERSION=1.12.5
|
16
|
-
- rvm: 2.3.1
|
12
|
+
- rvm: 2.3.4
|
17
13
|
env: BUNDLER_TEST_VERSION=1.9.10
|
18
|
-
- rvm: 2.3.
|
14
|
+
- rvm: 2.3.4
|
19
15
|
env: BUNDLER_TEST_VERSION=1.10.5
|
20
|
-
- rvm: 2.3.
|
16
|
+
- rvm: 2.3.4
|
21
17
|
env: BUNDLER_TEST_VERSION=1.11.2
|
22
|
-
- rvm: 2.3.
|
18
|
+
- rvm: 2.3.4
|
23
19
|
env: BUNDLER_TEST_VERSION=1.12.5
|
24
|
-
- rvm: 2.3.
|
25
|
-
env: BUNDLER_TEST_VERSION=1.13.
|
26
|
-
- rvm: 2.3.
|
27
|
-
env: BUNDLER_TEST_VERSION=1.14.
|
20
|
+
- rvm: 2.3.4
|
21
|
+
env: BUNDLER_TEST_VERSION=1.13.6
|
22
|
+
- rvm: 2.3.4
|
23
|
+
env: BUNDLER_TEST_VERSION=1.14.6
|
24
|
+
- rvm: 2.1.10
|
25
|
+
env: BUNDLER_TEST_VERSION=1.15.0
|
26
|
+
- rvm: 2.2.7
|
27
|
+
env: BUNDLER_TEST_VERSION=1.15.0
|
28
|
+
- rvm: 2.3.4
|
29
|
+
env: BUNDLER_TEST_VERSION=1.15.0
|
data/README.md
CHANGED
@@ -3,14 +3,21 @@
|
|
3
3
|
`bundler-patch` can update your gems conservatively to deal with vulnerable
|
4
4
|
gems or just get more current.
|
5
5
|
|
6
|
-
By default, "conservatively" means it will prefer the latest releases
|
7
|
-
current version, over the latest minor releases or the latest major
|
8
|
-
This is somewhat opposite from `bundle update` which prefers
|
9
|
-
versions first.
|
6
|
+
By default, "conservatively" means it will prefer the latest patch releases
|
7
|
+
from the current version, over the latest minor releases or the latest major
|
8
|
+
releases. This is somewhat opposite from `bundle update` which prefers
|
9
|
+
newest/major versions first.
|
10
|
+
|
11
|
+
Works with Bundler 1.9 and higher. Starting with Bundler 1.14 (undocumented in
|
12
|
+
1.13), much of the core behavior in `bundler-patch` has been ported to Bundler
|
13
|
+
itself. See [Patch Level
|
14
|
+
Options](http://bundler.io/v1.14/man/bundle-update.1.html#PATCH-LEVEL-OPTIONS),
|
15
|
+
[Overlapping
|
16
|
+
Dependencies](http://bundler.io/v1.14/man/bundle-update.1.html#OVERLAPPING-DEPENDENCIES)
|
17
|
+
in the `bundle update` docs, also [Patch Level
|
18
|
+
Options](http://bundler.io/v1.14/man/bundle-outdated.1.html#PATCH-LEVEL-OPTIONS)
|
19
|
+
in the `bundle outdated` docs.
|
10
20
|
|
11
|
-
Works with Bundler 1.9 and higher. Starting with Bundler 1.13, much of the
|
12
|
-
core behavior in `bundler-patch` has been ported to Bundler itself. Read
|
13
|
-
[BUNDLER.md](BUNDLER.md) for more information.
|
14
21
|
|
15
22
|
[](https://travis-ci.org/livingsocial/bundler-patch)
|
16
23
|
|
@@ -30,14 +37,15 @@ made.
|
|
30
37
|
|
31
38
|
$ bundle patch
|
32
39
|
|
33
|
-
"Conservatively" means it will sort all available versions to prefer the
|
34
|
-
|
40
|
+
"Conservatively" means it will sort all available versions to prefer the latest
|
41
|
+
patch releases from the current version, then the latest minor releases and
|
35
42
|
then the latest major releases.
|
36
43
|
|
37
44
|
"Prefer" means that no available versions are removed from consideration*, to
|
38
45
|
help ensure a suitable dependency graph can be reconciled. This does mean some
|
39
|
-
gems cannot be upgraded or may be upgraded to unexpected versions. NOTE: There
|
40
|
-
a `--
|
46
|
+
gems cannot be upgraded or may be upgraded to unexpected versions. NOTE: There
|
47
|
+
is a `--strict` option which _will_ remove versions from consideration,
|
48
|
+
see below.
|
41
49
|
|
42
50
|
_*That's a white-lie. bundler-patch will actually remove from consideration
|
43
51
|
any versions older than the currently locked version, which `bundle update`
|
@@ -45,8 +53,9 @@ will not do. It's not common, but it is possible for `bundle update` to
|
|
45
53
|
regress a gem to an older version, if necessary to reconcile the dependency
|
46
54
|
graph._
|
47
55
|
|
48
|
-
Gem requirements as defined in the Gemfile will still define what versions are
|
49
|
-
The new conservative behavior controls the preference order of those
|
56
|
+
Gem requirements as defined in the Gemfile will still define what versions are
|
57
|
+
available. The new conservative behavior controls the preference order of those
|
58
|
+
versions.
|
50
59
|
|
51
60
|
For example, if gem 'foo' is locked at 1.0.2, with no gem requirement defined
|
52
61
|
in the Gemfile, and versions 1.0.3, 1.0.4, 1.1.0, 1.1.1, 2.0.0 all exist, the
|
@@ -62,18 +71,17 @@ gems.
|
|
62
71
|
|
63
72
|
$ bundle patch foo bar
|
64
73
|
|
65
|
-
* `-m/--
|
66
|
-
|
74
|
+
* `-m/--minor` option will give preference for minor versions over patch
|
75
|
+
versions.
|
67
76
|
|
68
|
-
* `-
|
69
|
-
|
70
|
-
|
71
|
-
1.1.1, 2.0.0"
|
77
|
+
* `-n/--minimal` option will reverse the preference order within patch,
|
78
|
+
minor, major groups to just 'the next' version. In the prior example, the
|
79
|
+
order of preference changes to "1.0.3, 1.0.4, 1.0.2, 1.1.0, 1.1.1, 2.0.0"
|
72
80
|
|
73
|
-
* `-s/--
|
74
|
-
|
75
|
-
specified). This increases the chances of Bundler being unable to
|
76
|
-
|
81
|
+
* `-s/--strict` option will actually remove from consideration versions
|
82
|
+
outside either the current patch version (or minor version if `-m`
|
83
|
+
specified). This increases the chances of Bundler being unable to reconcile
|
84
|
+
the dependency graph and could raise a `VersionConflict`.
|
77
85
|
|
78
86
|
`bundler-patch` will also check for vulnerabilities based on the
|
79
87
|
`ruby-advisory-db`, but also will _modify_ (if necessary) the gem requirement
|
@@ -82,22 +90,36 @@ in the Gemfile on vulnerable gems to ensure they can be upgraded.
|
|
82
90
|
* `-l/--list` option will just list vulnerable gems. No updates will be
|
83
91
|
performed.
|
84
92
|
|
85
|
-
* `-a/--
|
93
|
+
* `-a/--advisory-db-path` option can provide the path to an additional
|
86
94
|
custom ruby-advisory-db styled directory. The path should not include the
|
87
95
|
final `gems` directory, that will be appended automatically. This can be
|
88
96
|
used for flagging necessary updates for custom/internal gems.
|
97
|
+
|
98
|
+
* `-d/--ruby-advisory-db-path` option can override the default path where the
|
99
|
+
ruby-advisory-db repository is checked out into.
|
89
100
|
|
90
101
|
The rules for updating vulnerable gems are almost identical to the general
|
91
102
|
`bundler-patch` behavior described above, and abide by the same options (`-m`,
|
92
|
-
`-
|
103
|
+
`-n`, and `-s`) though there are some tweaks to encourage getting to at least
|
93
104
|
a patched version of the gem. Keep in mind Bundler may still choose unexpected
|
94
105
|
versions in order to satisfy the dependency graph.
|
95
106
|
|
96
|
-
* `-v/--
|
107
|
+
* `-v/--vulnerable-gems-only` option will automatically restrict the gems
|
97
108
|
to update list to currently vulnerable gems. If a combination of `-v` and
|
98
109
|
a list of gem names are passed, the `-v` option is ignored in favor of
|
99
110
|
the listed gem names.
|
100
111
|
|
112
|
+
`bundler-patch` can also update the Ruby version listed in .ruby-version and
|
113
|
+
the Gemfile if given a list of the latest Ruby versions that are available with
|
114
|
+
the following options. Jumps of major versions will not be made at all and this
|
115
|
+
feature is designed such that the version will be updated to only the next
|
116
|
+
available in the list. If the current version is 2.3.1, and the list of
|
117
|
+
`--rubies` is "2.3.2, 2.3.3", then 2.3.2 will be used, not 2.3.3. The intention
|
118
|
+
is for this list to be only the most recent version(s) of Ruby supported, (e.g.
|
119
|
+
"2.1.10, 2.2.7, 2.3.4").
|
120
|
+
|
121
|
+
* `-r/--ruby` option indicates updates to Ruby version will be made.
|
122
|
+
* `--rubies` a comma-delimited list of target Ruby versions to upgrade to.
|
101
123
|
|
102
124
|
## Examples
|
103
125
|
|
@@ -107,8 +129,8 @@ versions in order to satisfy the dependency graph.
|
|
107
129
|
|-------------|---------|-----------------------------|----------|--------|
|
108
130
|
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | | 1.4.5 |
|
109
131
|
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | -m | 1.5.1 |
|
110
|
-
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | -
|
111
|
-
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | -m -
|
132
|
+
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | -n | 1.4.4 |
|
133
|
+
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1 | -m -n | 1.5.0 |
|
112
134
|
|
113
135
|
### Two Gems
|
114
136
|
|
@@ -131,21 +153,24 @@ Gemfile.lock:
|
|
131
153
|
bar (~> 2.0)
|
132
154
|
bar (2.0.3)
|
133
155
|
|
134
|
-
| # | Command Line
|
135
|
-
|
136
|
-
| 1 | bundle patch
|
137
|
-
| 2 | bundle patch foo
|
138
|
-
| 3 | bundle patch
|
139
|
-
| 4 | bundle patch
|
140
|
-
| 5 | bundle patch
|
141
|
-
| 6 | bundle patch
|
142
|
-
| 7 | bundle patch
|
156
|
+
| # | Command Line | Result |
|
157
|
+
|---|---------------------------------|---------------------------|
|
158
|
+
| 1 | bundle patch | 'foo 1.4.5', 'bar 2.1.1' |
|
159
|
+
| 2 | bundle patch foo | 'foo 1.4.5', 'bar 2.1.1' |
|
160
|
+
| 3 | bundle patch --minor | 'foo 1.5.1', 'bar 3.0.0' |
|
161
|
+
| 4 | bundle patch --minor --strict | 'foo 1.5.0', 'bar 2.1.1' |
|
162
|
+
| 5 | bundle patch --strict | 'foo 1.4.4', 'bar 2.0.4' |
|
163
|
+
| 6 | bundle patch --minimal | 'foo 1.4.4', 'bar 2.0.4' |
|
164
|
+
| 7 | bundle patch --strict foo | 'foo 1.4.4', 'bar 2.0.3' |
|
165
|
+
| 8 | bundle patch --minimal --minor | 'foo 1.5.0', 'bar 2.1.0' |
|
143
166
|
|
144
167
|
In case 1, `bar` is upgraded to 2.1.1, a minor version increase, because the
|
145
168
|
dependency from `foo` 1.4.5 required it.
|
146
169
|
|
147
|
-
In case 2,
|
148
|
-
|
170
|
+
In case 2, `bar` still moves because it is not a _declared_ dependency in the
|
171
|
+
Gemfile, but it is a dependency of `foo` and is therefore free to move if
|
172
|
+
`foo`'s requirement of `bar` changes. If `bar` appeared in the Gemfile, then
|
173
|
+
it would stay put in this case and `foo` would only move to 1.4.4.
|
149
174
|
|
150
175
|
In case 3, `bar` goes up a whole major release, because a minor increase is
|
151
176
|
preferred now for `foo`, and when it goes to 1.5.1, it requires 3.0.0 of
|
@@ -159,14 +184,18 @@ In case 5, both `foo` and `bar` have any minor or major increments removed
|
|
159
184
|
from consideration because of the `-s` strict flag, so the most they can
|
160
185
|
move is up to 1.4.4 and 2.0.4.
|
161
186
|
|
162
|
-
In case 6, the prefer minimal switch `-
|
187
|
+
In case 6, the prefer minimal switch `-n` means they only increment to the
|
163
188
|
next available release.
|
164
189
|
|
165
|
-
In case 7, the `-
|
190
|
+
In case 7, the `-s` strict flag removes any `bar` 2.1 versions from
|
191
|
+
consideration, which restricts `foo` to 1.4.4 at latest. `bar` is not unlocked
|
192
|
+
and therefore doesn't move.
|
193
|
+
|
194
|
+
In case 8, the `-n` and `-m` switches allow both to move to just the next
|
166
195
|
available minor version.
|
167
196
|
|
168
197
|
|
169
|
-
|
198
|
+
## Troubleshooting
|
170
199
|
|
171
200
|
First, make sure the current `bundle` command itself runs to completion on its
|
172
201
|
own without any problems.
|
@@ -211,18 +240,24 @@ At the end of all of this though, again, the requirements in the Gemfile
|
|
211
240
|
trump anything else, and the most control you have is by modifying those
|
212
241
|
in the Gemfile.
|
213
242
|
|
243
|
+
## Breaking Changes from 0.x to 1.0
|
244
|
+
|
245
|
+
* Command line options with underscores now uses hyphens instead of
|
246
|
+
underscores. (Underscore versions will still work, but are undocumented).
|
247
|
+
|
248
|
+
* Some options have been renamed. (Old names will still work, but will be
|
249
|
+
undocumented).
|
250
|
+
|
251
|
+
* `--minor_preferred` => `--minor`
|
252
|
+
* `--prefer_minimal` => `--minimal` / `-p` => `-n`
|
253
|
+
* `--strict_updates` => `--strict`
|
254
|
+
|
255
|
+
In the "Two Gems" cases documented above, case 2 was _wrong_ (the docs were
|
256
|
+
incorrect, there was no bug in the code). Case 2 has been corrected and a
|
257
|
+
new similar case has been inserted towards the end of the table.
|
214
258
|
|
215
259
|
## Development
|
216
260
|
|
217
|
-
### Status
|
218
|
-
|
219
|
-
0.x versions are subject to breaking changes, there's a fair amount of
|
220
|
-
experimenting going on.
|
221
|
-
|
222
|
-
We'd love to get real world scenarios where things don't go as planned to help
|
223
|
-
flesh out varying details of what many believe a conservative update should
|
224
|
-
be.
|
225
|
-
|
226
261
|
### How To
|
227
262
|
|
228
263
|
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
@@ -70,6 +70,7 @@ module Bundler::Patch
|
|
70
70
|
class GemPatch
|
71
71
|
include Comparable
|
72
72
|
|
73
|
+
# TODO: requested_version is better name than new_version?
|
73
74
|
attr_reader :gem_name, :old_version, :new_version, :patched_versions
|
74
75
|
|
75
76
|
def initialize(gem_name:, old_version: nil, new_version: nil, patched_versions: nil)
|
data/lib/bundler/patch/cli.rb
CHANGED
@@ -7,18 +7,25 @@ module Bundler::Patch
|
|
7
7
|
class CLI
|
8
8
|
def self.execute
|
9
9
|
opts = Slop.parse! do
|
10
|
-
banner "Bundler Patch Version #{Bundler::Patch::VERSION}\nUsage: bundle patch [options] [
|
11
|
-
on '-m', '--
|
12
|
-
on '-
|
13
|
-
on '-s', '--
|
10
|
+
banner "Bundler Patch Version #{Bundler::Patch::VERSION}\nUsage: bundle patch [options] [gems-to-update]\n\nbundler-patch attempts to update gems conservatively.\n"
|
11
|
+
on '-m', '--minor', 'Prefer update to the latest minor.patch version.'
|
12
|
+
on '-n', '--minimal', 'Prefer minimal version updates over most recent patch (or minor if -m used).'
|
13
|
+
on '-s', '--strict', 'Restrict any gem to be upgraded past most recent patch (or minor if -m used).'
|
14
14
|
on '-l', '--list', 'List vulnerable gems and new version target. No updates will be performed.'
|
15
|
-
on '-v', '--
|
16
|
-
on '-a=', '--
|
17
|
-
on '-d=', '--
|
15
|
+
on '-v', '--vulnerable-gems-only', 'Only update vulnerable gems.'
|
16
|
+
on '-a=', '--advisory-db-path=', 'Optional custom advisory db path. `gems` dir will be appended to this path.'
|
17
|
+
on '-d=', '--ruby-advisory-db-path=', 'Optional path for ruby advisory db. `gems` dir will be appended to this path.'
|
18
18
|
on '-r', '--ruby', 'Update Ruby version in related files.'
|
19
19
|
on '--rubies=', 'Supported Ruby versions. Comma delimited or multiple switches.', as: Array, delimiter: ','
|
20
20
|
on '-h', 'Show this help'
|
21
21
|
on '--help', 'Show README.md'
|
22
|
+
# will be stripped in help display and normalized to hyphenated options
|
23
|
+
on '--vulnerable_gems_only'
|
24
|
+
on '--advisory_db_path='
|
25
|
+
on '--ruby_advisory_db_path='
|
26
|
+
on '-p', '--prefer_minimal'
|
27
|
+
on '--minor_preferred'
|
28
|
+
on '--strict_updates'
|
22
29
|
end
|
23
30
|
|
24
31
|
options = opts.to_hash
|
@@ -31,8 +38,9 @@ module Bundler::Patch
|
|
31
38
|
CLI.new.patch(options)
|
32
39
|
end
|
33
40
|
|
34
|
-
def self.show_help(
|
35
|
-
|
41
|
+
def self.show_help(slop)
|
42
|
+
slop.options.delete_if { |o| o.long =~ /_/ }
|
43
|
+
puts slop
|
36
44
|
exit
|
37
45
|
end
|
38
46
|
|
@@ -48,6 +56,8 @@ module Bundler::Patch
|
|
48
56
|
def patch(options={})
|
49
57
|
Bundler.ui = Bundler::UI::Shell.new
|
50
58
|
|
59
|
+
normalize_options(options)
|
60
|
+
|
51
61
|
return list(options) if options[:list]
|
52
62
|
|
53
63
|
patch_ruby(options[:rubies]) if options[:ruby]
|
@@ -55,6 +65,17 @@ module Bundler::Patch
|
|
55
65
|
patch_gems(options)
|
56
66
|
end
|
57
67
|
|
68
|
+
def normalize_options(options)
|
69
|
+
map = {:prefer_minimal => :minimal, :strict_updates => :strict, :minor_preferred => :minor}
|
70
|
+
{}.tap do |target|
|
71
|
+
options.each_pair do |k, v|
|
72
|
+
new_key = k.to_s.gsub('-', '_').to_sym
|
73
|
+
new_key = map[new_key] || new_key
|
74
|
+
target[new_key] = v
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
58
79
|
private
|
59
80
|
|
60
81
|
def list(options)
|
@@ -72,9 +72,9 @@ module Bundler::Patch
|
|
72
72
|
@bundler_def ||= Bundler.definition(@gems_to_update.to_bundler_definition)
|
73
73
|
@bundler_def.extend ConservativeDefinition
|
74
74
|
@bundler_def.gems_to_update = @gems_to_update
|
75
|
-
@bundler_def.strict = @options[:
|
76
|
-
@bundler_def.minor_preferred = @options[:
|
77
|
-
@bundler_def.prefer_minimal = @options[:
|
75
|
+
@bundler_def.strict = @options[:strict]
|
76
|
+
@bundler_def.minor_preferred = @options[:minor]
|
77
|
+
@bundler_def.prefer_minimal = @options[:minimal]
|
78
78
|
fixup_empty_remotes if @gems_to_update.to_bundler_definition === true
|
79
79
|
@bundler_def
|
80
80
|
end
|
@@ -105,6 +105,7 @@ module Bundler::Patch
|
|
105
105
|
|
106
106
|
def initialize(gem_patches)
|
107
107
|
@gem_patches = Array(gem_patches)
|
108
|
+
STDERR.puts "Unlocked gems: #{unlocking_description}" if ENV['DEBUG_PATCH_RESOLVER']
|
108
109
|
end
|
109
110
|
|
110
111
|
def to_bundler_definition
|
@@ -126,5 +127,9 @@ module Bundler::Patch
|
|
126
127
|
def unlocking_gem?(gem_name)
|
127
128
|
unlocking_all? || to_gem_names.include?(gem_name)
|
128
129
|
end
|
130
|
+
|
131
|
+
def unlocking_description
|
132
|
+
unlocking_all? ? 'ALL' : to_gem_names.sort.join(', ')
|
133
|
+
end
|
129
134
|
end
|
130
135
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bundler-patch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chrismo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler-advise
|
@@ -132,7 +132,6 @@ files:
|
|
132
132
|
- ".rspec"
|
133
133
|
- ".ruby-version"
|
134
134
|
- ".travis.yml"
|
135
|
-
- BUNDLER.md
|
136
135
|
- Gemfile
|
137
136
|
- LICENSE.txt
|
138
137
|
- README.md
|
@@ -167,9 +166,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
166
|
version: '0'
|
168
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
168
|
requirements:
|
170
|
-
- - "
|
169
|
+
- - ">"
|
171
170
|
- !ruby/object:Gem::Version
|
172
|
-
version:
|
171
|
+
version: 1.3.1
|
173
172
|
requirements: []
|
174
173
|
rubyforge_project:
|
175
174
|
rubygems_version: 2.6.8
|
data/BUNDLER.md
DELETED
@@ -1,258 +0,0 @@
|
|
1
|
-
# Conservative Bundle Updates
|
2
|
-
|
3
|
-
Starting with 1.13.0.rc.2, a subset of bundler-patch behavior was ported to Bundler itself.
|
4
|
-
The plan is to leave it undocumented and unsupported in 1.13 to give it a chance to
|
5
|
-
be used and flush out bugs and iron out some design decisions.
|
6
|
-
|
7
|
-
Part of that work before 1.14 (or maybe a later version) will be to properly document
|
8
|
-
`bundle update` as well as the [Conservative Updating](http://bundler.io/v1.12/man/bundle-install.1.html#CONSERVATIVE-UPDATING)
|
9
|
-
section of `bundle install`, but right now we need a placeholder document showing the new
|
10
|
-
stuff so folks know how to use it.
|
11
|
-
|
12
|
-
This is largely copy/pasta of the bundler-patch [README](README.md).
|
13
|
-
|
14
|
-
## Usage
|
15
|
-
|
16
|
-
The default `bundle update` behavior remains untouched. Use of the new `--patch`
|
17
|
-
or `--minor` options will invoke the new conservative update behavior.
|
18
|
-
|
19
|
-
"Conservative" means it will sort all available versions to prefer the
|
20
|
-
latest releases from the current version, then the latest minor releases and
|
21
|
-
then the latest major releases.
|
22
|
-
|
23
|
-
"Prefer" means that no available versions are removed from consideration, to
|
24
|
-
help ensure a suitable dependency graph can be reconciled. This does mean some
|
25
|
-
gems cannot be upgraded or may be upgraded to unexpected versions. NOTE: There is
|
26
|
-
a `--strict` option which _will_ remove versions from consideration, see below.
|
27
|
-
|
28
|
-
Gem requirements as defined in the Gemfile will still define what versions are available.
|
29
|
-
The new conservative behavior controls the preference order of those versions.
|
30
|
-
|
31
|
-
For example, if gem 'foo' is locked at 1.0.2, with no gem requirement defined
|
32
|
-
in the Gemfile, and versions 1.0.3, 1.0.4, 1.1.0, 1.1.1, 2.0.0 all exist, the
|
33
|
-
default order of preference will be "1.0.4, 1.0.3, 1.0.2, 1.1.1, 1.1.0,
|
34
|
-
2.0.0".
|
35
|
-
|
36
|
-
In the same example, if gem 'foo' has a requirement of '~> 1.0', version 2.0.0
|
37
|
-
will be removed from consideration as always.
|
38
|
-
|
39
|
-
With no gem names provided on the command line, all gems will be unlocked and
|
40
|
-
open for updating.
|
41
|
-
|
42
|
-
$ bundle update --patch
|
43
|
-
|
44
|
-
A list of gem names can be passed to restrict to just those gems.
|
45
|
-
|
46
|
-
$ bundle update --patch foo bar
|
47
|
-
|
48
|
-
* `--patch` option will give preference for release/patch versions, then minor,
|
49
|
-
then major.
|
50
|
-
|
51
|
-
* `--minor` option will give preference for minor versions over
|
52
|
-
release versions, then major versions.
|
53
|
-
|
54
|
-
* `--major` option will give preference for major versions over
|
55
|
-
minor or release versions. This is the default behavior currently, so this
|
56
|
-
flag is cosmetic for now. Bundler 2.0 will likely make `--patch` the default
|
57
|
-
behavior.
|
58
|
-
|
59
|
-
* `--strict` option will actually remove from consideration
|
60
|
-
versions outside either the current release (or minor version if `--minor`
|
61
|
-
specified). This increases the chances of Bundler being unable to
|
62
|
-
reconcile the dependency graph and in some cases could even raise a
|
63
|
-
`VersionConflict`.
|
64
|
-
|
65
|
-
## Examples
|
66
|
-
|
67
|
-
### Single Gem
|
68
|
-
|
69
|
-
| Requirements| Locked | Available | Option | Result |
|
70
|
-
|-------------|---------|-----------------------------------|----------|--------|
|
71
|
-
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1, 2.0.0 | --patch | 1.4.5 |
|
72
|
-
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1, 2.0.0 | --minor | 1.5.1 |
|
73
|
-
| foo | 1.4.3 | 1.4.4, 1.4.5, 1.5.0, 1.5.1, 2.0.0 | --major | 2.0.0 |
|
74
|
-
|
75
|
-
### Two Gems
|
76
|
-
|
77
|
-
Given the following gem specifications:
|
78
|
-
|
79
|
-
- foo 1.4.3, requires: ~> bar 2.0
|
80
|
-
- foo 1.4.4, requires: ~> bar 2.0
|
81
|
-
- foo 1.4.5, requires: ~> bar 2.1
|
82
|
-
- foo 1.5.0, requires: ~> bar 2.1
|
83
|
-
- foo 1.5.1, requires: ~> bar 3.0
|
84
|
-
- bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1, 3.0.0
|
85
|
-
|
86
|
-
Gemfile:
|
87
|
-
|
88
|
-
gem 'foo'
|
89
|
-
|
90
|
-
Gemfile.lock:
|
91
|
-
|
92
|
-
foo (1.4.3)
|
93
|
-
bar (~> 2.0)
|
94
|
-
bar (2.0.3)
|
95
|
-
|
96
|
-
| # | Command Line | Result |
|
97
|
-
|---|--------------------------------|---------------------------|
|
98
|
-
| 1 | bundle update --patch | 'foo 1.4.5', 'bar 2.1.1' |
|
99
|
-
| 2 | bundle update --patch foo | 'foo 1.4.5', 'bar 2.1.1' |
|
100
|
-
| 3 | bundle update --minor | 'foo 1.5.1', 'bar 3.0.0' |
|
101
|
-
| 4 | bundle update --minor --strict | 'foo 1.5.0', 'bar 2.1.1' |
|
102
|
-
| 5 | bundle update --patch --strict | 'foo 1.4.4', 'bar 2.0.4' |
|
103
|
-
|
104
|
-
In case 1, `bar` is upgraded to 2.1.1, a minor version increase, because the
|
105
|
-
dependency from `foo` 1.4.5 required it.
|
106
|
-
|
107
|
-
In case 2, only `foo` is unlocked, but because no other gem depends on `bar`
|
108
|
-
and `bar` is not a declared dependency in the Gemfile, `bar` is free to move,
|
109
|
-
and so the result is the same as case 1.
|
110
|
-
|
111
|
-
In case 3, `bar` goes up a whole major release, because a minor increase is
|
112
|
-
preferred now for `foo`, and when it goes to 1.5.1, it requires 3.0.0 of
|
113
|
-
`bar`.
|
114
|
-
|
115
|
-
In case 4, `foo` is preferred up to a 1.5.x, but 1.5.1 won't work because the
|
116
|
-
`--strict` flag removes `bar` 3.0.0 from consideration since it's a major
|
117
|
-
increment.
|
118
|
-
|
119
|
-
In case 5, both `foo` and `bar` have any minor or major increments removed
|
120
|
-
from consideration because of the `--strict` flag, so the most they can
|
121
|
-
move is up to 1.4.4 and 2.0.4.
|
122
|
-
|
123
|
-
### Shared Dependencies
|
124
|
-
|
125
|
-
#### Shared Cannot Move
|
126
|
-
|
127
|
-
Given the following gem specifications:
|
128
|
-
|
129
|
-
- foo 1.4.3, requires: ~> shared 2.0, ~> bar 2.0
|
130
|
-
- foo 1.4.4, requires: ~> shared 2.0, ~> bar 2.0
|
131
|
-
- foo 1.4.5, requires: ~> shared 2.1, ~> bar 2.1
|
132
|
-
- foo 1.5.0, requires: ~> shared 2.1, ~> bar 2.1
|
133
|
-
- qux 1.0.0, requires: ~> shared 2.0.0
|
134
|
-
- bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1
|
135
|
-
- shared with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1
|
136
|
-
|
137
|
-
Gemfile:
|
138
|
-
|
139
|
-
gem 'foo'
|
140
|
-
gem 'qux'
|
141
|
-
|
142
|
-
Gemfile.lock:
|
143
|
-
|
144
|
-
bar (2.0.3)
|
145
|
-
foo (1.4.3)
|
146
|
-
bar (~> 2.0)
|
147
|
-
shared (~> 2.0)
|
148
|
-
qux (1.0.0)
|
149
|
-
shared (~> 2.0.0)
|
150
|
-
shared (2.0.3)
|
151
|
-
|
152
|
-
|
153
|
-
| # | Command Line | Result |
|
154
|
-
|---|--------------------------------|-------------------------------------------|
|
155
|
-
| 1 | bundle update --patch foo | 'foo 1.4.4', 'bar 2.0.3', 'shared 2.0.3' |
|
156
|
-
| 2 | bundle update --patch foo bar | 'foo 1.4.4', 'bar 2.0.4', 'shared 2.0.3' |
|
157
|
-
| 3 | bundle update --patch | 'foo 1.4.4', 'bar 2.0.4', 'shared 2.0.4' |
|
158
|
-
|
159
|
-
In case 1, only `foo` moves. When `foo` 1.4.5 is considered in resolution, it
|
160
|
-
would require `shared` 2.1 which isn't allowed because `qux` is incompatible.
|
161
|
-
Resolution backs up to `foo` 1.4.4, and that is allowed by the `qux` constraint
|
162
|
-
on `shared` so `foo` moves. `bar` could legally move, but since it is locked
|
163
|
-
and the current version still satisfies the requirement of `~> 2.0` it stays
|
164
|
-
put.
|
165
|
-
|
166
|
-
In case 2, everything is the same, but `bar` is also unlocked, so it is also
|
167
|
-
allowed to increment to 2.0.4 which still satisfies `~> 2.0`.
|
168
|
-
|
169
|
-
In case 3, everything is unlocked, so `shared` can also bump up a patch version.
|
170
|
-
|
171
|
-
#### Shared Can Move
|
172
|
-
|
173
|
-
_*This is exactly the same setup as "Shared Cannot Move" except for one change:*_
|
174
|
-
The `qux` gem has a looser requirement of `shared`: `~> 2.0` instead of `~> 2.0.0`.
|
175
|
-
|
176
|
-
Given the following gem specifications:
|
177
|
-
|
178
|
-
- foo 1.4.3, requires: ~> shared 2.0, ~> bar 2.0
|
179
|
-
- foo 1.4.4, requires: ~> shared 2.0, ~> bar 2.0
|
180
|
-
- foo 1.4.5, requires: ~> shared 2.1, ~> bar 2.1
|
181
|
-
- foo 1.5.0, requires: ~> shared 2.1, ~> bar 2.1
|
182
|
-
- qux 1.0.0, requires: ~> shared 2.0
|
183
|
-
- bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1
|
184
|
-
- shared with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1
|
185
|
-
|
186
|
-
Gemfile:
|
187
|
-
|
188
|
-
gem 'foo'
|
189
|
-
gem 'qux'
|
190
|
-
|
191
|
-
Gemfile.lock:
|
192
|
-
|
193
|
-
bar (2.0.3)
|
194
|
-
foo (1.4.3)
|
195
|
-
bar (~> 2.0)
|
196
|
-
shared (~> 2.0)
|
197
|
-
qux (1.0.0)
|
198
|
-
shared (~> 2.0)
|
199
|
-
shared (2.0.3)
|
200
|
-
|
201
|
-
|
202
|
-
| # | Command Line | Result |
|
203
|
-
|---|--------------------------------|-------------------------------------------|
|
204
|
-
| 1 | bundle update --patch foo | 'foo 1.4.5', 'bar 2.1.1', 'shared 2.1.1' |
|
205
|
-
| 2 | bundle update --patch foo bar | 'foo 1.4.5', 'bar 2.1.1', 'shared 2.1.1' |
|
206
|
-
| 3 | bundle update --patch | 'foo 1.4.5', 'bar 2.1.1', 'shared 2.1.1' |
|
207
|
-
|
208
|
-
In all 3 cases, because `foo` 1.4.5 depends on newer versions of `bar` and
|
209
|
-
`shared`, and no requirements from `qux` are restricting those two from moving,
|
210
|
-
then all move as far as allowed here.
|
211
|
-
|
212
|
-
`foo` can only move to 1.4.5 and not 1.5.0 because of the `--patch` flag.
|
213
|
-
|
214
|
-
As previously demonstrated (see Two Cases) `bar` and `shared` move past the
|
215
|
-
`--patch` restriction because `--strict` is not in play, they are not declared
|
216
|
-
dependencies in the Gemfile and they need to move to satisfy the new `foo`
|
217
|
-
requirement.
|
218
|
-
|
219
|
-
### Bundle Install Like Conservative Updating
|
220
|
-
|
221
|
-
As detailed in [Bundle Install Docs](http://bundler.io/v1.13/man/bundle-install.1.html#CONSERVATIVE-UPDATING)
|
222
|
-
there is a way to prevent shared dependencies from moving after (a) changing
|
223
|
-
a requirement in the Gemfile and (b) using `bundle install`. There's currently
|
224
|
-
not an equivalent way to do this with `bundler-patch` or `bundle update` but
|
225
|
-
this may change in the future.
|
226
|
-
|
227
|
-
### Troubleshooting
|
228
|
-
|
229
|
-
First, make sure the current `bundle` command itself runs to completion on its
|
230
|
-
own without any problems.
|
231
|
-
|
232
|
-
The most frequent problems involve expectations around what
|
233
|
-
gems should or shouldn't be upgraded. This can quickly get complicated as even
|
234
|
-
a small dependency tree can involve many moving parts, and Bundler works hard
|
235
|
-
to find a combination that satisfies all of the dependencies and requirements.
|
236
|
-
|
237
|
-
NOTE: the requirements in the Gemfile trump anything else. The most control
|
238
|
-
you have is by modifying those in the Gemfile, in some circumstances it may be
|
239
|
-
better to pin your versions to what you need instead of trying to diagnose why
|
240
|
-
Bundler isn't calculating the versions you expect with a broader requirement.
|
241
|
-
If there is an incompatibility, pinning to desired versions can also aide in
|
242
|
-
debugging dependency conflicts.
|
243
|
-
|
244
|
-
You can get a (very verbose) look into how Bundler's resolution algorithm is
|
245
|
-
working by setting the `DEBUG_RESOLVER` environment variable. While it can be
|
246
|
-
tricky to dig through, it should explain how it came to the conclusions it
|
247
|
-
came to.
|
248
|
-
|
249
|
-
In particular, grep for 'Unwinding for conflict' in the debug output to
|
250
|
-
isolate some key issues that may be preventing the outcome you expect.
|
251
|
-
|
252
|
-
To get additional Bundler debugging output, enable the `DEBUG` env variable.
|
253
|
-
This will include all of the details of the downloading the full dependency
|
254
|
-
data from remote sources.
|
255
|
-
|
256
|
-
At the end of all of this though, again, the requirements in the Gemfile
|
257
|
-
trump anything else, and the most control you have is by modifying those
|
258
|
-
in the Gemfile.
|