From 7a154ab380501050e6ce20463de8f702353bceb0 Mon Sep 17 00:00:00 2001
From: "yuuji.yaginuma" <yuuji.yaginuma@gmail.com>
Date: Fri, 19 May 2017 15:13:05 +0900
Subject: Correctly set user_supplied_options when there is no whitespace in
 option specification

Current `user_supplied_options` method can not set the value correctly
if there is no space between option and value (e.g., `-p9000`).
This makes it possible to set the value correctly in the case like the above.

Fixes #29138
---
 railties/lib/rails/commands/server/server_command.rb | 11 +++++++++--
 railties/test/commands/server_test.rb                |  6 ++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/railties/lib/rails/commands/server/server_command.rb b/railties/lib/rails/commands/server/server_command.rb
index cf3903f3ae..ebb4ae795a 100644
--- a/railties/lib/rails/commands/server/server_command.rb
+++ b/railties/lib/rails/commands/server/server_command.rb
@@ -155,9 +155,16 @@ module Rails
         def user_supplied_options
           @user_supplied_options ||= begin
             # Convert incoming options array to a hash of flags
-            #   ["-p", "3001", "-c", "foo"] # => {"-p" => true, "-c" => true}
+            #   ["-p3001", "-C", "--binding", "127.0.0.1"] # => {"-p"=>true, "-C"=>true, "--binding"=>true}
             user_flag = {}
-            @original_options.each_with_index { |command, i| user_flag[command] = true if i.even? }
+            @original_options.each do |command|
+              if command.to_s.start_with?("--")
+                option = command.split("=")[0]
+                user_flag[option] = true
+              elsif command =~ /\A(-.)/
+                user_flag[Regexp.last_match[0]] = true
+              end
+            end
 
             # Collect all options that the user has explicitly defined so we can
             # differentiate them from defaults
diff --git a/railties/test/commands/server_test.rb b/railties/test/commands/server_test.rb
index 7731d10d9b..722323efdc 100644
--- a/railties/test/commands/server_test.rb
+++ b/railties/test/commands/server_test.rb
@@ -165,6 +165,12 @@ class Rails::ServerTest < ActiveSupport::TestCase
 
     server_options = parse_arguments(["--port", 3001])
     assert_equal [:Port], server_options[:user_supplied_options]
+
+    server_options = parse_arguments(["-p3001", "-C", "--binding", "127.0.0.1"])
+    assert_equal [:Port, :Host, :caching], server_options[:user_supplied_options]
+
+    server_options = parse_arguments(["--port=3001"])
+    assert_equal [:Port], server_options[:user_supplied_options]
   end
 
   def test_default_options
-- 
cgit v1.2.3