[GHC] #15391: Maybe ghc-pkg register should unregister packages with "incompatible" signatures
GHC
ghc-devs at haskell.org
Mon Jul 16 01:52:45 UTC 2018
#15391: Maybe ghc-pkg register should unregister packages with "incompatible"
signatures
-------------------------------------+-------------------------------------
Reporter: ezyang | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: ghc-pkg | Version: 8.4.3
Keywords: backpack | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Consider the following situation:
1. I register package 'p-0.1-inplace' instantiated with 'P =
base:Data.Map'
2. I register package 'p-0.1-inplace' instantiated with 'P =
base:Control.Monad'
Even though the IPID of these two packages is the same, we clearly want to
keep both of them in the database. This thus motivates the following lines
in ghc-pkg
{{{
removes = [ RemovePackage p
| not multi_instance,
p <- packages db_to_operate_on,
mungedId p == mungedId pkg,
-- Only remove things that were instantiated the same
way!
instantiatedWith p == instantiatedWith pkg ]
}}}
OK... now consider the following situation
1. I register package 'p-0.1-inplace' instantiated with 'P =
base:Data.Map'
2. I register package 'p-0.1-inplace', instantiated with nothing (I have
edited 'p' such that it has no more signatures)
So... ghc-pkg is going to keep both of these packages (per the logic
above). But is that really what we want? Now the package database is in a
half-consistent state, where the instances of 'p-0.1-inplace' are not
consistent with the number of holes they are supposed to have. So let us
suggest an invariant:
INVARIANT: All packages which have the same IPID in a package database are
self-consistent with each other.
OK, so given this invariant, what do we have to do in step 2? It would
seem that when we get a prospective package to register, we must *find all
packages which are incompatible with it*, and remove them from the package
database. So, given a package with a set of holes H, we must remove all
packages with holes H' such that H = H'
I'm not completely convinced this is a good idea. Usually ghc-pkg only
removes a single package in response to a new registration, and this
behavior could result in lots of packages getting unregistered, more than
you might expect. On the other hand, if you think of the package database
in a more hierarchical manner, it makes sense that changing the root
registration would invalidate all the children.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15391>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list