Merge pull request #1916 from jekyll/gitignore-excludes
This commit is contained in:
commit
d96165e3c4
|
@ -53,11 +53,3 @@ class Hash
|
||||||
dup.symbolize_keys!
|
dup.symbolize_keys!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module Enumerable
|
|
||||||
# Returns true if path matches against any glob pattern.
|
|
||||||
# Look for more detail about glob pattern in method File::fnmatch.
|
|
||||||
def glob_include?(e)
|
|
||||||
any? { |exp| File.fnmatch?(exp, e) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -2,8 +2,24 @@ module Jekyll
|
||||||
class EntryFilter
|
class EntryFilter
|
||||||
attr_reader :site
|
attr_reader :site
|
||||||
|
|
||||||
def initialize(site)
|
def initialize(site, base_directory = nil)
|
||||||
@site = site
|
@site = site
|
||||||
|
@base_directory = derive_base_directory(@site, base_directory.to_s.dup)
|
||||||
|
end
|
||||||
|
|
||||||
|
def base_directory
|
||||||
|
@base_directory.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def derive_base_directory(site, base_dir)
|
||||||
|
if base_dir.start_with?(site.source)
|
||||||
|
base_dir[site.source] = ""
|
||||||
|
end
|
||||||
|
base_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
def relative_to_source(entry)
|
||||||
|
File.join(base_directory, entry)
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter(entries)
|
def filter(entries)
|
||||||
|
@ -15,7 +31,7 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def included?(entry)
|
def included?(entry)
|
||||||
site.include.glob_include?(entry)
|
glob_include?(site.include, entry)
|
||||||
end
|
end
|
||||||
|
|
||||||
def special?(entry)
|
def special?(entry)
|
||||||
|
@ -27,11 +43,29 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def excluded?(entry)
|
def excluded?(entry)
|
||||||
site.exclude.glob_include?(entry)
|
excluded = glob_include?(site.exclude, relative_to_source(entry))
|
||||||
|
Jekyll.logger.debug "excluded?(#{relative_to_source(entry)}) ==> #{excluded}"
|
||||||
|
excluded
|
||||||
end
|
end
|
||||||
|
|
||||||
def symlink?(entry)
|
def symlink?(entry)
|
||||||
File.symlink?(entry) && site.safe
|
File.symlink?(entry) && site.safe
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ensure_leading_slash(path)
|
||||||
|
path[0..0] == "/" ? path : "/#{path}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns true if path matches against any glob pattern.
|
||||||
|
# Look for more detail about glob pattern in method File::fnmatch.
|
||||||
|
def glob_include?(enum, e)
|
||||||
|
entry = ensure_leading_slash(e)
|
||||||
|
enum.any? do |exp|
|
||||||
|
item = ensure_leading_slash(exp)
|
||||||
|
Jekyll.logger.debug "glob_include?(#{entry})"
|
||||||
|
Jekyll.logger.debug " ==> File.fnmatch?(#{item}, #{entry}) == #{File.fnmatch?(item, entry)}"
|
||||||
|
File.fnmatch?(item, entry)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -140,7 +140,7 @@ module Jekyll
|
||||||
base = File.join(self.source, self.config['layouts'])
|
base = File.join(self.source, self.config['layouts'])
|
||||||
return unless File.exists?(base)
|
return unless File.exists?(base)
|
||||||
entries = []
|
entries = []
|
||||||
Dir.chdir(base) { entries = filter_entries(Dir['**/*.*']) }
|
Dir.chdir(base) { entries = filter_entries(Dir['**/*.*'], base) }
|
||||||
|
|
||||||
entries.each do |f|
|
entries.each do |f|
|
||||||
name = f.split(".")[0..-2].join(".")
|
name = f.split(".")[0..-2].join(".")
|
||||||
|
@ -157,7 +157,7 @@ module Jekyll
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def read_directories(dir = '')
|
def read_directories(dir = '')
|
||||||
base = File.join(self.source, dir)
|
base = File.join(self.source, dir)
|
||||||
entries = Dir.chdir(base) { filter_entries(Dir.entries('.')) }
|
entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
|
||||||
|
|
||||||
self.read_posts(dir)
|
self.read_posts(dir)
|
||||||
self.read_drafts(dir) if self.show_drafts
|
self.read_drafts(dir) if self.show_drafts
|
||||||
|
@ -339,8 +339,8 @@ module Jekyll
|
||||||
# entries - The Array of String file/directory entries to filter.
|
# entries - The Array of String file/directory entries to filter.
|
||||||
#
|
#
|
||||||
# Returns the Array of filtered entries.
|
# Returns the Array of filtered entries.
|
||||||
def filter_entries(entries)
|
def filter_entries(entries, base_directory = nil)
|
||||||
EntryFilter.new(self).filter(entries)
|
EntryFilter.new(self, base_directory).filter(entries)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get the implementation class for the given Converter.
|
# Get the implementation class for the given Converter.
|
||||||
|
@ -381,7 +381,7 @@ module Jekyll
|
||||||
def get_entries(dir, subfolder)
|
def get_entries(dir, subfolder)
|
||||||
base = File.join(self.source, dir, subfolder)
|
base = File.join(self.source, dir, subfolder)
|
||||||
return [] unless File.exists?(base)
|
return [] unless File.exists?(base)
|
||||||
entries = Dir.chdir(base) { filter_entries(Dir['**/*']) }
|
entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
|
||||||
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
highlight: pygments
|
highlighter: pygments
|
||||||
relative_permalinks: false
|
relative_permalinks: false
|
||||||
gauges_id: 503c5af6613f5d0f19000027
|
gauges_id: 503c5af6613f5d0f19000027
|
||||||
permalink: /news/:year/:month/:day/:title/
|
permalink: /news/:year/:month/:day/:title/
|
||||||
|
|
|
@ -63,26 +63,4 @@ class TestCoreExt < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context "enumerable" do
|
|
||||||
context "glob_include?" do
|
|
||||||
should "return false with no glob patterns" do
|
|
||||||
assert ![].glob_include?("a.txt")
|
|
||||||
end
|
|
||||||
|
|
||||||
should "return false with all not match path" do
|
|
||||||
data = ["a*", "b?"]
|
|
||||||
assert !data.glob_include?("ca.txt")
|
|
||||||
assert !data.glob_include?("ba.txt")
|
|
||||||
end
|
|
||||||
|
|
||||||
should "return true with match path" do
|
|
||||||
data = ["a*", "b?", "**/a*"]
|
|
||||||
assert data.glob_include?("a.txt")
|
|
||||||
assert data.glob_include?("ba")
|
|
||||||
assert data.glob_include?("c/a/a.txt")
|
|
||||||
assert data.glob_include?("c/a/b/a.txt")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,8 +18,8 @@ class TestEntryFilter < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
should "filter entries with exclude" do
|
should "filter entries with exclude" do
|
||||||
excludes = %w[README TODO]
|
excludes = %w[README TODO vendor/bundle]
|
||||||
files = %w[index.html site.css .htaccess]
|
files = %w[index.html site.css .htaccess vendor]
|
||||||
|
|
||||||
@site.exclude = excludes + ["exclude*"]
|
@site.exclude = excludes + ["exclude*"]
|
||||||
assert_equal files, @site.filter_entries(excludes + files + ["excludeA"])
|
assert_equal files, @site.filter_entries(excludes + files + ["excludeA"])
|
||||||
|
@ -71,4 +71,38 @@ class TestEntryFilter < Test::Unit::TestCase
|
||||||
assert_not_equal [], site.static_files
|
assert_not_equal [], site.static_files
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "glob_include?" do
|
||||||
|
setup do
|
||||||
|
stub(Jekyll).configuration do
|
||||||
|
Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
|
||||||
|
end
|
||||||
|
@site = Site.new(Jekyll.configuration)
|
||||||
|
@filter = EntryFilter.new(@site)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return false with no glob patterns" do
|
||||||
|
assert !@filter.glob_include?([], "a.txt")
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return false with all not match path" do
|
||||||
|
data = ["a*", "b?"]
|
||||||
|
assert !@filter.glob_include?(data, "ca.txt")
|
||||||
|
assert !@filter.glob_include?(data, "ba.txt")
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return true with match path" do
|
||||||
|
data = ["a*", "b?", "**/a*"]
|
||||||
|
assert @filter.glob_include?(data, "a.txt")
|
||||||
|
assert @filter.glob_include?(data, "ba")
|
||||||
|
assert @filter.glob_include?(data, "c/a/a.txt")
|
||||||
|
assert @filter.glob_include?(data, "c/a/b/a.txt")
|
||||||
|
end
|
||||||
|
|
||||||
|
should "match even if there is no leading slash" do
|
||||||
|
data = ['vendor/bundle']
|
||||||
|
assert @filter.glob_include?(data, '/vendor/bundle')
|
||||||
|
assert @filter.glob_include?(data, 'vendor/bundle')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue