Skip to content

Commit

Permalink
Merge remote branch 'sos4nt/remove-orphaned-files'
Browse files Browse the repository at this point in the history
  • Loading branch information
mojombo committed Dec 14, 2010
2 parents 9bd4875 + 5b680f8 commit c1ed790
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 26 deletions.
1 change: 1 addition & 0 deletions History.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Use OptionParser's [no-] functionality for better boolean parsing.
* Add Drupal migrator (#245)
* Complain about YAML and Liquid errors (#249)
* Remove orphaned files during regeneration (#247)

== 0.8.0 / 2010-11-22
* Minor Enhancements
Expand Down
29 changes: 15 additions & 14 deletions lib/jekyll/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -93,24 +93,25 @@ def to_liquid
"url" => File.join(@dir, self.url),
"content" => self.content })
end

# Obtain destination path.
# +dest+ is the String path to the destination dir
#
# Returns destination file path.
def destination(dest)
# The url needs to be unescaped in order to preserve the correct filename
path = File.join(dest, @dir, CGI.unescape(self.url))
path = File.join(path, "index.html") if self.url =~ /\/$/
path
end

# Write the generated page file to the destination directory.
# +dest_prefix+ is the String path to the destination dir
# +dest_suffix+ is a suffix path to the destination dir
# +dest+ is the String path to the destination dir
#
# Returns nothing
def write(dest_prefix, dest_suffix = nil)
dest = File.join(dest_prefix, @dir)
dest = File.join(dest, dest_suffix) if dest_suffix
FileUtils.mkdir_p(dest)

# The url needs to be unescaped in order to preserve the correct filename
path = File.join(dest, CGI.unescape(self.url))
if self.url =~ /\/$/
FileUtils.mkdir_p(path)
path = File.join(path, "index.html")
end

def write(dest)
path = destination(dest)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(self.output)
end
Expand Down
23 changes: 13 additions & 10 deletions lib/jekyll/post.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,22 +177,25 @@ def render(layouts, site_payload)

do_layout(payload, layouts)
end

# Obtain destination path.
# +dest+ is the String path to the destination dir
#
# Returns destination file path.
def destination(dest)
# The url needs to be unescaped in order to preserve the correct filename
path = File.join(dest, CGI.unescape(self.url))
path = File.join(path, "index.html") if template[/\.html$/].nil?
path
end

# Write the generated post file to the destination directory.
# +dest+ is the String path to the destination dir
#
# Returns nothing
def write(dest)
FileUtils.mkdir_p(File.join(dest, dir))

# The url needs to be unescaped in order to preserve the correct filename
path = File.join(dest, CGI.unescape(self.url))

if template[/\.html$/].nil?
FileUtils.mkdir_p(path)
path = File.join(path, "index.html")
end

path = destination(dest)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(self.output)
end
Expand Down
31 changes: 31 additions & 0 deletions lib/jekyll/site.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ def process
self.read
self.generate
self.render
self.cleanup
self.write
end

Expand Down Expand Up @@ -151,6 +152,36 @@ def render
rescue Errno::ENOENT => e
# ignore missing layout dir
end

# Remove orphaned files and empty directories in destination
#
# Returns nothing
def cleanup
# all files and directories in destination, including hidden ones
dest_files = []
Dir.glob(File.join(self.dest, "**", "*"), File::FNM_DOTMATCH) do |file|
dest_files << file unless file =~ /\/\.{1,2}$/
end

# files to be written
files = []
self.posts.each do |post|
files << post.destination(self.dest)
end
self.pages.each do |page|
files << page.destination(self.dest)
end
self.static_files.each do |sf|
files << sf.destination(self.dest)
end

# adding files' parent directories
files.each { |file| files << File.dirname(file) unless files.include? File.dirname(file) }

obsolete_files = dest_files - files

FileUtils.rm_rf(obsolete_files)
end

# Write static files, pages and posts
#
Expand Down
3 changes: 1 addition & 2 deletions lib/jekyll/static_file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,11 @@ def modified?
# Returns false if the file was not modified since last time (no-op).
def write(dest)
dest_path = destination(dest)
dest_dir = File.join(dest, @dir)

return false if File.exist? dest_path and !modified?
@@mtimes[path] = mtime

FileUtils.mkdir_p(dest_dir)
FileUtils.mkdir_p(File.dirname(dest_path))
FileUtils.cp(path, dest_path)

true
Expand Down
33 changes: 33 additions & 0 deletions test/test_site.rb
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,39 @@ class TestSite < Test::Unit::TestCase
assert_equal includes, @site.filter_entries(excludes + includes)
end

context 'with orphaned files in destination' do
setup do
clear_dest
@site.process
# generate some orphaned files:
# hidden file
File.open(dest_dir('.htpasswd'), 'w')
# single file
File.open(dest_dir('obsolete.html'), 'w')
# single file in sub directory
FileUtils.mkdir(dest_dir('qux'))
File.open(dest_dir('qux/obsolete.html'), 'w')
# empty directory
FileUtils.mkdir(dest_dir('quux'))
end

teardown do
FileUtils.rm_f(dest_dir('.htpasswd'))
FileUtils.rm_f(dest_dir('obsolete.html'))
FileUtils.rm_rf(dest_dir('qux'))
FileUtils.rm_f(dest_dir('quux'))
end

should 'remove orphaned files in destination' do
@site.process
assert !File.exist?(dest_dir('.htpasswd'))
assert !File.exist?(dest_dir('obsolete.html'))
assert !File.exist?(dest_dir('qux'))
assert !File.exist?(dest_dir('quux'))
end

end

context 'with an invalid markdown processor in the configuration' do
should 'not throw an error at initialization time' do
bad_processor = 'not a processor name'
Expand Down

0 comments on commit c1ed790

Please sign in to comment.