Correctly account for -package-db ordering when picking packages.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Sun, 19 Mar 2017 23:07:49 +0000 (16:07 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Mon, 20 Mar 2017 20:59:23 +0000 (13:59 -0700)
commite0eaea918c32b3aa445708656876d1e2aef94a13
tree1fb9db58f774e90caca56fd2ca0ff9d3331ca1bc
parent40b65db4cd34c3566b9f6c53c086d53e97574217
Correctly account for -package-db ordering when picking packages.

Summary:
When I originally implemented ABI-based shadowing as per
ee4e1654c31b9c6f6ad9b19ece25f040bbbcbd72, I switched our strategy
from pasting together lists to creating a map of all units first,
and then selecting packages from this.  However, what I did
not realize when doing this was that we actually depended
on the *ordering* of these lists later, when we selected
a preferred package to use.

The crux is if I have -package-db db1 -package-db db2 -package p-0.1,
and p-0.1 is provided by both db1 and db2, which one does the
-package flag select?  Previously, this was undetermined; now
we always select the instance from the LATEST package database.
(If p-0.1 shows up multiple times in the same database, once again
the chosen package is undefined.)

The reason why cabal08 intermittently failed was that, in practice,
we were sorting on the UnitId, so when we bumped version numbers,
that often wibbled the UnitIds so that they compared oppositely.
I've extended the test so that we check that the relation is
antisymmetric.

Fixes #13313

Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Test Plan: validate

Reviewers: bgamari, austin

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3369
compiler/main/Packages.hs
testsuite/tests/cabal/cabal08/Makefile
testsuite/tests/cabal/cabal08/all.T
testsuite/tests/cabal/cabal08/cabal08.stdout