summaryrefslogtreecommitdiff
path: root/lib/bundler/source
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2019-03-20 07:52:08 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2019-08-03 09:29:55 +0900
commitcad71f70892f262b6912f4087d3800aa772cb117 (patch)
tree48c1b64165d634f71ca2acbf8669d4cba63cebd3 /lib/bundler/source
parenta685a8643f3897913aa0aeeca3f1392bb9da1cf8 (diff)
[bundler/bundler] Migrate git proxy helpers to use Open3
https://github.com/bundler/bundler/commit/4a37d66f3f
Diffstat (limited to 'lib/bundler/source')
-rw-r--r--lib/bundler/source/git/git_proxy.rb52
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