diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 43b89451..ef7d8339 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -10,6 +10,11 @@ module Jekyll # Initializes a new instance. def initialize(site) @site = site + reset + end + + def reset + @glob_cache = {} end def update_deprecated_types(set) @@ -98,28 +103,35 @@ module Jekyll applies_type?(scope, type) && applies_path?(scope, path) end - # rubocop:disable Metrics/AbcSize def applies_path?(scope, path) return true if !scope.key?("path") || scope["path"].empty? sanitized_path = Pathname.new(sanitize_path(path)) - site_path = Pathname.new(@site.source) rel_scope_path = Pathname.new(scope["path"]) - abs_scope_path = File.join(@site.source, rel_scope_path) if scope["path"].to_s.include?("*") - Dir.glob(abs_scope_path).each do |scope_path| - scope_path = Pathname.new(scope_path).relative_path_from(site_path) - scope_path = strip_collections_dir(scope_path) - Jekyll.logger.debug "Globbed Scope Path:", scope_path - return true if path_is_subpath?(sanitized_path, scope_path) - end - false + glob_scope(sanitized_path, rel_scope_path) else path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path)) end end - # rubocop:enable Metrics/AbcSize + + def glob_scope(sanitized_path, rel_scope_path) + site_source = Pathname.new(@site.source) + abs_scope_path = site_source.join(rel_scope_path).to_s + + glob_cache(abs_scope_path).each do |scope_path| + scope_path = Pathname.new(scope_path).relative_path_from(site_source) + scope_path = strip_collections_dir(scope_path) + Jekyll.logger.debug "Globbed Scope Path:", scope_path + return true if path_is_subpath?(sanitized_path, scope_path) + end + false + end + + def glob_cache(path) + @glob_cache[path] ||= Dir.glob(path) + end def path_is_subpath?(path, parent_path) path.ascend do |ascended_path| diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 7904a393..4eb88d07 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -83,6 +83,8 @@ module Jekyll Jekyll.logger.info @liquid_renderer.stats_table end + # rubocop:disable Metrics/MethodLength + # # Reset Site details. # # Returns nothing @@ -104,12 +106,14 @@ module Jekyll @regenerator.clear_cache @liquid_renderer.reset @site_cleaner = nil + frontmatter_defaults.reset raise ArgumentError, "limit_posts must be a non-negative number" if limit_posts.negative? Jekyll::Cache.clear_if_config_changed config Jekyll::Hooks.trigger :site, :after_reset, self end + # rubocop:enable Metrics/MethodLength # Load necessary libraries, plugins, converters, and generators. #