Skip to content
This repository was archived by the owner on Apr 14, 2021. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 49 additions & 23 deletions lib/bundler/gem_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require "bundler/vendored_thor" unless defined?(Thor)
require "bundler"
require "shellwords"

module Bundler
class GemHelper
Expand Down Expand Up @@ -74,7 +75,7 @@ def install

def build_gem
file_name = nil
sh("gem build -V '#{spec_path}'") do
sh(%W[gem build -V #{spec_path}]) do
file_name = File.basename(built_gem_path)
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
FileUtils.mv(built_gem_path, "pkg")
Expand All @@ -85,17 +86,21 @@ def build_gem

def install_gem(built_gem_path = nil, local = false)
built_gem_path ||= build_gem
out, _ = sh_with_code("gem install '#{built_gem_path}'#{" --local" if local}")
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/]
cmd = %W[gem install #{built_gem_path}]
cmd << "--local" if local
out, status = sh_with_status(cmd)
unless status.success? && out[/Successfully installed/]
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
end
Bundler.ui.confirm "#{name} (#{version}) installed."
end

protected

def rubygem_push(path)
gem_command = "gem push '#{path}'"
gem_command += " --key #{gem_key}" if gem_key
gem_command += " --host #{allowed_push_host}" if allowed_push_host
gem_command = %W[gem push #{path}]
gem_command << "--key" << gem_key if gem_key
gem_command << "--host" << allowed_push_host if allowed_push_host
unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
end
Expand Down Expand Up @@ -127,12 +132,14 @@ def gem_push_host

def perform_git_push(options = "")
cmd = "git push #{options}"
out, code = sh_with_code(cmd)
raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0
out, status = sh_with_status(cmd)
return if status.success?
cmd = cmd.shelljoin if cmd.respond_to?(:shelljoin)
raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n"
end

def already_tagged?
return false unless sh("git tag").split(/\n/).include?(version_tag)
return false unless sh(%w[git tag]).split(/\n/).include?(version_tag)
Bundler.ui.confirm "Tag #{version_tag} has already been created."
true
end
Expand All @@ -142,20 +149,20 @@ def guard_clean
end

def clean?
sh_with_code("git diff --exit-code")[1] == 0
sh_with_status(%w[git diff --exit-code])[1].success?
end

def committed?
sh_with_code("git diff-index --quiet --cached HEAD")[1] == 0
sh_with_status(%w[git diff-index --quiet --cached HEAD])[1].success?
end

def tag_version
sh "git tag -m \"Version #{version}\" #{version_tag}"
sh %W[git tag -m Version\ #{version} #{version_tag}]
Bundler.ui.confirm "Tagged #{version_tag}."
yield if block_given?
rescue
Bundler.ui.error "Untagging #{version_tag} due to error."
sh_with_code "git tag -d #{version_tag}"
sh_with_status %W[git tag -d #{version_tag}]
raise
end

Expand All @@ -172,22 +179,41 @@ def name
end

def sh(cmd, &block)
out, code = sh_with_code(cmd, &block)
unless code.zero?
out, status = sh_with_status(cmd, &block)
unless status.success?
cmd = cmd.shelljoin if cmd.respond_to?(:shelljoin)
raise(out.empty? ? "Running `#{cmd}` failed. Run this command directly for more detailed output." : out)
end
out
end

def sh_with_code(cmd, &block)
cmd += " 2>&1"
outbuf = String.new
Bundler.ui.debug(cmd)
SharedHelpers.chdir(base) do
outbuf = `#{cmd}`
status = $?.exitstatus
block.call(outbuf) if status.zero? && block
[outbuf, status]
outbuf, status = sh_with_code(cmd, &block)
[outbuf, (status && status.exitstatus) || -1]
end

if RUBY_VERSION >= "1.9"
def sh_with_status(cmd, &block)
Bundler.ui.debug(cmd)
SharedHelpers.chdir(base) do
outbuf = IO.popen(cmd, :err => [:child, :out], &:read)
status = $?
block.call(outbuf) if status.success? && block
[outbuf, status]
end
end
else
def sh_with_status(cmd, &block)
cmd = cmd.shelljoin if cmd.respond_to?(:shelljoin)
cmd += " 2>&1"
outbuf = String.new
Bundler.ui.debug(cmd)
SharedHelpers.chdir(base) do
outbuf = `#{cmd}`
status = $?
block.call(outbuf) if status.success? && block
[outbuf, status]
end
end
end

Expand Down