This change means that HashDict buckets are nolonger strictly ordered.
Previously keys which compared equal (==) but not exactly equal (===)
would be considered different for large sizes but equivalent for small
sizes. This ambiguity occured because hashes are only equal when terms
are exactly equal (===), so both now use exact (===) key comparisons.
Small HashDicts are still a single ordered list and large HashDicts
contain ordered buckets. Both of these may contain keys that compare
equal (==) but are not exactly equal (===), should these keys be present
in the same list or bucket the ordering of these keys (relative to each
other) is undefined.
See github issue #1171 for examples.
Note: If assumptions were made about the form of a HashDict they may
nolonger be valid. Particularly that HashDicts can nolonger be reliably
pattern matched on for equality.
Module.module_info(:compile)[:source] returns the value, not a tuple
as the code was expecting, making r/1 think that no module has a
source. Fix this expectation.
A recent update (036d016 2013-06-02; Rebar dep with no config is given
rebar as manager) introduced :make as a value for a dependency's
manager, but Mix.Deps.load_path has no function clause to handle this.
Add :make to the nil manager clause, as it seems the closest
equivalent.
The converger is the one that knows if a dependency exists or
not and, as such, is the best one to know if a dependency callback
should be invoked or not.
This commit also normalizes some of the Retriever internal
functions, for example, now we have mix_children and rebar_children.
The goal is to extract those functions (and the ones in Mix.Deps)
one by one into a Mix.DepsManager behaviour which will be implemented
by Mix.DepsManager.Mix and Mix.DepsManager.Rebar, removing all
the conditional calls existing in the code.