Use site.in_source_dir

This commit is contained in:
Alfred Xing 2014-11-23 15:45:49 -08:00
parent 2a5cf11ee2
commit dc30114605
10 changed files with 55 additions and 43 deletions

View File

@ -21,6 +21,7 @@ require 'time'
require 'English'
require 'pathname'
require 'logger'
require 'set'
# 3rd party
require 'safe_yaml/load'

View File

@ -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"]]

View File

@ -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,

View File

@ -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 = {}

View File

@ -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
{}

View File

@ -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"]]

View File

@ -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.

View File

@ -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.

View File

@ -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