diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index ec385cbc..1d1519ba 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -30,7 +30,7 @@ module Jekyll def existing_files files = Set.new Dir.glob(File.join(site.dest, "**", "*"), File::FNM_DOTMATCH) do |file| - files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex + files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex || keep_dirs.include?(file) end files end @@ -71,6 +71,14 @@ module Jekyll new_dirs.select { |dir| File.file?(dir) }.to_set end + # Private: The list of directories that need to be kept because they are parent directories + # of files specified in keep_files + # + # Returns a Set with the directory paths + def keep_dirs + site.keep_files.map{|file| parent_dirs(File.join(site.dest, file))}.flatten.to_set + end + # Private: Creates a regular expression from the config's keep_files array # # Examples diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index 968d8f67..e9bcc0f5 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -1,6 +1,45 @@ require 'helper' class TestCleaner < Test::Unit::TestCase + context "directory in keep_files" do + setup do + clear_dest + stub(Jekyll).configuration do + Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) + end + + FileUtils.mkdir_p(dest_dir('to_keep/child_dir')) + FileUtils.touch(File.join(dest_dir('to_keep'), 'index.html')) + FileUtils.touch(File.join(dest_dir('to_keep/child_dir'), 'index.html')) + + @site = Site.new(Jekyll.configuration) + @site.keep_files = ['to_keep/child_dir'] + + @cleaner = Site::Cleaner.new(@site) + @cleaner.cleanup! + end + + teardown do + FileUtils.rm_rf(dest_dir('to_keep')) + end + + should "keep the parent directory" do + assert File.exist?(dest_dir('to_keep')) + end + + should "keep the child directory" do + assert File.exist?(dest_dir('to_keep/child_dir')) + end + + should "keep the file in the directory in keep_files" do + assert File.exist?(File.join(dest_dir('to_keep/child_dir'), 'index.html')) + end + + should "delete the file in the directory not in keep_files" do + assert !File.exist?(File.join(dest_dir('to_keep'), 'index.html')) + end + end + context "directory containing no files and non-empty directories" do setup do clear_dest