diff options
author | Bundlerbot <bot@bundler.io> | 2019-06-12 09:19:34 +0000 |
---|---|---|
committer | Bundlerbot <bot@bundler.io> | 2019-06-12 09:19:34 +0000 |
commit | 97d5977e44b62300dd36854a5aa3a1889a385388 (patch) | |
tree | 77f36dc6cbed00443a2700f7fd9cc8086fadc0db | |
parent | cd05f13a74ef2556823be48c23feaf509c3b1de7 (diff) | |
parent | 4a37d66f3f222739178d798b30fb135f2429fe45 (diff) | |
download | bundler-97d5977e44b62300dd36854a5aa3a1889a385388.tar.gz |
Merge #7051
7051: Migrate git proxy helpers to use Open3 r=hsbt a=deivid-rodriguez
### What was the end-user problem that led to this PR?
The problem was that git proxy helpers had a few pending TODOs.
### What was your diagnosis of the problem?
My diagnosis was that we should get the TODOs done, because now they can be done.
### What is your fix for the problem, implemented in this PR?
My fix is to fix the TODOs by migrating git proxy helpers to use `Open3` instead of backticks.
### Why did you choose this fix out of the possible options?
I chose this fix because it works.
Co-authored-by: David RodrÃguez <deivid.rodriguez@riseup.net>
-rw-r--r-- | lib/bundler/source/git/git_proxy.rb | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 3db31f0237..f5af10f206 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require "open3" require "shellwords" require "tempfile" module Bundler @@ -77,8 +78,8 @@ module Bundler def contains?(commit) allowed_in_path do - result = git_null("branch --contains #{commit}") - $? == 0 && result =~ /^\* (.*)$/ + result, status = git_null("branch --contains #{commit}") + status.success? && result =~ /^\* (.*)$/ end end @@ -148,13 +149,15 @@ module Bundler private - # TODO: Do not rely on /dev/null. - # Given that open3 is not cross platform until Ruby 1.9.3, - # the best solution is to pipe to /dev/null if it exists. - # If it doesn't, everything will work fine, but the user - # will get the $stderr messages as well. def git_null(command) - git("#{command} 2>#{Bundler::NULL}", false) + command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) + raise GitNotAllowedError.new(command_with_no_credentials) unless allow? + + out, status = SharedHelpers.with_clean_git_env do + capture_and_ignore_stderr("git #{command}") + end + + [URICredentialsFilter.credential_filtered_string(out, uri), status] end def git_retry(command) @@ -167,12 +170,12 @@ module Bundler command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) raise GitNotAllowedError.new(command_with_no_credentials) unless allow? - out = SharedHelpers.with_clean_git_env do - capture_and_filter_stderr(uri) { `git #{command}` } + out, status = SharedHelpers.with_clean_git_env do + capture_and_filter_stderr(uri, "git #{command}") end stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri) - raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success? + raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !status.success? stdout_with_no_credentials end @@ -235,26 +238,15 @@ module Bundler raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application" end - # TODO: Replace this with Open3 when upgrading to bundler 2 - # Similar to #git_null, as Open3 is not cross-platform, - # a temporary way is to use Tempfile to capture the stderr. - # When replacing this using Open3, make sure git_null is - # also replaced by Open3, so stdout and stderr all got handled properly. - def capture_and_filter_stderr(uri) - return_value, captured_err = "" - backup_stderr = STDERR.dup - begin - Tempfile.open("captured_stderr") do |f| - STDERR.reopen(f) - return_value = yield - f.rewind - captured_err = f.read - end - ensure - STDERR.reopen backup_stderr - end + def capture_and_filter_stderr(uri, cmd) + return_value, captured_err, status = Open3.capture3(cmd) Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty? - return_value + [return_value, status] + end + + def capture_and_ignore_stderr(cmd) + return_value, _, status = Open3.capture3(cmd) + [return_value, status] end end end |