Fix python dependency hash equality

eql? should not depend on the hash value as hash values of uneql objects
can collide, but eql values may only collide for objects that are
actually eql.

Further, python dependencies are uniquely identified by the combination
of the name and imports attributes, so there is no reason to involved
the expensive binary computation for simple equality checks.

Fixes Homebrew/homebrew#20840.
This commit is contained in:
Jack Nagel 2013-07-22 11:41:46 -05:00
parent b0138b9c9b
commit e33cdb2f8b

View File

@ -16,6 +16,7 @@ require 'requirement'
class PythonInstalled < Requirement
attr_reader :min_version
attr_reader :if3then3
attr_reader :imports
attr_accessor :site_packages
attr_accessor :binary # The python.rb formula needs to set the binary
@ -342,15 +343,14 @@ class PythonInstalled < Requirement
binary.to_s
end
# Objects of this class are used to represent dependencies on Python and
# dependencies on Python modules, so the combination of name + imports is
# enough to identify them uniquely.
def eql?(other)
instance_of?(other.class) && hash == other.hash
instance_of?(other.class) && name == other.name && imports == other.imports
end
def hash
# Requirements are a ComparableSet. So we define our identity by the
# selected python binary plus the @imports in order to support multiple:
# depends_on :python => 'module1'
# depends_on :python => 'module2'
(binary.to_s+@imports.to_s).hash
[name, *imports].hash
end
end