lib/cc/workspace/path_tree.rb
require "pathname"
require "set"
module CC
class Workspace
class PathTree
autoload :DirNode, "cc/workspace/path_tree/dir_node"
autoload :FileNode, "cc/workspace/path_tree/file_node"
def self.node_for_pathname(pathname)
if pathname.directory?
DirNode.new(pathname.to_s)
else
FileNode.new(pathname.to_s)
end
end
def self.for_path(path)
new(node_for_pathname(Pathname.new(path)))
end
def initialize(root_node)
@root_node = root_node
end
def clone
self.class.new(root_node.clone)
end
def exclude_paths(paths)
paths.each { |path| root_node.remove(*normalized_path_pieces(path)) }
end
def include_paths(paths)
paths.each { |path| root_node.add(*normalized_path_pieces(path)) }
end
delegate :all_paths, to: :root_node
private
attr_reader :root_node
def normalized_path_pieces(path)
Pathname.new(path).cleanpath.to_s.split(File::SEPARATOR).reject(&:blank?)
end
end
end
end