blob: 140f5f1c3e3f83edc4a125170660db57ee98e9f3 [file] [log] [blame]
require 'fileutils'
module Sass
module CacheStores
# A backend for the Sass cache using the filesystem.
class Filesystem < Base
# The directory where the cached files will be stored.
#
# @return [String]
attr_accessor :cache_location
# @param cache_location [String] see \{#cache\_location}
def initialize(cache_location)
@cache_location = cache_location
end
# @see Base#\_retrieve
def _retrieve(key, version, sha)
return unless File.readable?(path_to(key))
begin
File.open(path_to(key), "rb") do |f|
if f.readline("\n").strip == version && f.readline("\n").strip == sha
return f.read
end
end
File.unlink path_to(key)
rescue Errno::ENOENT
# Already deleted. Race condition?
end
nil
rescue EOFError, TypeError, ArgumentError => e
Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
end
# @see Base#\_store
def _store(key, version, sha, contents)
compiled_filename = path_to(key)
FileUtils.mkdir_p(File.dirname(compiled_filename))
Sass::Util.atomic_create_and_write_file(compiled_filename) do |f|
f.puts(version)
f.puts(sha)
f.write(contents)
end
rescue Errno::EACCES
# pass
end
private
# Returns the path to a file for the given key.
#
# @param key [String]
# @return [String] The path to the cache file.
def path_to(key)
key = key.gsub(/[<>:\\|?*%]/) {|c| "%%%03d" % c.ord}
File.join(cache_location, key)
end
end
end
end