diff options
Diffstat (limited to 'lib/bundler/source')
-rw-r--r-- | lib/bundler/source/git.rb | 8 | ||||
-rw-r--r-- | lib/bundler/source/git/git_proxy.rb | 111 | ||||
-rw-r--r-- | lib/bundler/source/path.rb | 6 | ||||
-rw-r--r-- | lib/bundler/source/path/installer.rb | 16 |
4 files changed, 69 insertions, 72 deletions
diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 7c1533ad90..0b4d76939b 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -230,6 +230,10 @@ module Bundler @allow_remote || @allow_cached end + def local? + @local + end + private def serialize_gemspecs_in(destination) @@ -256,10 +260,6 @@ module Bundler cached_revision && super end - def local? - @local - end - def requires_checkout? allow_git_ops? && !local? && !cached_revision_checked_out? end diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 7612eb16c6..9a4b7fe523 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -18,7 +18,7 @@ module Bundler def initialize(command) msg = String.new msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, " - msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/bundler/bundler/issues " + msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/rubygems/bundler/issues " msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}" super msg end @@ -27,21 +27,21 @@ module Bundler class GitCommandError < GitError attr_reader :command - def initialize(command, path = nil, extra_info = nil) + def initialize(command, path, destination_path, extra_info = nil) @command = command msg = String.new - msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed." + msg << "Git error: command `git #{command}` in directory #{destination_path} has failed." msg << "\n#{extra_info}" if extra_info - msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist? + msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist? super msg end end class MissingGitRevisionError < GitCommandError - def initialize(command, path, ref, repo) + def initialize(command, path, destination_path, ref, repo) msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?" - super command, path, msg + super command, path, destination_path, msg end end @@ -62,26 +62,18 @@ module Bundler end def revision - return @revision if @revision - - begin - @revision ||= find_local_revision - rescue GitCommandError => e - raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri)) - end - - @revision + @revision ||= find_local_revision end def branch - @branch ||= allowed_in_path do - git("rev-parse --abbrev-ref HEAD").strip + @branch ||= allowed_with_path do + git("rev-parse --abbrev-ref HEAD", :dir => path).strip end end def contains?(commit) - allowed_in_path do - result, status = git_null("branch --contains #{commit}") + allowed_with_path do + result, status = git_null("branch --contains #{commit}", :dir => path) status.success? && result =~ /^\* (.*)$/ end end @@ -108,8 +100,8 @@ module Bundler return unless extra_ref end - in_path do - git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref}) + with_path do + git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref}), :dir => path end end @@ -133,58 +125,54 @@ module Bundler end end # method 2 - SharedHelpers.chdir(destination) do - git_retry %(fetch --force --quiet --tags "#{path}") + git_retry %(fetch --force --quiet --tags "#{path}"), :dir => destination - begin - git "reset --hard #{@revision}" - rescue GitCommandError => e - raise MissingGitRevisionError.new(e.command, path, @revision, URICredentialsFilter.credential_filtered_uri(uri)) - end + begin + git "reset --hard #{@revision}", :dir => destination + rescue GitCommandError => e + raise MissingGitRevisionError.new(e.command, path, destination, @revision, URICredentialsFilter.credential_filtered_uri(uri)) + end - if submodules - git_retry "submodule update --init --recursive" - elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0") - git_retry "submodule deinit --all --force" - end + if submodules + git_retry "submodule update --init --recursive", :dir => destination + elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0") + git_retry "submodule deinit --all --force", :dir => destination end end private - def git_null(command) - command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) - raise GitNotAllowedError.new(command_with_no_credentials) unless allow? + def git_null(command, dir: SharedHelpers.pwd) + check_allowed(command) out, status = SharedHelpers.with_clean_git_env do - capture_and_ignore_stderr("git #{command}") + capture_and_ignore_stderr("git #{command}", :chdir => dir.to_s) end [URICredentialsFilter.credential_filtered_string(out, uri), status] end - def git_retry(command) + def git_retry(command, dir: SharedHelpers.pwd) Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do - git(command) + git(command, :dir => dir) end end - def git(command, check_errors = true, error_msg = nil) - command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) - raise GitNotAllowedError.new(command_with_no_credentials) unless allow? + def git(command, dir: SharedHelpers.pwd) + command_with_no_credentials = check_allowed(command) out, status = SharedHelpers.with_clean_git_env do - capture_and_filter_stderr(uri, "git #{command}") + capture_and_filter_stderr(uri, "git #{command}", :chdir => dir.to_s) end - stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri) - raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !status.success? - stdout_with_no_credentials + raise GitCommandError.new(command_with_no_credentials, path, dir) unless status.success? + + URICredentialsFilter.credential_filtered_string(out, uri) end def has_revision_cached? return unless @revision - in_path { git("cat-file -e #{@revision}") } + with_path { git("cat-file -e #{@revision}", :dir => path) } true rescue GitError false @@ -195,9 +183,11 @@ module Bundler end def find_local_revision - allowed_in_path do - git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip + allowed_with_path do + git("rev-parse --verify #{Shellwords.shellescape(ref)}", :dir => path).strip end + rescue GitCommandError => e + raise MissingGitRevisionError.new(e.command, path, path, ref, URICredentialsFilter.credential_filtered_uri(uri)) end # Escape the URI for git commands @@ -230,27 +220,32 @@ module Bundler @git ? @git.allow_git_ops? : true end - def in_path(&blk) + def with_path(&blk) checkout unless path.exist? - _ = URICredentialsFilter # load it before we chdir - SharedHelpers.chdir(path, &blk) + blk.call end - def allowed_in_path - return in_path { yield } if allow? + def allowed_with_path + return with_path { yield } if allow? raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application" end - def capture_and_filter_stderr(uri, cmd) + def check_allowed(command) + command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) + raise GitNotAllowedError.new(command_with_no_credentials) unless allow? + command_with_no_credentials + end + + def capture_and_filter_stderr(uri, cmd, chdir: SharedHelpers.pwd) require "open3" - return_value, captured_err, status = Open3.capture3(cmd) + return_value, captured_err, status = Open3.capture3(cmd, :chdir => chdir) Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty? [return_value, status] end - def capture_and_ignore_stderr(cmd) + def capture_and_ignore_stderr(cmd, chdir: SharedHelpers.pwd) require "open3" - return_value, _, status = Open3.capture3(cmd) + return_value, _, status = Open3.capture3(cmd, :chdir => chdir) [return_value, status] end end diff --git a/lib/bundler/source/path.rb b/lib/bundler/source/path.rb index f98f5155fb..e73e33d922 100644 --- a/lib/bundler/source/path.rb +++ b/lib/bundler/source/path.rb @@ -132,7 +132,11 @@ module Bundler end def expand(somepath) - somepath.expand_path(root_path) + if Bundler.current_ruby.jruby? # TODO: Unify when https://github.com/rubygems/bundler/issues/7598 fixed upstream and all supported jrubies include the fix + somepath.expand_path(root_path).expand_path + else + somepath.expand_path(root_path) + end rescue ArgumentError => e Bundler.ui.debug(e) raise PathError, "There was an error while trying to use the path " \ diff --git a/lib/bundler/source/path/installer.rb b/lib/bundler/source/path/installer.rb index a0357ffa39..909e248412 100644 --- a/lib/bundler/source/path/installer.rb +++ b/lib/bundler/source/path/installer.rb @@ -26,18 +26,16 @@ module Bundler end def post_install - SharedHelpers.chdir(@gem_dir) do - run_hooks(:pre_install) + run_hooks(:pre_install) - unless @disable_extensions - build_extensions - run_hooks(:post_build) - end + unless @disable_extensions + build_extensions + run_hooks(:post_build) + end - generate_bin unless spec.executables.nil? || spec.executables.empty? + generate_bin unless spec.executables.nil? || spec.executables.empty? - run_hooks(:post_install) - end + run_hooks(:post_install) ensure Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo? end |