class Nanoc::Extra::Pruner
Responsible for finding and deleting files in the site’s output directory that are not managed by Nanoc.
@api private
Attributes
site[R]
@return [Nanoc::Int::Site] The site this pruner belongs to
Public Class Methods
new(site, dry_run: false, exclude: [])
click to toggle source
@param [Nanoc::Int::Site] site The site for which a pruner is created
@param [Boolean] dry_run true if the files to be deleted
should only be printed instead of actually deleted, false if the files should actually be deleted.
@param [Enumerable<String>] exclude
# File lib/nanoc/extra/pruner.rb, line 17 def initialize(site, dry_run: false, exclude: []) @site = site @dry_run = dry_run @exclude = exclude end
Public Instance Methods
filename_excluded?(filename)
click to toggle source
@param [String] filename The filename to check
@return [Boolean] true if the given file is excluded, false otherwise
# File lib/nanoc/extra/pruner.rb, line 60 def filename_excluded?(filename) pathname = Pathname.new(filename) @exclude.any? { |e| pathname.__nanoc_include_component?(e) } end
run()
click to toggle source
Prunes all output files not managed by Nanoc.
@return [void]
# File lib/nanoc/extra/pruner.rb, line 26 def run require 'find' # Get compiled files # FIXME: requires #build_reps to have been called all_raw_paths = site.compiler.reps.flat_map { |r| r.raw_paths.values } compiled_files = all_raw_paths.flatten.compact.select { |f| File.file?(f) } # Get present files and dirs present_files = [] present_dirs = [] Find.find(site.config[:output_dir] + '/') do |f| present_files << f if File.file?(f) present_dirs << f if File.directory?(f) end # Remove stray files stray_files = (present_files - compiled_files) stray_files.each do |f| next if filename_excluded?(f) delete_file(f) end # Remove empty directories present_dirs.reverse_each do |dir| next if Dir.foreach(dir) { |n| break true if n !~ /\A\.\.?\z/ } next if filename_excluded?(dir) delete_dir(dir) end end
Protected Instance Methods
delete_dir(dir)
click to toggle source
# File lib/nanoc/extra/pruner.rb, line 76 def delete_dir(dir) if @dry_run puts dir else Nanoc::CLI::Logger.instance.file(:high, :delete, dir) Dir.rmdir(dir) end end
delete_file(file)
click to toggle source
# File lib/nanoc/extra/pruner.rb, line 67 def delete_file(file) if @dry_run puts file else Nanoc::CLI::Logger.instance.file(:high, :delete, file) FileUtils.rm(file) end end