bundler 2.0.2
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 +7 -0
- data/CHANGELOG.md +3111 -0
- data/LICENSE.md +23 -0
- data/README.md +63 -0
- data/bundler.gemspec +65 -0
- data/exe/bundle +31 -0
- data/exe/bundle_ruby +60 -0
- data/exe/bundler +4 -0
- data/lib/bundler.rb +567 -0
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +22 -0
- data/lib/bundler/cli.rb +792 -0
- data/lib/bundler/cli/add.rb +35 -0
- data/lib/bundler/cli/binstubs.rb +49 -0
- data/lib/bundler/cli/cache.rb +36 -0
- data/lib/bundler/cli/check.rb +38 -0
- data/lib/bundler/cli/clean.rb +25 -0
- data/lib/bundler/cli/common.rb +102 -0
- data/lib/bundler/cli/config.rb +119 -0
- data/lib/bundler/cli/console.rb +43 -0
- data/lib/bundler/cli/doctor.rb +140 -0
- data/lib/bundler/cli/exec.rb +105 -0
- data/lib/bundler/cli/gem.rb +252 -0
- data/lib/bundler/cli/info.rb +50 -0
- data/lib/bundler/cli/init.rb +47 -0
- data/lib/bundler/cli/inject.rb +60 -0
- data/lib/bundler/cli/install.rb +218 -0
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +63 -0
- data/lib/bundler/cli/open.rb +26 -0
- data/lib/bundler/cli/outdated.rb +266 -0
- data/lib/bundler/cli/package.rb +49 -0
- data/lib/bundler/cli/platform.rb +46 -0
- data/lib/bundler/cli/plugin.rb +24 -0
- data/lib/bundler/cli/pristine.rb +47 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +75 -0
- data/lib/bundler/cli/update.rb +91 -0
- data/lib/bundler/cli/viz.rb +31 -0
- data/lib/bundler/compact_index_client.rb +109 -0
- data/lib/bundler/compact_index_client/cache.rb +118 -0
- data/lib/bundler/compact_index_client/updater.rb +116 -0
- data/lib/bundler/compatibility_guard.rb +13 -0
- data/lib/bundler/constants.rb +7 -0
- data/lib/bundler/current_ruby.rb +94 -0
- data/lib/bundler/definition.rb +995 -0
- data/lib/bundler/dep_proxy.rb +48 -0
- data/lib/bundler/dependency.rb +139 -0
- data/lib/bundler/deployment.rb +69 -0
- data/lib/bundler/deprecate.rb +44 -0
- data/lib/bundler/dsl.rb +615 -0
- data/lib/bundler/endpoint_specification.rb +141 -0
- data/lib/bundler/env.rb +149 -0
- data/lib/bundler/environment_preserver.rb +59 -0
- data/lib/bundler/errors.rb +158 -0
- data/lib/bundler/feature_flag.rb +75 -0
- data/lib/bundler/fetcher.rb +312 -0
- data/lib/bundler/fetcher/base.rb +52 -0
- data/lib/bundler/fetcher/compact_index.rb +126 -0
- data/lib/bundler/fetcher/dependency.rb +82 -0
- data/lib/bundler/fetcher/downloader.rb +84 -0
- data/lib/bundler/fetcher/index.rb +52 -0
- data/lib/bundler/friendly_errors.rb +131 -0
- data/lib/bundler/gem_helper.rb +217 -0
- data/lib/bundler/gem_helpers.rb +101 -0
- data/lib/bundler/gem_remote_fetcher.rb +43 -0
- data/lib/bundler/gem_tasks.rb +7 -0
- data/lib/bundler/gem_version_promoter.rb +190 -0
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +152 -0
- data/lib/bundler/index.rb +213 -0
- data/lib/bundler/injector.rb +253 -0
- data/lib/bundler/inline.rb +74 -0
- data/lib/bundler/installer.rb +318 -0
- data/lib/bundler/installer/gem_installer.rb +85 -0
- data/lib/bundler/installer/parallel_installer.rb +229 -0
- data/lib/bundler/installer/standalone.rb +53 -0
- data/lib/bundler/lazy_specification.rb +123 -0
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +256 -0
- data/lib/bundler/match_platform.rb +24 -0
- data/lib/bundler/mirror.rb +223 -0
- data/lib/bundler/plugin.rb +294 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/api/source.rb +306 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +165 -0
- data/lib/bundler/plugin/installer.rb +96 -0
- data/lib/bundler/plugin/installer/git.rb +38 -0
- data/lib/bundler/plugin/installer/rubygems.rb +27 -0
- data/lib/bundler/plugin/source_list.rb +27 -0
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +37 -0
- data/lib/bundler/remote_specification.rb +114 -0
- data/lib/bundler/resolver.rb +373 -0
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/retry.rb +66 -0
- data/lib/bundler/ruby_dsl.rb +18 -0
- data/lib/bundler/ruby_version.rb +152 -0
- data/lib/bundler/rubygems_ext.rb +209 -0
- data/lib/bundler/rubygems_gem_installer.rb +99 -0
- data/lib/bundler/rubygems_integration.rb +915 -0
- data/lib/bundler/runtime.rb +322 -0
- data/lib/bundler/settings.rb +464 -0
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +28 -0
- data/lib/bundler/shared_helpers.rb +386 -0
- data/lib/bundler/similarity_detector.rb +63 -0
- data/lib/bundler/source.rb +94 -0
- data/lib/bundler/source/gemspec.rb +18 -0
- data/lib/bundler/source/git.rb +329 -0
- data/lib/bundler/source/git/git_proxy.rb +262 -0
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path.rb +249 -0
- data/lib/bundler/source/path/installer.rb +74 -0
- data/lib/bundler/source/rubygems.rb +539 -0
- data/lib/bundler/source/rubygems/remote.rb +69 -0
- data/lib/bundler/source_list.rb +186 -0
- data/lib/bundler/spec_set.rb +208 -0
- data/lib/bundler/ssl_certs/.document +1 -0
- data/lib/bundler/ssl_certs/certificate_manager.rb +66 -0
- data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
- data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
- data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
- data/lib/bundler/stub_specification.rb +108 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +29 -0
- data/lib/bundler/templates/Executable.bundler +105 -0
- data/lib/bundler/templates/Executable.standalone +14 -0
- data/lib/bundler/templates/Gemfile +7 -0
- data/lib/bundler/templates/gems.rb +8 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +74 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/lib/bundler/templates/newgem/README.md.tt +47 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +29 -0
- data/lib/bundler/templates/newgem/bin/console.tt +14 -0
- data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/lib/bundler/templates/newgem/gitignore.tt +20 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +13 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +50 -0
- data/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +9 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -0
- data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +11 -0
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +8 -0
- data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
- data/lib/bundler/ui.rb +9 -0
- data/lib/bundler/ui/rg_proxy.rb +19 -0
- data/lib/bundler/ui/shell.rb +146 -0
- data/lib/bundler/ui/silent.rb +69 -0
- data/lib/bundler/uri_credentials_filter.rb +37 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1741 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +101 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +67 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +27 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1233 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +509 -0
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +331 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +104 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +60 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +118 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/bundler/vendor/thor/lib/thor/base.rb +678 -0
- data/lib/bundler/vendor/thor/lib/thor/command.rb +135 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +114 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +177 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +70 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +175 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +146 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +226 -0
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +71 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +324 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +482 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +149 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +126 -0
- data/lib/bundler/vendor/thor/lib/thor/util.rb +268 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +4 -0
- data/lib/bundler/vendored_persistent.rb +52 -0
- data/lib/bundler/vendored_thor.rb +8 -0
- data/lib/bundler/version.rb +28 -0
- data/lib/bundler/version_ranges.rb +76 -0
- data/lib/bundler/vlad.rb +17 -0
- data/lib/bundler/worker.rb +106 -0
- data/lib/bundler/yaml_serializer.rb +90 -0
- data/man/bundle-add.1 +58 -0
- data/man/bundle-add.1.txt +52 -0
- data/man/bundle-add.ronn +40 -0
- data/man/bundle-binstubs.1 +40 -0
- data/man/bundle-binstubs.1.txt +48 -0
- data/man/bundle-binstubs.ronn +43 -0
- data/man/bundle-check.1 +31 -0
- data/man/bundle-check.1.txt +33 -0
- data/man/bundle-check.ronn +26 -0
- data/man/bundle-clean.1 +24 -0
- data/man/bundle-clean.1.txt +26 -0
- data/man/bundle-clean.ronn +18 -0
- data/man/bundle-config.1 +497 -0
- data/man/bundle-config.1.txt +529 -0
- data/man/bundle-config.ronn +397 -0
- 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 +165 -0
- data/man/bundle-exec.1.txt +178 -0
- data/man/bundle-exec.ronn +152 -0
- data/man/bundle-gem.1 +80 -0
- data/man/bundle-gem.1.txt +91 -0
- data/man/bundle-gem.ronn +78 -0
- data/man/bundle-info.1 +20 -0
- data/man/bundle-info.1.txt +21 -0
- data/man/bundle-info.ronn +17 -0
- data/man/bundle-init.1 +25 -0
- data/man/bundle-init.1.txt +34 -0
- data/man/bundle-init.ronn +29 -0
- data/man/bundle-inject.1 +33 -0
- data/man/bundle-inject.1.txt +32 -0
- data/man/bundle-inject.ronn +22 -0
- data/man/bundle-install.1 +308 -0
- data/man/bundle-install.1.txt +396 -0
- data/man/bundle-install.ronn +378 -0
- 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 +84 -0
- data/man/bundle-lock.1.txt +93 -0
- data/man/bundle-lock.ronn +94 -0
- data/man/bundle-open.1 +32 -0
- data/man/bundle-open.1.txt +29 -0
- data/man/bundle-open.ronn +19 -0
- data/man/bundle-outdated.1 +155 -0
- data/man/bundle-outdated.1.txt +131 -0
- data/man/bundle-outdated.ronn +111 -0
- data/man/bundle-package.1 +55 -0
- data/man/bundle-package.1.txt +79 -0
- data/man/bundle-package.ronn +72 -0
- data/man/bundle-platform.1 +61 -0
- data/man/bundle-platform.1.txt +57 -0
- data/man/bundle-platform.ronn +42 -0
- data/man/bundle-pristine.1 +34 -0
- data/man/bundle-pristine.1.txt +44 -0
- data/man/bundle-pristine.ronn +34 -0
- 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 +23 -0
- data/man/bundle-show.1.txt +27 -0
- data/man/bundle-show.ronn +21 -0
- data/man/bundle-update.1 +394 -0
- data/man/bundle-update.1.txt +391 -0
- data/man/bundle-update.ronn +350 -0
- data/man/bundle-viz.1 +39 -0
- data/man/bundle-viz.1.txt +39 -0
- data/man/bundle-viz.ronn +30 -0
- data/man/bundle.1 +136 -0
- data/man/bundle.1.txt +116 -0
- data/man/bundle.ronn +111 -0
- data/man/gemfile.5 +689 -0
- data/man/gemfile.5.ronn +521 -0
- data/man/gemfile.5.txt +653 -0
- data/man/index.txt +25 -0
- metadata +463 -0
@@ -0,0 +1,262 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "shellwords"
|
4
|
+
require "tempfile"
|
5
|
+
module Bundler
|
6
|
+
class Source
|
7
|
+
class Git
|
8
|
+
class GitNotInstalledError < GitError
|
9
|
+
def initialize
|
10
|
+
msg = String.new
|
11
|
+
msg << "You need to install git to be able to use gems from git repositories. "
|
12
|
+
msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git"
|
13
|
+
super msg
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class GitNotAllowedError < GitError
|
18
|
+
def initialize(command)
|
19
|
+
msg = String.new
|
20
|
+
msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, "
|
21
|
+
msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues "
|
22
|
+
msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
|
23
|
+
super msg
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class GitCommandError < GitError
|
28
|
+
def initialize(command, path = nil, extra_info = nil)
|
29
|
+
msg = String.new
|
30
|
+
msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed."
|
31
|
+
msg << "\n#{extra_info}" if extra_info
|
32
|
+
msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist?
|
33
|
+
super msg
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class MissingGitRevisionError < GitError
|
38
|
+
def initialize(ref, repo)
|
39
|
+
msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
|
40
|
+
super msg
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# The GitProxy is responsible to interact with git repositories.
|
45
|
+
# All actions required by the Git source is encapsulated in this
|
46
|
+
# object.
|
47
|
+
class GitProxy
|
48
|
+
attr_accessor :path, :uri, :ref
|
49
|
+
attr_writer :revision
|
50
|
+
|
51
|
+
def initialize(path, uri, ref, revision = nil, git = nil)
|
52
|
+
@path = path
|
53
|
+
@uri = uri
|
54
|
+
@ref = ref
|
55
|
+
@revision = revision
|
56
|
+
@git = git
|
57
|
+
raise GitNotInstalledError.new if allow? && !Bundler.git_present?
|
58
|
+
end
|
59
|
+
|
60
|
+
def revision
|
61
|
+
return @revision if @revision
|
62
|
+
|
63
|
+
begin
|
64
|
+
@revision ||= find_local_revision
|
65
|
+
rescue GitCommandError
|
66
|
+
raise MissingGitRevisionError.new(ref, URICredentialsFilter.credential_filtered_uri(uri))
|
67
|
+
end
|
68
|
+
|
69
|
+
@revision
|
70
|
+
end
|
71
|
+
|
72
|
+
def branch
|
73
|
+
@branch ||= allowed_in_path do
|
74
|
+
git("rev-parse --abbrev-ref HEAD").strip
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def contains?(commit)
|
79
|
+
allowed_in_path do
|
80
|
+
result = git_null("branch --contains #{commit}")
|
81
|
+
$? == 0 && result =~ /^\* (.*)$/
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def version
|
86
|
+
git("--version").match(/(git version\s*)?((\.?\d+)+).*/)[2]
|
87
|
+
end
|
88
|
+
|
89
|
+
def full_version
|
90
|
+
git("--version").sub("git version", "").strip
|
91
|
+
end
|
92
|
+
|
93
|
+
def checkout
|
94
|
+
return if path.exist? && has_revision_cached?
|
95
|
+
extra_ref = "#{Shellwords.shellescape(ref)}:#{Shellwords.shellescape(ref)}" if ref && ref.start_with?("refs/")
|
96
|
+
|
97
|
+
Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}"
|
98
|
+
|
99
|
+
unless path.exist?
|
100
|
+
SharedHelpers.filesystem_access(path.dirname) do |p|
|
101
|
+
FileUtils.mkdir_p(p)
|
102
|
+
end
|
103
|
+
git_retry %(clone #{uri_escaped_with_configured_credentials} "#{path}" --bare --no-hardlinks --quiet)
|
104
|
+
return unless extra_ref
|
105
|
+
end
|
106
|
+
|
107
|
+
in_path do
|
108
|
+
git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref})
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def copy_to(destination, submodules = false)
|
113
|
+
# method 1
|
114
|
+
unless File.exist?(destination.join(".git"))
|
115
|
+
begin
|
116
|
+
SharedHelpers.filesystem_access(destination.dirname) do |p|
|
117
|
+
FileUtils.mkdir_p(p)
|
118
|
+
end
|
119
|
+
SharedHelpers.filesystem_access(destination) do |p|
|
120
|
+
FileUtils.rm_rf(p)
|
121
|
+
end
|
122
|
+
git_retry %(clone --no-checkout --quiet "#{path}" "#{destination}")
|
123
|
+
File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
|
124
|
+
rescue Errno::EEXIST => e
|
125
|
+
file_path = e.message[%r{.*?(/.*)}, 1]
|
126
|
+
raise GitError, "Bundler could not install a gem because it needs to " \
|
127
|
+
"create a directory, but a file exists - #{file_path}. Please delete " \
|
128
|
+
"this file and try again."
|
129
|
+
end
|
130
|
+
end
|
131
|
+
# method 2
|
132
|
+
SharedHelpers.chdir(destination) do
|
133
|
+
git_retry %(fetch --force --quiet --tags "#{path}")
|
134
|
+
|
135
|
+
begin
|
136
|
+
git "reset --hard #{@revision}"
|
137
|
+
rescue GitCommandError
|
138
|
+
raise MissingGitRevisionError.new(@revision, URICredentialsFilter.credential_filtered_uri(uri))
|
139
|
+
end
|
140
|
+
|
141
|
+
if submodules
|
142
|
+
git_retry "submodule update --init --recursive"
|
143
|
+
elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
|
144
|
+
git_retry "submodule deinit --all --force"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
# TODO: Do not rely on /dev/null.
|
152
|
+
# Given that open3 is not cross platform until Ruby 1.9.3,
|
153
|
+
# the best solution is to pipe to /dev/null if it exists.
|
154
|
+
# If it doesn't, everything will work fine, but the user
|
155
|
+
# will get the $stderr messages as well.
|
156
|
+
def git_null(command)
|
157
|
+
git("#{command} 2>#{Bundler::NULL}", false)
|
158
|
+
end
|
159
|
+
|
160
|
+
def git_retry(command)
|
161
|
+
Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do
|
162
|
+
git(command)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def git(command, check_errors = true, error_msg = nil)
|
167
|
+
command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
|
168
|
+
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
169
|
+
|
170
|
+
out = SharedHelpers.with_clean_git_env do
|
171
|
+
capture_and_filter_stderr(uri) { `git #{command}` }
|
172
|
+
end
|
173
|
+
|
174
|
+
stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri)
|
175
|
+
raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success?
|
176
|
+
stdout_with_no_credentials
|
177
|
+
end
|
178
|
+
|
179
|
+
def has_revision_cached?
|
180
|
+
return unless @revision
|
181
|
+
in_path { git("cat-file -e #{@revision}") }
|
182
|
+
true
|
183
|
+
rescue GitError
|
184
|
+
false
|
185
|
+
end
|
186
|
+
|
187
|
+
def remove_cache
|
188
|
+
FileUtils.rm_rf(path)
|
189
|
+
end
|
190
|
+
|
191
|
+
def find_local_revision
|
192
|
+
allowed_in_path do
|
193
|
+
git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# Escape the URI for git commands
|
198
|
+
def uri_escaped_with_configured_credentials
|
199
|
+
remote = configured_uri_for(uri)
|
200
|
+
if Bundler::WINDOWS
|
201
|
+
# Windows quoting requires double quotes only, with double quotes
|
202
|
+
# inside the string escaped by being doubled.
|
203
|
+
'"' + remote.gsub('"') { '""' } + '"'
|
204
|
+
else
|
205
|
+
# Bash requires single quoted strings, with the single quotes escaped
|
206
|
+
# by ending the string, escaping the quote, and restarting the string.
|
207
|
+
"'" + remote.gsub("'") { "'\\''" } + "'"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Adds credentials to the URI as Fetcher#configured_uri_for does
|
212
|
+
def configured_uri_for(uri)
|
213
|
+
if /https?:/ =~ uri
|
214
|
+
remote = URI(uri)
|
215
|
+
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
216
|
+
remote.userinfo ||= config_auth
|
217
|
+
remote.to_s
|
218
|
+
else
|
219
|
+
uri
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def allow?
|
224
|
+
@git ? @git.allow_git_ops? : true
|
225
|
+
end
|
226
|
+
|
227
|
+
def in_path(&blk)
|
228
|
+
checkout unless path.exist?
|
229
|
+
_ = URICredentialsFilter # load it before we chdir
|
230
|
+
SharedHelpers.chdir(path, &blk)
|
231
|
+
end
|
232
|
+
|
233
|
+
def allowed_in_path
|
234
|
+
return in_path { yield } if allow?
|
235
|
+
raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
|
236
|
+
end
|
237
|
+
|
238
|
+
# TODO: Replace this with Open3 when upgrading to bundler 2
|
239
|
+
# Similar to #git_null, as Open3 is not cross-platform,
|
240
|
+
# a temporary way is to use Tempfile to capture the stderr.
|
241
|
+
# When replacing this using Open3, make sure git_null is
|
242
|
+
# also replaced by Open3, so stdout and stderr all got handled properly.
|
243
|
+
def capture_and_filter_stderr(uri)
|
244
|
+
return_value, captured_err = ""
|
245
|
+
backup_stderr = STDERR.dup
|
246
|
+
begin
|
247
|
+
Tempfile.open("captured_stderr") do |f|
|
248
|
+
STDERR.reopen(f)
|
249
|
+
return_value = yield
|
250
|
+
f.rewind
|
251
|
+
captured_err = f.read
|
252
|
+
end
|
253
|
+
ensure
|
254
|
+
STDERR.reopen backup_stderr
|
255
|
+
end
|
256
|
+
$stderr.puts URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
|
257
|
+
return_value
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class Source
|
5
|
+
class Metadata < Source
|
6
|
+
def specs
|
7
|
+
@specs ||= Index.build do |idx|
|
8
|
+
idx << Gem::Specification.new("ruby\0", RubyVersion.system.to_gem_version_with_patchlevel)
|
9
|
+
idx << Gem::Specification.new("rubygems\0", Gem::VERSION)
|
10
|
+
|
11
|
+
idx << Gem::Specification.new do |s|
|
12
|
+
s.name = "bundler"
|
13
|
+
s.version = VERSION
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
s.source = self
|
16
|
+
s.authors = ["bundler team"]
|
17
|
+
s.bindir = "exe"
|
18
|
+
s.executables = %w[bundle]
|
19
|
+
# can't point to the actual gemspec or else the require paths will be wrong
|
20
|
+
s.loaded_from = File.expand_path("..", __FILE__)
|
21
|
+
end
|
22
|
+
|
23
|
+
if local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION }
|
24
|
+
idx << local_spec
|
25
|
+
end
|
26
|
+
|
27
|
+
idx.each {|s| s.source = self }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def cached!; end
|
32
|
+
|
33
|
+
def remote!; end
|
34
|
+
|
35
|
+
def options
|
36
|
+
{}
|
37
|
+
end
|
38
|
+
|
39
|
+
def install(spec, _opts = {})
|
40
|
+
print_using_message "Using #{version_message(spec)}"
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
"the local ruby installation"
|
46
|
+
end
|
47
|
+
|
48
|
+
def ==(other)
|
49
|
+
self.class == other.class
|
50
|
+
end
|
51
|
+
alias_method :eql?, :==
|
52
|
+
|
53
|
+
def hash
|
54
|
+
self.class.hash
|
55
|
+
end
|
56
|
+
|
57
|
+
def version_message(spec)
|
58
|
+
"#{spec.name} #{spec.version}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,249 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class Source
|
5
|
+
class Path < Source
|
6
|
+
autoload :Installer, "bundler/source/path/installer"
|
7
|
+
|
8
|
+
attr_reader :path, :options, :root_path, :original_path
|
9
|
+
attr_writer :name
|
10
|
+
attr_accessor :version
|
11
|
+
|
12
|
+
protected :original_path
|
13
|
+
|
14
|
+
DEFAULT_GLOB = "{,*,*/*}.gemspec".freeze
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
@options = options.dup
|
18
|
+
@glob = options["glob"] || DEFAULT_GLOB
|
19
|
+
|
20
|
+
@allow_cached = false
|
21
|
+
@allow_remote = false
|
22
|
+
|
23
|
+
@root_path = options["root_path"] || Bundler.root
|
24
|
+
|
25
|
+
if options["path"]
|
26
|
+
@path = Pathname.new(options["path"])
|
27
|
+
@path = expand(@path) unless @path.relative?
|
28
|
+
end
|
29
|
+
|
30
|
+
@name = options["name"]
|
31
|
+
@version = options["version"]
|
32
|
+
|
33
|
+
# Stores the original path. If at any point we move to the
|
34
|
+
# cached directory, we still have the original path to copy from.
|
35
|
+
@original_path = @path
|
36
|
+
end
|
37
|
+
|
38
|
+
def remote!
|
39
|
+
@local_specs = nil
|
40
|
+
@allow_remote = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def cached!
|
44
|
+
@local_specs = nil
|
45
|
+
@allow_cached = true
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.from_lock(options)
|
49
|
+
new(options.merge("path" => options.delete("remote")))
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_lock
|
53
|
+
out = String.new("PATH\n")
|
54
|
+
out << " remote: #{lockfile_path}\n"
|
55
|
+
out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
|
56
|
+
out << " specs:\n"
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
"source at `#{@path}`"
|
61
|
+
end
|
62
|
+
|
63
|
+
def hash
|
64
|
+
[self.class, expanded_path, version].hash
|
65
|
+
end
|
66
|
+
|
67
|
+
def eql?(other)
|
68
|
+
return unless other.class == self.class
|
69
|
+
expanded_original_path == other.expanded_original_path &&
|
70
|
+
version == other.version
|
71
|
+
end
|
72
|
+
|
73
|
+
alias_method :==, :eql?
|
74
|
+
|
75
|
+
def name
|
76
|
+
File.basename(expanded_path.to_s)
|
77
|
+
end
|
78
|
+
|
79
|
+
def install(spec, options = {})
|
80
|
+
print_using_message "Using #{version_message(spec)} from #{self}"
|
81
|
+
generate_bin(spec, :disable_extensions => true)
|
82
|
+
nil # no post-install message
|
83
|
+
end
|
84
|
+
|
85
|
+
def cache(spec, custom_path = nil)
|
86
|
+
app_cache_path = app_cache_path(custom_path)
|
87
|
+
return unless Bundler.feature_flag.cache_all?
|
88
|
+
return if expand(@original_path).to_s.index(root_path.to_s + "/") == 0
|
89
|
+
|
90
|
+
unless @original_path.exist?
|
91
|
+
raise GemNotFound, "Can't cache gem #{version_message(spec)} because #{self} is missing!"
|
92
|
+
end
|
93
|
+
|
94
|
+
FileUtils.rm_rf(app_cache_path)
|
95
|
+
FileUtils.cp_r("#{@original_path}/.", app_cache_path)
|
96
|
+
FileUtils.touch(app_cache_path.join(".bundlecache"))
|
97
|
+
end
|
98
|
+
|
99
|
+
def local_specs(*)
|
100
|
+
@local_specs ||= load_spec_files
|
101
|
+
end
|
102
|
+
|
103
|
+
def specs
|
104
|
+
if has_app_cache?
|
105
|
+
@path = app_cache_path
|
106
|
+
@expanded_path = nil # Invalidate
|
107
|
+
end
|
108
|
+
local_specs
|
109
|
+
end
|
110
|
+
|
111
|
+
def app_cache_dirname
|
112
|
+
name
|
113
|
+
end
|
114
|
+
|
115
|
+
def root
|
116
|
+
Bundler.root
|
117
|
+
end
|
118
|
+
|
119
|
+
def expanded_original_path
|
120
|
+
@expanded_original_path ||= expand(original_path)
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def expanded_path
|
126
|
+
@expanded_path ||= expand(path)
|
127
|
+
end
|
128
|
+
|
129
|
+
def expand(somepath)
|
130
|
+
somepath.expand_path(root_path)
|
131
|
+
rescue ArgumentError => e
|
132
|
+
Bundler.ui.debug(e)
|
133
|
+
raise PathError, "There was an error while trying to use the path " \
|
134
|
+
"`#{somepath}`.\nThe error message was: #{e.message}."
|
135
|
+
end
|
136
|
+
|
137
|
+
def lockfile_path
|
138
|
+
return relative_path(original_path) if original_path.absolute?
|
139
|
+
expand(original_path).relative_path_from(Bundler.root)
|
140
|
+
end
|
141
|
+
|
142
|
+
def app_cache_path(custom_path = nil)
|
143
|
+
@app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname)
|
144
|
+
end
|
145
|
+
|
146
|
+
def has_app_cache?
|
147
|
+
SharedHelpers.in_bundle? && app_cache_path.exist?
|
148
|
+
end
|
149
|
+
|
150
|
+
def load_gemspec(file)
|
151
|
+
return unless spec = Bundler.load_gemspec(file)
|
152
|
+
Bundler.rubygems.set_installed_by_version(spec)
|
153
|
+
spec
|
154
|
+
end
|
155
|
+
|
156
|
+
def validate_spec(spec)
|
157
|
+
Bundler.rubygems.validate(spec)
|
158
|
+
end
|
159
|
+
|
160
|
+
def load_spec_files
|
161
|
+
index = Index.new
|
162
|
+
|
163
|
+
if File.directory?(expanded_path)
|
164
|
+
# We sort depth-first since `<<` will override the earlier-found specs
|
165
|
+
Dir["#{expanded_path}/#{@glob}"].sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file|
|
166
|
+
next unless spec = load_gemspec(file)
|
167
|
+
spec.source = self
|
168
|
+
|
169
|
+
# Validation causes extension_dir to be calculated, which depends
|
170
|
+
# on #source, so we validate here instead of load_gemspec
|
171
|
+
validate_spec(spec)
|
172
|
+
index << spec
|
173
|
+
end
|
174
|
+
|
175
|
+
if index.empty? && @name && @version
|
176
|
+
index << Gem::Specification.new do |s|
|
177
|
+
s.name = @name
|
178
|
+
s.source = self
|
179
|
+
s.version = Gem::Version.new(@version)
|
180
|
+
s.platform = Gem::Platform::RUBY
|
181
|
+
s.summary = "Fake gemspec for #{@name}"
|
182
|
+
s.relative_loaded_from = "#{@name}.gemspec"
|
183
|
+
s.authors = ["no one"]
|
184
|
+
if expanded_path.join("bin").exist?
|
185
|
+
executables = expanded_path.join("bin").children
|
186
|
+
executables.reject! {|p| File.directory?(p) }
|
187
|
+
s.executables = executables.map {|c| c.basename.to_s }
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
else
|
192
|
+
message = String.new("The path `#{expanded_path}` ")
|
193
|
+
message << if File.exist?(expanded_path)
|
194
|
+
"is not a directory."
|
195
|
+
else
|
196
|
+
"does not exist."
|
197
|
+
end
|
198
|
+
raise PathError, message
|
199
|
+
end
|
200
|
+
|
201
|
+
index
|
202
|
+
end
|
203
|
+
|
204
|
+
def relative_path(path = self.path)
|
205
|
+
if path.to_s.start_with?(root_path.to_s)
|
206
|
+
return path.relative_path_from(root_path)
|
207
|
+
end
|
208
|
+
path
|
209
|
+
end
|
210
|
+
|
211
|
+
def generate_bin(spec, options = {})
|
212
|
+
gem_dir = Pathname.new(spec.full_gem_path)
|
213
|
+
|
214
|
+
# Some gem authors put absolute paths in their gemspec
|
215
|
+
# and we have to save them from themselves
|
216
|
+
spec.files = spec.files.map do |p|
|
217
|
+
next p unless p =~ /\A#{Pathname::SEPARATOR_PAT}/
|
218
|
+
next if File.directory?(p)
|
219
|
+
begin
|
220
|
+
Pathname.new(p).relative_path_from(gem_dir).to_s
|
221
|
+
rescue ArgumentError
|
222
|
+
p
|
223
|
+
end
|
224
|
+
end.compact
|
225
|
+
|
226
|
+
installer = Path::Installer.new(
|
227
|
+
spec,
|
228
|
+
:env_shebang => false,
|
229
|
+
:disable_extensions => options[:disable_extensions],
|
230
|
+
:build_args => options[:build_args],
|
231
|
+
:bundler_extension_cache_path => extension_cache_path(spec)
|
232
|
+
)
|
233
|
+
installer.post_install
|
234
|
+
rescue Gem::InvalidSpecificationException => e
|
235
|
+
Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
|
236
|
+
"This prevents bundler from installing bins or native extensions, but " \
|
237
|
+
"that may not affect its functionality."
|
238
|
+
|
239
|
+
if !spec.extensions.empty? && !spec.email.empty?
|
240
|
+
Bundler.ui.warn "If you need to use this package without installing it from a gem " \
|
241
|
+
"repository, please contact #{spec.email} and ask them " \
|
242
|
+
"to modify their .gemspec so it can work with `gem build`."
|
243
|
+
end
|
244
|
+
|
245
|
+
Bundler.ui.warn "The validation message from RubyGems was:\n #{e.message}"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|