More effective use of incremental MD5 to eliminate loading entire tarball into memory

Signed-off-by: Adam Vandenberg <flangy@gmail.com>
This commit is contained in:
Jake Good 2010-03-23 19:56:20 -05:00 committed by Adam Vandenberg
parent 6586f89a29
commit 9fbc26a39f
3 changed files with 16 additions and 3 deletions

View File

@ -52,7 +52,7 @@ def __make url, name
if strategy == CurlDownloadStrategy
d = strategy.new url, name, version, nil
the_tarball = d.fetch
md5 = Digest::MD5.hexdigest(the_tarball.read)
md5 = the_tarball.md5
puts "MD5 is #{md5}"
else
puts "--cache requested, but we can only cache formulas that use Curl."

View File

@ -157,7 +157,13 @@ class Pathname
def md5
require 'digest'
Digest::MD5.hexdigest(File.read(self))
incr_md5 = Digest::MD5.new
self.open('r') do |f|
f.each_line do |line|
incr_md5 << line
end
end
incr_md5.hexdigest
end
if '1.9' <= RUBY_VERSION

View File

@ -325,7 +325,14 @@ private
type ||= :md5
supplied=instance_variable_get("@#{type}")
type=type.to_s.upcase
hash=Digest.const_get(type).hexdigest(fn.read)
hasher = Digest.const_get(type)
# Most are MD5 and it should be efficient.
if hasher == Digest::MD5
hash = fn.md5
else
hash = hasher.hexdigest(fn.read)
end
if supplied and not supplied.empty?
raise "#{type} mismatch\nExpected: #{hash}\nArchive: #{fn}" unless supplied.upcase == hash.upcase