diff --git a/lib/geminabox.rb b/lib/geminabox.rb index ef242a75..aba6e09c 100644 --- a/lib/geminabox.rb +++ b/lib/geminabox.rb @@ -54,7 +54,7 @@ def fixup_bundler_rubygems! # Return a list of versions of gem 'gem_name' with the dependencies of each version. def gem_dependencies(gem_name) - dependency_cache.cache(gem_name) do + dependency_cache.marshal_cache(gem_name) do load_gems.select {|gem| gem_name == gem.name }.map do |gem| spec = spec_for(gem.name, gem.number) { diff --git a/lib/geminabox/disk_cache.rb b/lib/geminabox/disk_cache.rb index d64c4f86..2f1c76ab 100644 --- a/lib/geminabox/disk_cache.rb +++ b/lib/geminabox/disk_cache.rb @@ -23,6 +23,11 @@ def cache(key) read(key_hash) || write(key_hash, yield) end + def marshal_cache(key) + key_hash = key_hash(key) + marshal_read(key_hash) || marshal_write(key_hash, yield) + end + protected def ensure_dir_exists! @@ -38,16 +43,30 @@ def path(key_hash) end def read(key_hash) + read_int(key_hash) { |path| File.read(path) } + end + + def marshal_read(key_hash) + read_int(key_hash) { |path| Marshal.load(File.open(path)) } + end + + def read_int(key_hash) path = path(key_hash) - File.read(path) if File.exists?(path) + yield(path) if File.exists?(path) end def write(key_hash, value) - path = path(key_hash) - File.open(path, 'wb'){|f| - f << value - } + write_int(key_hash) { |f| f << value } + value + end + + def marshal_write(key_hash, value) + write_int(key_hash) { |f| Marshal.dump(value, f) } value end + def write_int(key_hash) + File.open(path(key_hash), 'wb') { |f| yield(f) } + end + end