def upload(source, options = nil)
source = source.name if Rake::Task === source
options ||= {}
if String === source
raise NotFoundError, 'No source file/directory to upload.' unless File.exist?(source)
if File.directory?(source)
Dir.glob("#{source}/**/*").reject { |file| File.directory?(file) }.each do |file|
uri = self + (File.join(self.path, file.sub(source, '')))
uri.upload file, {:digests=>[]}.merge(options)
end
else
File.open(source, 'rb') { |input| upload input, options }
end
elsif source.respond_to?(:read)
digests = (options[:digests] || [:md5, :sha1]).
inject({}) { |hash, name| hash[name] = Digest.const_get(name.to_s.upcase).new ; hash }
size = source.stat.size rescue nil
write (options).merge(:progress=>verbose && size, :size=>size) do |bytes|
source.read(bytes).tap do |chunk|
digests.values.each { |digest| digest << chunk } if chunk
end
end
digests.each do |key, digest|
self.merge("#{self.path}.#{key}").write digest.hexdigest,
(options).merge(:progress=>false)
end
else
raise ArgumentError, 'Expecting source to be a file name (string, task) or any object that responds to read (file, pipe).'
end
end