From dc30114605bd4c8f121a02e3d4b1aa5e700fde22 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Sun, 23 Nov 2014 15:45:49 -0800 Subject: [PATCH] Use site.in_source_dir --- lib/jekyll.rb | 1 + lib/jekyll/convertible.rb | 12 +++++++++-- lib/jekyll/document.rb | 8 ++++++++ lib/jekyll/layout.rb | 2 +- lib/jekyll/metadata.rb | 42 ++++++++++++++++++++------------------ lib/jekyll/renderer.rb | 4 ++-- lib/jekyll/site.rb | 19 +++++------------ lib/jekyll/static_file.rb | 2 ++ lib/jekyll/tags/include.rb | 2 +- test/test_document.rb | 6 +++--- 10 files changed, 55 insertions(+), 43 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 0a7c2b69..911b3ddb 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -21,6 +21,7 @@ require 'time' require 'English' require 'pathname' require 'logger' +require 'set' # 3rd party require 'safe_yaml/load' diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 4b1f3761..2c0d240e 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -168,6 +168,14 @@ module Jekyll true end + # Determine whether to regenerate the file based on metadata. + # + # Returns true if file needs to be regenerated + def regenerate? + site.metadata.regenerate?(site.in_source_dir(relative_path)) || + data['regenerate'] + end + # Determine whether the file should be placed into layouts. # # Returns false if the document is an asset file. @@ -209,8 +217,8 @@ module Jekyll # Add layout to dependency tree site.metadata.add_dependency( - Jekyll.sanitized_path(site.source, path), - Jekyll.sanitized_path(site.source, layout.path) + site.in_source_dir(path), + site.in_source_dir(layout.path) ) if layout = layouts[layout.data["layout"]] diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 003c04eb..356ce397 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -105,6 +105,14 @@ module Jekyll !(coffeescript_file? || yaml_file?) end + # Determine whether the document should be regenerated based on metadata. + # + # Returns true if the document needs to be regenerated. + def regenerate? + site.metadata.regenerate?(path, write?) || + data['regenerate'] + end + # Determine whether the file should be placed into layouts. # # Returns false if the document is either an asset file or a yaml file, diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb index f973019f..c29f353f 100644 --- a/lib/jekyll/layout.rb +++ b/lib/jekyll/layout.rb @@ -29,7 +29,7 @@ module Jekyll @site = site @base = base @name = name - @path = Jekyll.sanitized_path(site.source, File.join(base, name)) + @path = site.in_source_dir(base, name) self.data = {} diff --git a/lib/jekyll/metadata.rb b/lib/jekyll/metadata.rb index 3e242d69..6a31eb25 100644 --- a/lib/jekyll/metadata.rb +++ b/lib/jekyll/metadata.rb @@ -1,12 +1,14 @@ -require 'set' - module Jekyll class Metadata - attr_reader :site, :metadata + attr_reader :site, :metadata, :cache def initialize(site) @site = site + # Configuration options + @full_rebuild = site.config['full_rebuild'] + @disabled = site.config['no_metadata'] + # Read metadata from file read_metadata @@ -20,48 +22,48 @@ module Jekyll def add(path) return true if not File.exist? path - @metadata[path] = { + metadata[path] = { "mtime" => File.mtime(path), "deps" => [] } - @cache[path] = true + cache[path] = true end # Force a path to regenerate # # Returns true. def force(path) - @cache[path] = true + cache[path] = true end # Clear the metadata and cache # # Returns nothing def clear - @metadata = {} - @cache = {} + metadata = {} + cache = {} end # Checks if a path should be regenerated # # Returns a boolean. def regenerate?(path, add = true) - return true if site.config['no_metadata'] + return true if @disabled # Check for path in cache - if @cache.has_key? path - return @cache[path] + if cache.has_key? path + return cache[path] end # Check path that exists in metadata - if (data = @metadata[path]) + if data = metadata[path] data["deps"].each do |dependency| if regenerate?(dependency) - return @cache[dependency] = @cache[path] = true + return cache[dependency] = cache[path] = true end end - if data["mtime"] == File.mtime(path) - return @cache[path] = false + if data["mtime"].eql? File.mtime(path) + return cache[path] = false else return !add || add(path) end @@ -75,9 +77,9 @@ module Jekyll # # Returns nothing. def add_dependency(path, dependency) - return if (@metadata[path].nil? || site.config['no_metadata']) + return if (metadata[path].nil? || @disabled) - @metadata[path]["deps"] << dependency unless @metadata[path]["deps"].include? dependency + metadata[path]["deps"] << dependency unless metadata[path]["deps"].include? dependency regenerate? dependency end @@ -86,7 +88,7 @@ module Jekyll # Returns nothing. def write File.open(metadata_file, 'w') do |f| - f.write(@metadata.to_yaml) + f.write(metadata.to_yaml) end end @@ -94,7 +96,7 @@ module Jekyll # # Returns the String path of the file. def metadata_file - Jekyll.sanitized_path(site.source, '.jekyll-metadata') + site.in_source_dir('.jekyll-metadata') end private @@ -104,7 +106,7 @@ module Jekyll # # Returns the read metadata. def read_metadata - @metadata = if !(site.config['full_rebuild'] || site.config['no_metadata']) && File.file?(metadata_file) + @metadata = if !(@full_rebuild || @disabled) && File.file?(metadata_file) SafeYAML.load(File.read(metadata_file)) else {} diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index d2dd095f..1cdf6c2a 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -140,8 +140,8 @@ module Jekyll # Add layout to dependency tree site.metadata.add_dependency( - Jekyll.sanitized_path(site.source, document.path), - Jekyll.sanitized_path(site.source, layout.path) + site.in_source_dir(document.path), + site.in_source_dir(layout.path) ) if document.write? if layout = site.layouts[layout.data["layout"]] diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 69f11a75..eaf4c3cd 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -11,7 +11,7 @@ module Jekyll :gems, :plugin_manager attr_accessor :converters, :generators - attr_accessor :metadata + attr_reader :metadata # Public: Initialize a new Site. # @@ -293,19 +293,13 @@ module Jekyll collections.each do |label, collection| collection.docs.each do |document| - document.output = Jekyll::Renderer.new(self, document).run if ( - metadata.regenerate?(document.path, document.write?) || - document.data['regenerate'] - ) + document.output = Jekyll::Renderer.new(self, document).run if document.regenerate? end end payload = site_payload [posts, pages].flatten.each do |page_or_post| - page_or_post.render(layouts, payload) if ( - metadata.regenerate?(Jekyll.sanitized_path(source, page_or_post.relative_path)) || - page_or_post.data['regenerate'] - ) + page_or_post.render(layouts, payload) if page_or_post.regenerate? end rescue Errno::ENOENT => e # ignore missing layout dir @@ -323,12 +317,9 @@ module Jekyll # Returns nothing. def write each_site_file { |item| - item.write(dest) if ( - metadata.regenerate?(Jekyll.sanitized_path(source, item.path)) || - (item.respond_to?(:data) && item.data['regenerate']) - ) + item.write(dest) if item.regenerate? } - metadata.write unless site.config['no_metadata'] + metadata.write unless config['no_metadata'] end # Construct a Hash of Posts indexed by the specified Post attribute. diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index eae85b54..8e100656 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -67,6 +67,8 @@ module Jekyll true end + alias_method :regenerate?, :write? + # Write the static file to the destination directory (if modified). # # dest - The String path to the destination dir. diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 49e7357e..16da6f49 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -117,7 +117,7 @@ eos # Add include to dependency tree if context.registers[:page] and context.registers[:page].has_key? "path" site.metadata.add_dependency( - Jekyll.sanitized_path(site.source, context.registers[:page]["path"]), + site.in_source_dir(context.registers[:page]["path"]), path ) end diff --git a/test/test_document.rb b/test/test_document.rb index 2ff688ba..57c14c22 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -245,9 +245,9 @@ class TestDocument < Test::Unit::TestCase "output" => true } }, - "source" => source_dir, - "destination" => dest_dir, - "full_rebuild" => true + "source" => source_dir, + "destination" => dest_dir, + "full_rebuild" => true })) @site.process @document = @site.collections["slides"].files.find { |doc| doc.relative_path == "_slides/octojekyll.png" }