From df1efeff25e60c3b7852fe92f7109e4b2d5f1aa9 Mon Sep 17 00:00:00 2001 From: Alex Kessinger Date: Wed, 10 Apr 2013 10:19:48 -0700 Subject: [PATCH] Accept multiple config files from command line Parse config as if it can contain multiple references to config files. This allows you to pass in multiple config files from the command line Helps with issues #514 and #703 --- lib/jekyll.rb | 16 +++++++++++----- test/test_configuration.rb | 14 ++++++++++++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index ab35a3b2..a1f0cdfd 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -136,13 +136,19 @@ module Jekyll source = override['source'] || Jekyll::DEFAULTS['source'] # Get configuration from /_config.yml or / - config_file = override.delete('config') - config_file = File.join(source, "_config.yml") if config_file.to_s.empty? + config_files = override.delete('config') + config_files = File.join(source, "_config.yml") if config_files.to_s.empty? + # If config is a list of space separate config files + config_files = config_files.split(' ') begin - config = YAML.safe_load_file(config_file) - raise "Configuration file: (INVALID) #{config_file}" if !config.is_a?(Hash) - $stdout.puts "Configuration file: #{config_file}" + config = {} + config_files.each do |config_file| + next_config = YAML.safe_load_file(config_file) + raise "Configuration file: (INVALID) #{config_file}" if !next_config.is_a?(Hash) + $stdout.puts "Configuration file: #{config_file}" + config = config.deep_merge(next_config) + end rescue SystemCallError # Errno:ENOENT = file not found $stderr.puts "Configuration file: none" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 40b091de..ec42b8f5 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -46,10 +46,20 @@ class TestConfiguration < Test::Unit::TestCase assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] }) end - should "load default config if path passed is empty" do + should "load multiple config files" do mock(YAML).safe_load_file(@paths[:default]) { Hash.new } + mock(YAML).safe_load_file(@paths[:other]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") - assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) + mock($stdout).puts("Configuration file: #{@paths[:other]}") + assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) + end + + should "load multiple config files and last config should win" do + mock(YAML).safe_load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} } + mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} } + mock($stdout).puts("Configuration file: #{@paths[:default]}") + mock($stdout).puts("Configuration file: #{@paths[:other]}") + assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) end end end