bundler 1.15.1 → 1.17.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +320 -0
- data/README.md +17 -8
- data/bundler.gemspec +25 -9
- data/exe/bundle +1 -6
- data/exe/bundle_ruby +4 -3
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +5 -0
- data/lib/bundler/cli/add.rb +15 -6
- data/lib/bundler/cli/binstubs.rb +17 -9
- data/lib/bundler/cli/cache.rb +5 -4
- data/lib/bundler/cli/check.rb +3 -5
- data/lib/bundler/cli/clean.rb +5 -6
- data/lib/bundler/cli/common.rb +11 -2
- data/lib/bundler/cli/config.rb +2 -1
- data/lib/bundler/cli/console.rb +2 -1
- data/lib/bundler/cli/doctor.rb +48 -1
- data/lib/bundler/cli/exec.rb +6 -5
- data/lib/bundler/cli/gem.rb +13 -8
- data/lib/bundler/cli/info.rb +0 -1
- data/lib/bundler/cli/init.rb +18 -6
- data/lib/bundler/cli/inject.rb +1 -0
- data/lib/bundler/cli/install.rb +64 -77
- data/lib/bundler/cli/issue.rb +1 -1
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +0 -1
- data/lib/bundler/cli/open.rb +2 -2
- data/lib/bundler/cli/outdated.rb +20 -9
- data/lib/bundler/cli/package.rb +9 -6
- data/lib/bundler/cli/platform.rb +1 -0
- data/lib/bundler/cli/plugin.rb +1 -0
- data/lib/bundler/cli/pristine.rb +20 -6
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +0 -1
- data/lib/bundler/cli/update.rb +35 -7
- data/lib/bundler/cli/viz.rb +4 -0
- data/lib/bundler/cli.rb +234 -90
- data/lib/bundler/compact_index_client/cache.rb +1 -2
- data/lib/bundler/compact_index_client/updater.rb +35 -7
- data/lib/bundler/compact_index_client.rb +1 -0
- data/lib/bundler/compatibility_guard.rb +14 -0
- data/lib/bundler/constants.rb +1 -0
- data/lib/bundler/current_ruby.rb +13 -5
- data/lib/bundler/definition.rb +192 -139
- data/lib/bundler/dep_proxy.rb +3 -1
- data/lib/bundler/dependency.rb +9 -9
- data/lib/bundler/deployment.rb +1 -1
- data/lib/bundler/deprecate.rb +15 -3
- data/lib/bundler/dsl.rb +115 -64
- data/lib/bundler/endpoint_specification.rb +10 -1
- data/lib/bundler/env.rb +90 -29
- data/lib/bundler/environment_preserver.rb +27 -6
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +46 -4
- data/lib/bundler/fetcher/base.rb +1 -0
- data/lib/bundler/fetcher/compact_index.rb +2 -11
- data/lib/bundler/fetcher/dependency.rb +2 -1
- data/lib/bundler/fetcher/downloader.rb +11 -5
- data/lib/bundler/fetcher/index.rb +3 -2
- data/lib/bundler/fetcher.rb +18 -11
- data/lib/bundler/friendly_errors.rb +6 -1
- data/lib/bundler/gem_helper.rb +19 -10
- data/lib/bundler/gem_helpers.rb +1 -0
- data/lib/bundler/gem_remote_fetcher.rb +1 -0
- data/lib/bundler/gem_tasks.rb +1 -0
- data/lib/bundler/gem_version_promoter.rb +17 -2
- data/lib/bundler/gemdeps.rb +1 -0
- data/lib/bundler/graph.rb +1 -0
- data/lib/bundler/index.rb +8 -8
- data/lib/bundler/injector.rb +192 -30
- data/lib/bundler/inline.rb +10 -10
- data/lib/bundler/installer/gem_installer.rb +12 -2
- data/lib/bundler/installer/parallel_installer.rb +78 -42
- data/lib/bundler/installer/standalone.rb +1 -0
- data/lib/bundler/installer.rb +138 -53
- data/lib/bundler/lazy_specification.rb +3 -2
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +10 -4
- data/lib/bundler/match_platform.rb +1 -0
- data/lib/bundler/mirror.rb +8 -5
- data/lib/bundler/plugin/api/source.rb +9 -2
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +7 -2
- data/lib/bundler/plugin/installer.rb +7 -6
- data/lib/bundler/plugin/source_list.rb +7 -8
- data/lib/bundler/plugin.rb +13 -5
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +10 -0
- data/lib/bundler/remote_specification.rb +10 -1
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/resolver.rb +158 -195
- data/lib/bundler/retry.rb +1 -0
- data/lib/bundler/ruby_dsl.rb +1 -0
- data/lib/bundler/ruby_version.rb +2 -1
- data/lib/bundler/rubygems_ext.rb +5 -4
- data/lib/bundler/rubygems_gem_installer.rb +31 -1
- data/lib/bundler/rubygems_integration.rb +71 -32
- data/lib/bundler/runtime.rb +11 -9
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/settings.rb +213 -86
- data/lib/bundler/setup.rb +4 -7
- data/lib/bundler/shared_helpers.rb +131 -26
- data/lib/bundler/similarity_detector.rb +1 -0
- data/lib/bundler/source/gemspec.rb +1 -0
- data/lib/bundler/source/git/git_proxy.rb +21 -11
- data/lib/bundler/source/git.rb +24 -19
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path/installer.rb +2 -0
- data/lib/bundler/source/path.rb +11 -7
- data/lib/bundler/source/rubygems/remote.rb +8 -2
- data/lib/bundler/source/rubygems.rb +161 -84
- data/lib/bundler/source.rb +36 -0
- data/lib/bundler/source_list.rb +75 -15
- data/lib/bundler/spec_set.rb +12 -6
- data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
- data/lib/bundler/stub_specification.rb +1 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +12 -0
- data/lib/bundler/templates/Executable.bundler +105 -0
- data/lib/bundler/templates/Gemfile +3 -0
- data/lib/bundler/templates/gems.rb +8 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +2 -0
- data/lib/bundler/templates/newgem/README.md.tt +1 -1
- data/lib/bundler/templates/newgem/gitignore.tt +0 -1
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -3
- data/lib/bundler/templates/newgem/rspec.tt +1 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
- data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
- data/lib/bundler/ui/rg_proxy.rb +1 -0
- data/lib/bundler/ui/shell.rb +17 -4
- data/lib/bundler/ui/silent.rb +1 -0
- data/lib/bundler/ui.rb +1 -0
- data/lib/bundler/uri_credentials_filter.rb +1 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +15 -4
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +491 -148
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +3 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +9 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +45 -8
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +9 -3
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -3
- data/lib/bundler/vendor/thor/lib/thor/base.rb +27 -4
- data/lib/bundler/vendor/thor/lib/thor/command.rb +9 -7
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +12 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +6 -5
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -4
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -9
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +25 -8
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +1 -0
- data/lib/bundler/vendored_persistent.rb +35 -0
- data/lib/bundler/vendored_thor.rb +1 -0
- data/lib/bundler/version.rb +6 -2
- data/lib/bundler/version_ranges.rb +1 -0
- data/lib/bundler/vlad.rb +5 -0
- data/lib/bundler/worker.rb +1 -0
- data/lib/bundler/yaml_serializer.rb +3 -3
- data/lib/bundler.rb +86 -52
- data/man/bundle-add.1 +18 -3
- data/man/bundle-add.1.txt +26 -14
- data/man/bundle-add.ronn +13 -2
- data/man/bundle-binstubs.1 +11 -1
- data/man/bundle-binstubs.1.txt +33 -18
- data/man/bundle-binstubs.ronn +15 -1
- data/man/bundle-check.1 +4 -4
- data/man/bundle-check.1.txt +15 -14
- data/man/bundle-check.ronn +3 -3
- data/man/bundle-clean.1 +1 -1
- data/man/bundle-clean.1.txt +10 -10
- data/man/bundle-config.1 +129 -29
- data/man/bundle-config.1.txt +285 -174
- data/man/bundle-config.ronn +167 -88
- data/man/bundle-doctor.1 +44 -0
- data/man/bundle-doctor.1.txt +44 -0
- data/man/bundle-doctor.ronn +33 -0
- data/man/bundle-exec.1 +6 -3
- data/man/bundle-exec.1.txt +78 -71
- data/man/bundle-exec.ronn +10 -3
- data/man/bundle-gem.1 +4 -4
- data/man/bundle-gem.1.txt +41 -40
- data/man/bundle-gem.ronn +3 -2
- data/man/bundle-info.1 +1 -1
- data/man/bundle-info.1.txt +8 -8
- data/man/bundle-init.1 +9 -4
- data/man/bundle-init.1.txt +23 -13
- data/man/bundle-init.ronn +15 -4
- data/man/bundle-inject.1 +4 -4
- data/man/bundle-inject.1.txt +10 -10
- data/man/bundle-inject.ronn +3 -3
- data/man/bundle-install.1 +31 -28
- data/man/bundle-install.1.txt +205 -194
- data/man/bundle-install.ronn +44 -35
- data/man/bundle-list.1 +50 -0
- data/man/bundle-list.1.txt +43 -0
- data/man/bundle-list.ronn +33 -0
- data/man/bundle-lock.1 +1 -1
- data/man/bundle-lock.1.txt +47 -47
- data/man/bundle-lock.ronn +1 -1
- data/man/bundle-open.1 +1 -1
- data/man/bundle-open.1.txt +7 -7
- data/man/bundle-outdated.1 +7 -3
- data/man/bundle-outdated.1.txt +40 -36
- data/man/bundle-outdated.ronn +6 -2
- data/man/bundle-package.1 +6 -3
- data/man/bundle-package.1.txt +44 -39
- data/man/bundle-package.ronn +7 -2
- data/man/bundle-platform.1 +1 -1
- data/man/bundle-platform.1.txt +13 -13
- data/man/bundle-pristine.1 +21 -3
- data/man/bundle-pristine.1.txt +33 -10
- data/man/bundle-pristine.ronn +24 -3
- data/man/bundle-remove.1 +31 -0
- data/man/bundle-remove.1.txt +34 -0
- data/man/bundle-remove.ronn +23 -0
- data/man/bundle-show.1 +3 -3
- data/man/bundle-show.1.txt +14 -12
- data/man/bundle-show.ronn +3 -2
- data/man/bundle-update.1 +13 -9
- data/man/bundle-update.1.txt +133 -130
- data/man/bundle-update.ronn +21 -17
- data/man/bundle-viz.1 +7 -7
- data/man/bundle-viz.1.txt +17 -15
- data/man/bundle-viz.ronn +6 -6
- data/man/bundle.1 +31 -32
- data/man/bundle.1.txt +63 -75
- data/man/bundle.ronn +35 -47
- data/man/gemfile.5 +44 -8
- data/man/gemfile.5.ronn +54 -8
- data/man/gemfile.5.txt +218 -165
- data/man/index.txt +25 -15
- metadata +36 -44
- data/.codeclimate.yml +0 -25
- data/.gitignore +0 -18
- data/.rspec +0 -3
- data/.rubocop.yml +0 -131
- data/.rubocop_todo.yml +0 -418
- data/.travis.yml +0 -122
- data/CODE_OF_CONDUCT.md +0 -42
- data/CONTRIBUTING.md +0 -17
- data/Rakefile +0 -346
- data/bin/rake +0 -19
- data/bin/rspec +0 -15
- data/bin/rubocop +0 -17
- data/bin/with_rubygems +0 -39
- data/doc/README.md +0 -30
- data/doc/TROUBLESHOOTING.md +0 -64
- data/doc/contributing/BUG_TRIAGE.md +0 -36
- data/doc/contributing/COMMUNITY.md +0 -13
- data/doc/contributing/GETTING_HELP.md +0 -11
- data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
- data/doc/contributing/ISSUES.md +0 -51
- data/doc/contributing/README.md +0 -38
- data/doc/development/NEW_FEATURES.md +0 -10
- data/doc/development/PULL_REQUESTS.md +0 -40
- data/doc/development/README.md +0 -19
- data/doc/development/RELEASING.md +0 -9
- data/doc/development/SETUP.md +0 -29
- data/doc/documentation/README.md +0 -29
- data/doc/documentation/VISION.md +0 -26
- data/doc/documentation/WRITING.md +0 -54
- data/lib/bundler/postit_trampoline.rb +0 -73
- data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
- data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
- data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
- data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
- data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
- data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
- data/task/release.rake +0 -116
data/lib/bundler/deprecate.rb
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "rubygems/deprecate"
|
5
|
+
rescue LoadError
|
6
|
+
# it's fine if it doesn't exist on the current RubyGems...
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
2
10
|
module Bundler
|
3
|
-
|
11
|
+
# If Bundler::Deprecate is an autoload constant, we need to define it
|
12
|
+
if defined?(Bundler::Deprecate) && !autoload?(:Deprecate)
|
13
|
+
# nothing to do!
|
14
|
+
elsif defined? ::Deprecate
|
4
15
|
Deprecate = ::Deprecate
|
5
16
|
elsif defined? Gem::Deprecate
|
6
17
|
Deprecate = Gem::Deprecate
|
7
18
|
else
|
8
|
-
class Deprecate
|
19
|
+
class Deprecate
|
20
|
+
end
|
9
21
|
end
|
10
22
|
|
11
23
|
unless Deprecate.respond_to?(:skip_during)
|
@@ -20,7 +32,7 @@ module Bundler
|
|
20
32
|
|
21
33
|
unless Deprecate.respond_to?(:skip)
|
22
34
|
def Deprecate.skip
|
23
|
-
@skip
|
35
|
+
@skip ||= false
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
data/lib/bundler/dsl.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "bundler/dependency"
|
3
4
|
require "bundler/ruby_dsl"
|
4
5
|
|
@@ -14,6 +15,9 @@ module Bundler
|
|
14
15
|
|
15
16
|
VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
|
16
17
|
|
18
|
+
VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
|
19
|
+
platform platforms type source install_if gemfile].freeze
|
20
|
+
|
17
21
|
attr_reader :gemspecs
|
18
22
|
attr_accessor :dependencies
|
19
23
|
|
@@ -30,14 +34,16 @@ module Bundler
|
|
30
34
|
@ruby_version = nil
|
31
35
|
@gemspecs = []
|
32
36
|
@gemfile = nil
|
37
|
+
@gemfiles = []
|
33
38
|
add_git_sources
|
34
39
|
end
|
35
40
|
|
36
41
|
def eval_gemfile(gemfile, contents = nil)
|
37
|
-
expanded_gemfile_path = Pathname.new(gemfile).expand_path
|
42
|
+
expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile && @gemfile.parent)
|
38
43
|
original_gemfile = @gemfile
|
39
44
|
@gemfile = expanded_gemfile_path
|
40
|
-
|
45
|
+
@gemfiles << expanded_gemfile_path
|
46
|
+
contents ||= Bundler.read_file(@gemfile.to_s)
|
41
47
|
instance_eval(contents.dup.untaint, gemfile.to_s, 1)
|
42
48
|
rescue Exception => e
|
43
49
|
message = "There was an error " \
|
@@ -87,6 +93,7 @@ module Bundler
|
|
87
93
|
|
88
94
|
def gem(name, *args)
|
89
95
|
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
96
|
+
options["gemfile"] = @gemfile
|
90
97
|
version = args || [">= 0"]
|
91
98
|
|
92
99
|
normalize_options(name, version, options)
|
@@ -95,25 +102,38 @@ module Bundler
|
|
95
102
|
|
96
103
|
# if there's already a dependency with this name we try to prefer one
|
97
104
|
if current = @dependencies.find {|d| d.name == dep.name }
|
105
|
+
deleted_dep = @dependencies.delete(current) if current.type == :development
|
106
|
+
|
98
107
|
if current.requirement != dep.requirement
|
99
|
-
|
100
|
-
@dependencies.delete current
|
101
|
-
else
|
108
|
+
unless deleted_dep
|
102
109
|
return if dep.type == :development
|
110
|
+
|
111
|
+
update_prompt = ""
|
112
|
+
|
113
|
+
if File.basename(@gemfile) == Injector::INJECTED_GEMS
|
114
|
+
if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
|
115
|
+
update_prompt = ". Gem already added"
|
116
|
+
else
|
117
|
+
update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
|
118
|
+
|
119
|
+
update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
103
123
|
raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
|
104
|
-
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
|
124
|
+
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
|
125
|
+
"#{update_prompt}"
|
105
126
|
end
|
106
127
|
|
107
128
|
else
|
108
129
|
Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
|
109
130
|
"You should probably keep only one of them.\n" \
|
131
|
+
"Remove any duplicate entries and specify the gem only once (per group).\n" \
|
110
132
|
"While it's not a problem now, it could cause errors if you change the version of one of them later."
|
111
133
|
end
|
112
134
|
|
113
135
|
if current.source != dep.source
|
114
|
-
|
115
|
-
@dependencies.delete current
|
116
|
-
else
|
136
|
+
unless deleted_dep
|
117
137
|
return if dep.type == :development
|
118
138
|
raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
|
119
139
|
"You specified that #{dep.name} (#{dep.requirement}) should come from " \
|
@@ -128,10 +148,12 @@ module Bundler
|
|
128
148
|
def source(source, *args, &blk)
|
129
149
|
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
130
150
|
options = normalize_hash(options)
|
151
|
+
source = normalize_source(source)
|
152
|
+
|
131
153
|
if options.key?("type")
|
132
154
|
options["type"] = options["type"].to_s
|
133
155
|
unless Plugin.source?(options["type"])
|
134
|
-
raise "No sources available for #{options["type"]}"
|
156
|
+
raise InvalidOption, "No plugin sources available for #{options["type"]}"
|
135
157
|
end
|
136
158
|
|
137
159
|
unless block_given?
|
@@ -141,12 +163,10 @@ module Bundler
|
|
141
163
|
source_opts = options.merge("uri" => source)
|
142
164
|
with_source(@sources.add_plugin_source(options["type"], source_opts), &blk)
|
143
165
|
elsif block_given?
|
144
|
-
source = normalize_source(source)
|
145
166
|
with_source(@sources.add_rubygems_source("remotes" => source), &blk)
|
146
167
|
else
|
147
|
-
source = normalize_source(source)
|
148
168
|
check_primary_source_safety(@sources)
|
149
|
-
@sources.
|
169
|
+
@sources.global_rubygems_source = source
|
150
170
|
end
|
151
171
|
end
|
152
172
|
|
@@ -164,6 +184,19 @@ module Bundler
|
|
164
184
|
end
|
165
185
|
|
166
186
|
def path(path, options = {}, &blk)
|
187
|
+
unless block_given?
|
188
|
+
msg = "You can no longer specify a path source by itself. Instead, \n" \
|
189
|
+
"either use the :path option on a gem, or specify the gems that \n" \
|
190
|
+
"bundler should find in the path source by passing a block to \n" \
|
191
|
+
"the path method, like: \n\n" \
|
192
|
+
" path 'dir/containing/rails' do\n" \
|
193
|
+
" gem 'rails'\n" \
|
194
|
+
" end\n\n"
|
195
|
+
|
196
|
+
raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource?
|
197
|
+
SharedHelpers.major_deprecation(2, msg.strip)
|
198
|
+
end
|
199
|
+
|
167
200
|
source_options = normalize_hash(options).merge(
|
168
201
|
"path" => Pathname.new(path),
|
169
202
|
"root_path" => gemfile_root,
|
@@ -190,6 +223,7 @@ module Bundler
|
|
190
223
|
|
191
224
|
def github(repo, options = {})
|
192
225
|
raise ArgumentError, "GitHub sources require a block" unless block_given?
|
226
|
+
raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
|
193
227
|
github_uri = @git_sources["github"].call(repo)
|
194
228
|
git_options = normalize_hash(options).merge("uri" => github_uri)
|
195
229
|
git_source = @sources.add_git_source(git_options)
|
@@ -197,16 +231,16 @@ module Bundler
|
|
197
231
|
end
|
198
232
|
|
199
233
|
def to_definition(lockfile, unlock)
|
200
|
-
Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups)
|
234
|
+
Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
|
201
235
|
end
|
202
236
|
|
203
237
|
def group(*args, &blk)
|
204
|
-
|
205
|
-
normalize_group_options(
|
238
|
+
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
239
|
+
normalize_group_options(options, args)
|
206
240
|
|
207
241
|
@groups.concat args
|
208
242
|
|
209
|
-
if
|
243
|
+
if options["optional"]
|
210
244
|
optional_groups = args - @optional_groups
|
211
245
|
@optional_groups.concat optional_groups
|
212
246
|
end
|
@@ -216,9 +250,9 @@ module Bundler
|
|
216
250
|
args.each { @groups.pop }
|
217
251
|
end
|
218
252
|
|
219
|
-
def install_if(*args
|
253
|
+
def install_if(*args)
|
220
254
|
@install_conditionals.concat args
|
221
|
-
|
255
|
+
yield
|
222
256
|
ensure
|
223
257
|
args.each { @install_conditionals.pop }
|
224
258
|
end
|
@@ -250,7 +284,12 @@ module Bundler
|
|
250
284
|
private
|
251
285
|
|
252
286
|
def add_git_sources
|
287
|
+
return if Bundler.feature_flag.skip_default_git_sources?
|
288
|
+
|
253
289
|
git_source(:github) do |repo_name|
|
290
|
+
warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
|
291
|
+
"https://github.com/#{repo_name}.git"
|
292
|
+
RUBY
|
254
293
|
# It would be better to use https instead of the git protocol, but this
|
255
294
|
# can break deployment of existing locked bundles when switching between
|
256
295
|
# different versions of Bundler. The change will be made in 2.0, which
|
@@ -266,24 +305,30 @@ module Bundler
|
|
266
305
|
# end
|
267
306
|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
268
307
|
# TODO: 2.0 upgrade this setting to the default
|
269
|
-
if Bundler.
|
308
|
+
if Bundler.feature_flag.github_https?
|
309
|
+
Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
|
270
310
|
"https://github.com/#{repo_name}.git"
|
271
311
|
else
|
272
|
-
warn_github_source_change(repo_name)
|
273
312
|
"git://github.com/#{repo_name}.git"
|
274
313
|
end
|
275
314
|
end
|
276
315
|
|
277
316
|
# TODO: 2.0 remove this deprecated git source
|
278
317
|
git_source(:gist) do |repo_name|
|
279
|
-
warn_deprecated_git_source(:gist, 'https://gist.github.com/#{repo_name}.git')
|
318
|
+
warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"')
|
319
|
+
|
280
320
|
"https://gist.github.com/#{repo_name}.git"
|
281
321
|
end
|
282
322
|
|
283
323
|
# TODO: 2.0 remove this deprecated git source
|
284
324
|
git_source(:bitbucket) do |repo_name|
|
285
|
-
|
286
|
-
|
325
|
+
warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip)
|
326
|
+
user_name, repo_name = repo_name.split("/")
|
327
|
+
repo_name ||= user_name
|
328
|
+
"https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
|
329
|
+
RUBY
|
330
|
+
|
331
|
+
user_name, repo_name = repo_name.split("/")
|
287
332
|
repo_name ||= user_name
|
288
333
|
"https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
|
289
334
|
end
|
@@ -308,7 +353,7 @@ module Bundler
|
|
308
353
|
end
|
309
354
|
|
310
355
|
def valid_keys
|
311
|
-
@valid_keys ||=
|
356
|
+
@valid_keys ||= VALID_KEYS
|
312
357
|
end
|
313
358
|
|
314
359
|
def normalize_options(name, version, opts)
|
@@ -318,6 +363,9 @@ module Bundler
|
|
318
363
|
if name =~ /\s/
|
319
364
|
raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
|
320
365
|
end
|
366
|
+
if name.empty?
|
367
|
+
raise GemfileError, %(an empty gem name is not valid)
|
368
|
+
end
|
321
369
|
|
322
370
|
normalize_hash(opts)
|
323
371
|
|
@@ -355,7 +403,7 @@ module Bundler
|
|
355
403
|
opts["git"] = @git_sources[git_name].call(opts[git_name])
|
356
404
|
end
|
357
405
|
|
358
|
-
%w
|
406
|
+
%w[git path].each do |type|
|
359
407
|
next unless param = opts[type]
|
360
408
|
if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
|
361
409
|
options = opts.merge("name" => name, "version" => $1)
|
@@ -366,8 +414,8 @@ module Bundler
|
|
366
414
|
opts["source"] = source
|
367
415
|
end
|
368
416
|
|
369
|
-
opts["source"]
|
370
|
-
opts["env"]
|
417
|
+
opts["source"] ||= @source
|
418
|
+
opts["env"] ||= @env
|
371
419
|
opts["platforms"] = platforms.dup
|
372
420
|
opts["group"] = groups
|
373
421
|
opts["should_include"] = install_if
|
@@ -377,7 +425,7 @@ module Bundler
|
|
377
425
|
normalize_hash(opts)
|
378
426
|
|
379
427
|
groups = groups.map {|group| ":#{group}" }.join(", ")
|
380
|
-
validate_keys("group #{groups}", opts, %w
|
428
|
+
validate_keys("group #{groups}", opts, %w[optional])
|
381
429
|
|
382
430
|
opts["optional"] ||= false
|
383
431
|
end
|
@@ -390,25 +438,25 @@ module Bundler
|
|
390
438
|
raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch)
|
391
439
|
end
|
392
440
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
441
|
+
return true unless invalid_keys.any?
|
442
|
+
|
443
|
+
message = String.new
|
444
|
+
message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
|
445
|
+
message << if invalid_keys.size > 1
|
446
|
+
"as options for #{command}, but they are invalid."
|
447
|
+
else
|
448
|
+
"as an option for #{command}, but it is invalid."
|
449
|
+
end
|
450
|
+
|
451
|
+
message << " Valid options are: #{valid_keys.join(", ")}."
|
452
|
+
message << " You may be able to resolve this by upgrading Bundler to the newest version."
|
453
|
+
raise InvalidOption, message
|
406
454
|
end
|
407
455
|
|
408
456
|
def normalize_source(source)
|
409
457
|
case source
|
410
458
|
when :gemcutter, :rubygems, :rubyforge
|
411
|
-
Bundler::SharedHelpers.major_deprecation "The source :#{source} is deprecated because HTTP " \
|
459
|
+
Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \
|
412
460
|
"requests are insecure.\nPlease change your source to 'https://" \
|
413
461
|
"rubygems.org' if possible, or 'http://rubygems.org' if not."
|
414
462
|
"http://rubygems.org"
|
@@ -419,17 +467,20 @@ module Bundler
|
|
419
467
|
end
|
420
468
|
end
|
421
469
|
|
422
|
-
def check_primary_source_safety(
|
423
|
-
return
|
470
|
+
def check_primary_source_safety(source_list)
|
471
|
+
return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil?
|
424
472
|
|
425
|
-
|
426
|
-
|
427
|
-
raise GemfileError, "Warning: this Gemfile contains multiple primary sources. " \
|
473
|
+
if Bundler.feature_flag.disable_multisource?
|
474
|
+
msg = "This Gemfile contains multiple primary sources. " \
|
428
475
|
"Each source after the first must include a block to indicate which gems " \
|
429
|
-
"should come from that source
|
430
|
-
|
476
|
+
"should come from that source"
|
477
|
+
unless Bundler.feature_flag.bundler_2_mode?
|
478
|
+
msg += ". To downgrade this error to a warning, run " \
|
479
|
+
"`bundle config --delete disable_multisource`"
|
480
|
+
end
|
481
|
+
raise GemfileEvalError, msg
|
431
482
|
else
|
432
|
-
Bundler::SharedHelpers.major_deprecation "Your Gemfile contains multiple primary sources. " \
|
483
|
+
Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
|
433
484
|
"Using `source` more than once without a block is a security risk, and " \
|
434
485
|
"may result in installing unexpected gems. To resolve this warning, use " \
|
435
486
|
"a block to indicate which gems should come from the secondary source. " \
|
@@ -438,20 +489,20 @@ module Bundler
|
|
438
489
|
end
|
439
490
|
end
|
440
491
|
|
441
|
-
def
|
492
|
+
def warn_deprecated_git_source(name, replacement, additional_message = nil)
|
442
493
|
# TODO: 2.0 remove deprecation
|
443
|
-
|
444
|
-
|
445
|
-
"
|
446
|
-
|
494
|
+
additional_message &&= " #{additional_message}"
|
495
|
+
replacement = if replacement.count("\n").zero?
|
496
|
+
"{|repo_name| #{replacement} }"
|
497
|
+
else
|
498
|
+
"do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end"
|
499
|
+
end
|
500
|
+
|
501
|
+
Bundler::SharedHelpers.major_deprecation 2, <<-EOS
|
502
|
+
The :#{name} git source is deprecated, and will be removed in Bundler 2.0.#{additional_message} Add this code to the top of your Gemfile to ensure it continues to work:
|
503
|
+
|
504
|
+
git_source(:#{name}) #{replacement}
|
447
505
|
|
448
|
-
def warn_deprecated_git_source(name, repo_string)
|
449
|
-
# TODO: 2.0 remove deprecation
|
450
|
-
Bundler::SharedHelpers.major_deprecation <<-EOS
|
451
|
-
The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add this code to your Gemfile to ensure it continues to work:
|
452
|
-
git_source(:#{name}) do |repo_name|
|
453
|
-
"#{repo_string}"
|
454
|
-
end
|
455
506
|
EOS
|
456
507
|
end
|
457
508
|
|
@@ -530,7 +581,7 @@ The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add t
|
|
530
581
|
lines = contents.lines.to_a
|
531
582
|
indent = " # "
|
532
583
|
indicator = indent.tr("#", ">")
|
533
|
-
first_line =
|
584
|
+
first_line = line_numer.zero?
|
534
585
|
last_line = (line_numer == (lines.count - 1))
|
535
586
|
|
536
587
|
m << "\n"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Bundler
|
3
4
|
# used for Creating Specifications from the Gemcutter Endpoint
|
4
5
|
class EndpointSpecification < Gem::Specification
|
@@ -9,11 +10,15 @@ module Bundler
|
|
9
10
|
attr_accessor :source, :remote, :dependencies
|
10
11
|
|
11
12
|
def initialize(name, version, platform, dependencies, metadata = nil)
|
13
|
+
super()
|
12
14
|
@name = name
|
13
15
|
@version = Gem::Version.create version
|
14
16
|
@platform = platform
|
15
17
|
@dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }
|
16
18
|
|
19
|
+
@loaded_from = nil
|
20
|
+
@remote_specification = nil
|
21
|
+
|
17
22
|
parse_metadata(metadata)
|
18
23
|
end
|
19
24
|
|
@@ -71,6 +76,8 @@ module Bundler
|
|
71
76
|
@remote_specification.post_install_message
|
72
77
|
elsif _local_specification
|
73
78
|
_local_specification.post_install_message
|
79
|
+
else
|
80
|
+
super
|
74
81
|
end
|
75
82
|
end
|
76
83
|
|
@@ -80,6 +87,8 @@ module Bundler
|
|
80
87
|
@remote_specification.extensions
|
81
88
|
elsif _local_specification
|
82
89
|
_local_specification.extensions
|
90
|
+
else
|
91
|
+
super
|
83
92
|
end
|
84
93
|
end
|
85
94
|
|
@@ -114,7 +123,7 @@ module Bundler
|
|
114
123
|
@required_ruby_version = Gem::Requirement.new(v)
|
115
124
|
end
|
116
125
|
end
|
117
|
-
rescue => e
|
126
|
+
rescue StandardError => e
|
118
127
|
raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
|
119
128
|
end
|
120
129
|
|
data/lib/bundler/env.rb
CHANGED
@@ -1,33 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "bundler/rubygems_integration"
|
3
4
|
require "bundler/source/git/git_proxy"
|
4
5
|
|
5
6
|
module Bundler
|
6
7
|
class Env
|
7
|
-
def write(io)
|
8
|
+
def self.write(io)
|
8
9
|
io.write report
|
9
10
|
end
|
10
11
|
|
11
|
-
def report(options = {})
|
12
|
+
def self.report(options = {})
|
12
13
|
print_gemfile = options.delete(:print_gemfile) { true }
|
13
14
|
print_gemspecs = options.delete(:print_gemspecs) { true }
|
14
15
|
|
15
|
-
out = String.new
|
16
|
-
|
17
|
-
|
18
|
-
out << "Ruby #{ruby_version}"
|
19
|
-
out << "GEM_HOME #{ENV["GEM_HOME"]}\n" unless ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
|
20
|
-
out << "GEM_PATH #{ENV["GEM_PATH"]}\n" unless ENV["GEM_PATH"] == ENV["GEM_HOME"]
|
21
|
-
out << "RVM #{ENV["rvm_version"]}\n" if ENV["rvm_version"]
|
22
|
-
out << "Git #{git_version}\n"
|
23
|
-
out << "Platform #{Gem::Platform.local}\n"
|
24
|
-
out << "OpenSSL #{OpenSSL::OPENSSL_VERSION}\n" if defined?(OpenSSL::OPENSSL_VERSION)
|
25
|
-
%w(rubygems-bundler open_gem).each do |name|
|
26
|
-
specs = Bundler.rubygems.find_name(name)
|
27
|
-
out << "#{name} (#{specs.map(&:version).join(",")})\n" unless specs.empty?
|
28
|
-
end
|
29
|
-
|
30
|
-
out << "```\n"
|
16
|
+
out = String.new
|
17
|
+
append_formatted_table("Environment", environment, out)
|
18
|
+
append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out)
|
31
19
|
|
32
20
|
unless Bundler.settings.all.empty?
|
33
21
|
out << "\n## Bundler settings\n\n```\n"
|
@@ -43,9 +31,18 @@ module Bundler
|
|
43
31
|
return out unless SharedHelpers.in_bundle?
|
44
32
|
|
45
33
|
if print_gemfile
|
34
|
+
gemfiles = [Bundler.default_gemfile]
|
35
|
+
begin
|
36
|
+
gemfiles = Bundler.definition.gemfiles
|
37
|
+
rescue GemfileNotFound
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
46
41
|
out << "\n## Gemfile\n"
|
47
|
-
|
48
|
-
|
42
|
+
gemfiles.each do |gemfile|
|
43
|
+
out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n"
|
44
|
+
out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n"
|
45
|
+
end
|
49
46
|
|
50
47
|
out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
|
51
48
|
out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
|
@@ -63,32 +60,96 @@ module Bundler
|
|
63
60
|
out
|
64
61
|
end
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
def read_file(filename)
|
69
|
-
File.read(filename.to_s).strip
|
63
|
+
def self.read_file(filename)
|
64
|
+
Bundler.read_file(filename.to_s).strip
|
70
65
|
rescue Errno::ENOENT
|
71
66
|
"<No #{filename} found>"
|
72
|
-
rescue => e
|
67
|
+
rescue RuntimeError => e
|
73
68
|
"#{e.class}: #{e.message}"
|
74
69
|
end
|
75
70
|
|
76
|
-
def ruby_version
|
71
|
+
def self.ruby_version
|
77
72
|
str = String.new("#{RUBY_VERSION}")
|
78
73
|
if RUBY_VERSION < "1.9"
|
79
74
|
str << " (#{RUBY_RELEASE_DATE}"
|
80
75
|
str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
|
81
|
-
str << ") [#{RUBY_PLATFORM}]
|
76
|
+
str << ") [#{RUBY_PLATFORM}]"
|
82
77
|
else
|
83
78
|
str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
|
84
|
-
str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]
|
79
|
+
str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
|
85
80
|
end
|
86
81
|
end
|
87
82
|
|
88
|
-
def git_version
|
83
|
+
def self.git_version
|
89
84
|
Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
|
90
85
|
rescue Bundler::Source::Git::GitNotInstalledError
|
91
86
|
"not installed"
|
92
87
|
end
|
88
|
+
|
89
|
+
def self.version_of(script)
|
90
|
+
return "not installed" unless Bundler.which(script)
|
91
|
+
`#{script} --version`.chomp
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.chruby_version
|
95
|
+
return "not installed" unless Bundler.which("chruby-exec")
|
96
|
+
`chruby-exec -- chruby --version`.
|
97
|
+
sub(/.*^chruby: (#{Gem::Version::VERSION_PATTERN}).*/m, '\1')
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.environment
|
101
|
+
out = []
|
102
|
+
|
103
|
+
out << ["Bundler", Bundler::VERSION]
|
104
|
+
out << [" Platforms", Gem.platforms.join(", ")]
|
105
|
+
out << ["Ruby", ruby_version]
|
106
|
+
out << [" Full Path", Gem.ruby]
|
107
|
+
out << [" Config Dir", Pathname.new(Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE).dirname]
|
108
|
+
out << ["RubyGems", Gem::VERSION]
|
109
|
+
out << [" Gem Home", ENV.fetch("GEM_HOME") { Gem.dir }]
|
110
|
+
out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }]
|
111
|
+
out << [" User Path", Gem.user_dir]
|
112
|
+
out << [" Bin Dir", Gem.bindir]
|
113
|
+
if defined?(OpenSSL)
|
114
|
+
out << ["OpenSSL"]
|
115
|
+
out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
|
116
|
+
out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
|
117
|
+
out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
|
118
|
+
out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
|
119
|
+
end
|
120
|
+
out << ["Tools"]
|
121
|
+
out << [" Git", git_version]
|
122
|
+
out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
|
123
|
+
out << [" rbenv", version_of("rbenv")]
|
124
|
+
out << [" chruby", chruby_version]
|
125
|
+
|
126
|
+
%w[rubygems-bundler open_gem].each do |name|
|
127
|
+
specs = Bundler.rubygems.find_name(name)
|
128
|
+
out << [" #{name}", "(#{specs.map(&:version).join(",")})"] unless specs.empty?
|
129
|
+
end
|
130
|
+
if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z}
|
131
|
+
shebang = File.read(exe).lines.first
|
132
|
+
shebang.sub!(/^#!\s*/, "")
|
133
|
+
unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby")
|
134
|
+
out << ["Gem.ruby", Gem.ruby]
|
135
|
+
out << ["bundle #!", shebang]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
out
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.append_formatted_table(title, pairs, out)
|
143
|
+
return if pairs.empty?
|
144
|
+
out << "\n" unless out.empty?
|
145
|
+
out << "## #{title}\n\n```\n"
|
146
|
+
ljust = pairs.map {|k, _v| k.to_s.length }.max
|
147
|
+
pairs.each do |k, v|
|
148
|
+
out << "#{k.to_s.ljust(ljust)} #{v}\n"
|
149
|
+
end
|
150
|
+
out << "```\n"
|
151
|
+
end
|
152
|
+
|
153
|
+
private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table, :version_of, :chruby_version
|
93
154
|
end
|
94
155
|
end
|