0fce6c
From f4061357d812e9033f07ae3f8f44c4e26839f1e5 Mon Sep 17 00:00:00 2001
0fce6c
From: bronzdoc <lsagastume1990@gmail.com>
0fce6c
Date: Mon, 14 Jan 2019 09:46:29 -0600
0fce6c
Subject: [PATCH] Restore gem build behavior and introdcue the "-C" flag to gem
0fce6c
 build
0fce6c
0fce6c
---
0fce6c
 lib/rubygems/commands/build_command.rb        | 41 +++++++++++++------
0fce6c
 .../test_gem_commands_build_command.rb        |  1 +
0fce6c
 2 files changed, 29 insertions(+), 13 deletions(-)
0fce6c
0fce6c
diff --git a/lib/rubygems/commands/build_command.rb b/lib/rubygems/commands/build_command.rb
0fce6c
index e59471e976..761b80ee94 100644
0fce6c
--- a/lib/rubygems/commands/build_command.rb
0fce6c
+++ b/lib/rubygems/commands/build_command.rb
0fce6c
@@ -18,6 +18,10 @@ def initialize
0fce6c
     add_option '-o', '--output FILE', 'output gem with the given filename' do |value, options|
0fce6c
       options[:output] = value
0fce6c
     end
0fce6c
+
0fce6c
+    add_option '-C PATH', '', 'Run as if gem build was started in <PATH> instead of the current working directory.' do |value, options|
0fce6c
+      options[:build_path] = value
0fce6c
+    end
0fce6c
   end
0fce6c
 
0fce6c
   def arguments # :nodoc:
0fce6c
@@ -60,25 +64,36 @@ def execute
0fce6c
     end
0fce6c
 
0fce6c
     if File.exist? gemspec
0fce6c
-      Dir.chdir(File.dirname(gemspec)) do
0fce6c
-        spec = Gem::Specification.load File.basename(gemspec)
0fce6c
-
0fce6c
-        if spec
0fce6c
-          Gem::Package.build(
0fce6c
-            spec,
0fce6c
-            options[:force],
0fce6c
-            options[:strict],
0fce6c
-            options[:output]
0fce6c
-          )
0fce6c
-        else
0fce6c
-          alert_error "Error loading gemspec. Aborting."
0fce6c
-          terminate_interaction 1
0fce6c
+      spec = Gem::Specification.load(gemspec)
0fce6c
+
0fce6c
+      if options[:build_path]
0fce6c
+        Dir.chdir(File.dirname(gemspec)) do
0fce6c
+          spec = Gem::Specification.load File.basename(gemspec)
0fce6c
+          build_package(spec)
0fce6c
         end
0fce6c
+      else
0fce6c
+        build_package(spec)
0fce6c
       end
0fce6c
+
0fce6c
     else
0fce6c
       alert_error "Gemspec file not found: #{gemspec}"
0fce6c
       terminate_interaction 1
0fce6c
     end
0fce6c
   end
0fce6c
 
0fce6c
+  private
0fce6c
+
0fce6c
+  def build_package(spec)
0fce6c
+    if spec
0fce6c
+      Gem::Package.build(
0fce6c
+        spec,
0fce6c
+        options[:force],
0fce6c
+        options[:strict],
0fce6c
+        options[:output]
0fce6c
+      )
0fce6c
+    else
0fce6c
+      alert_error "Error loading gemspec. Aborting."
0fce6c
+      terminate_interaction 1
0fce6c
+    end
0fce6c
+  end
0fce6c
 end
0fce6c
diff --git a/test/rubygems/test_gem_commands_build_command.rb b/test/rubygems/test_gem_commands_build_command.rb
0fce6c
index ac82a408c7..02d1b98e8f 100644
0fce6c
--- a/test/rubygems/test_gem_commands_build_command.rb
0fce6c
+++ b/test/rubygems/test_gem_commands_build_command.rb
0fce6c
@@ -207,6 +207,7 @@ def test_execute_outside_dir
0fce6c
       gs.write @gem.to_ruby
0fce6c
     end
0fce6c
 
0fce6c
+    @cmd.options[:build_path] = gemspec_dir
0fce6c
     @cmd.options[:args] = [gemspec_file]
0fce6c
 
0fce6c
     use_ui @ui do