@@ -17,7 +17,7 @@ module Stackage2.BuildPlan
1717
1818import Distribution.Package (Dependency (..))
1919import Distribution.PackageDescription
20−import Distribution.Version (withinRange, intersectVersionRanges)
20+import Distribution.Version (withinRange, anyVersion, simplifyVersionRange)
2121import Stackage2.PackageConstraints
2222import Stackage2.PackageIndex
2323import Stackage2.Prelude
@@ -32,6 +32,10 @@ import qualified Distribution.Compiler
3232
3333data BuildPlan desc = BuildPlan
3434 { bpCore :: Map PackageName Version
35+ , bpCoreExecutables :: Set ExeName
36+ , bpGhcVersion :: Version
37+ , bpOS :: Distribution.System.OS
38+ , bpArch :: Distribution.System.Arch
3539 , bpTools :: Vector (PackageName, Version)
3640 , bpExtra :: Map PackageName (PackageBuild desc)
3741 }
@@ -44,6 +48,10 @@ instance MonoTraversable (BuildPlan desc)
4448instance ToJSON (BuildPlan desc) where
4549 toJSON BuildPlan {..} = object
4650 [ "core" .= asMap (mapFromList $ map toCore $ mapToList bpCore)
51+ , "core-exes" .= bpCoreExecutables
52+ , "ghc-version" .= asText (display bpGhcVersion)
53+ , "os" .= asText (display bpOS)
54+ , "arch" .= asText (display bpArch)
4755 , "tools" .= map goTool bpTools
4856 , "extra" .= Map.mapKeysWith const (unPackageName) bpExtra
4957 ]
@@ -54,10 +62,15 @@ instance ToJSON (BuildPlan desc) where
5462 , "version" .= asText (display version)
5563 ]
5664instance desc ~ () => FromJSON (BuildPlan desc) where
57− parseJSON = withObject "BuildPlan" $ \o -> BuildPlan
58− <$> ((o .: "core") >>= goCore)
59− <*> ((o .: "tools") >>= mapM goTool)
60− <*> (goExtra <$> (o .: "extra"))
65+ parseJSON = withObject "BuildPlan" $ \o -> do
66+ bpCore <- (o .: "core") >>= goCore
67+ bpCoreExecutables <- o .: "core-exes"
68+ bpGhcVersion <- (o .: "ghc-version") >>= either (fail . show) return . simpleParse . asText
69+ bpOS <- o .: "os" >>= either (fail . show) return . simpleParse . asText
70+ bpArch <- (o .: "arch") >>= either (fail . show) return . simpleParse . asText
71+ bpTools <- (o .: "tools") >>= mapM goTool
72+ bpExtra <- goExtra <$> (o .: "extra")
73+ return BuildPlan {..}
6174 where
6275 goCore =
6376 fmap mapFromList . mapM goCore' . mapToList . asHashMap
@@ -77,6 +90,8 @@ instance desc ~ () => FromJSON (BuildPlan desc) where
7790
7891data PackageBuild desc = PackageBuild
7992 { pbVersion :: Version
93+ , pbVersionRange :: VersionRange
94+ -- ^ This is vital for ensuring old constraints are kept in place when bumping
8095 , pbMaintainer :: Maybe Maintainer
8196 , pbGithubPings :: Set Text
8297 , pbUsers :: Set PackageName
@@ -92,11 +107,21 @@ instance MonoFunctor (PackageBuild desc)
92107instance MonoFoldable (PackageBuild desc)
93108instance MonoTraversable (PackageBuild desc)
94109
110+-- | There seems to be a bug in Cabal where serializing and deserializing
111+-- version ranges winds up with different representations. So we have a
112+-- super-simplifier to deal with that.
113+superSimplifyVersionRange :: VersionRange -> VersionRange
114+superSimplifyVersionRange vr =
115+ fromMaybe (assert False vr') $ simpleParse $ asList $ display vr'
116+ where
117+ vr' = simplifyVersionRange vr
118+
95119instance ToJSON (PackageBuild desc) where
96120 toJSON PackageBuild {..} = object $ concat
97121 [ maybe [] (\m -> ["maintainer" .= m]) pbMaintainer
98122 ,
99123 [ "version" .= asText (display pbVersion)
124+ , "version-range" .= asText (display $ superSimplifyVersionRange pbVersionRange)
100125 , "github-pings" .= pbGithubPings
101126 , "users" .= map unPackageName (unpack pbUsers)
102127 , "flags" .= Map.mapKeysWith const (\(FlagName f) -> asText $ pack f) pbFlags
@@ -108,6 +133,7 @@ instance ToJSON (PackageBuild desc) where
108133instance desc ~ () => FromJSON (PackageBuild desc) where
109134 parseJSON = withObject "PackageBuild" $ \o -> PackageBuild
110135 <$> (o .: "version" >>= efail . simpleParse . asText)
136+ <*> (o .: "version-range" >>= fmap superSimplifyVersionRange . efail . simpleParse . asText)
111137 <*> o .:? "maintainer"
112138 <*> o .:? "github-pings" .!= mempty
113139 <*> (Set.map PackageName <$> (o .:? "users" .!= mempty))
@@ -137,7 +163,10 @@ newBuildPlan pc = liftIO $ do
137163 -- FIXME topologically sort packages? maybe just leave that to the build phase
138164 return BuildPlan
139165 { bpCore = pcCorePackages pc
140− -- bpCoreExes = pcCoreExecutables pc
166+ , bpCoreExecutables = pcCoreExecutables pc
167+ , bpGhcVersion = pcGhcVersion pc
168+ , bpOS = pcOS pc
169+ , bpArch = pcArch pc
141170 , bpTools = tools
142171 , bpExtra = extra
143172 }
@@ -253,7 +282,9 @@ mkPackageBuild pc gpd = do
253282 gpd
254283 return PackageBuild
255284 { pbVersion = version
256− , pbMaintainer = fmap snd $ lookup name $ pcPackages pc
285+ , pbVersionRange = superSimplifyVersionRange
286+ $ maybe anyVersion fst $ lookup name $ pcPackages pc
287+ , pbMaintainer = lookup name (pcPackages pc) >>= snd
257288 , pbGithubPings = getGithubPings gpd
258289 , pbUsers = mempty -- must be filled in later
259290 , pbFlags = flags