@@ -17,7 +17,7 @@ module Stackage2.BuildPlan
18import Distribution.Package (Dependency (..))
18import Distribution.Package (Dependency (..))
19import Distribution.PackageDescription
19import Distribution.PackageDescription
20−import Distribution.Version (withinRange, intersectVersionRanges)
20+import Distribution.Version (withinRange, anyVersion, simplifyVersionRange)
21import Stackage2.PackageConstraints
21import Stackage2.PackageConstraints
22import Stackage2.PackageIndex
22import Stackage2.PackageIndex
23import Stackage2.Prelude
23import Stackage2.Prelude
@@ -32,6 +32,10 @@ import qualified Distribution.Compiler
33data BuildPlan desc = BuildPlan
33data BuildPlan desc = BuildPlan
34 { bpCore :: Map PackageName Version
34 { bpCore :: Map PackageName Version
35+ , bpCoreExecutables :: Set ExeName
36+ , bpGhcVersion :: Version
37+ , bpOS :: Distribution.System.OS
38+ , bpArch :: Distribution.System.Arch
35 , bpTools :: Vector (PackageName, Version)
39 , bpTools :: Vector (PackageName, Version)
36 , bpExtra :: Map PackageName (PackageBuild desc)
40 , bpExtra :: Map PackageName (PackageBuild desc)
@@ -44,6 +48,10 @@ instance MonoTraversable (BuildPlan desc)
44instance ToJSON (BuildPlan desc) where
48instance ToJSON (BuildPlan desc) where
45 toJSON BuildPlan {..} = object
49 toJSON BuildPlan {..} = object
46 [ "core" .= asMap (mapFromList $ map toCore $ mapToList bpCore)
50 [ "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)
47 , "tools" .= map goTool bpTools
55 , "tools" .= map goTool bpTools
48 , "extra" .= Map.mapKeysWith const (unPackageName) bpExtra
56 , "extra" .= Map.mapKeysWith const (unPackageName) bpExtra
@@ -54,10 +62,15 @@ instance ToJSON (BuildPlan desc) where
54 , "version" .= asText (display version)
62 , "version" .= asText (display version)
56instance desc ~ () => FromJSON (BuildPlan desc) where
64instance desc ~ () => FromJSON (BuildPlan desc) where
57− parseJSON = withObject "BuildPlan" $ \o -> BuildPlan
65+ parseJSON = withObject "BuildPlan" $ \o -> do
58− <$> ((o .: "core") >>= goCore)
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
59− <*> ((o .: "tools") >>= mapM goTool)
71+ bpTools <- (o .: "tools") >>= mapM goTool
60− <*> (goExtra <$> (o .: "extra"))
72+ bpExtra <- goExtra <$> (o .: "extra")
73+ return BuildPlan {..}
63 fmap mapFromList . mapM goCore' . mapToList . asHashMap
76 fmap mapFromList . mapM goCore' . mapToList . asHashMap
@@ -77,6 +90,8 @@ instance desc ~ () => FromJSON (BuildPlan desc) where
78data PackageBuild desc = PackageBuild
91data PackageBuild desc = PackageBuild
79 { pbVersion :: Version
92 { pbVersion :: Version
93+ , pbVersionRange :: VersionRange
94+ -- ^ This is vital for ensuring old constraints are kept in place when bumping
80 , pbMaintainer :: Maybe Maintainer
95 , pbMaintainer :: Maybe Maintainer
81 , pbGithubPings :: Set Text
96 , pbGithubPings :: Set Text
82 , pbUsers :: Set PackageName
97 , pbUsers :: Set PackageName
@@ -92,11 +107,21 @@ instance MonoFunctor (PackageBuild desc)
92instance MonoFoldable (PackageBuild desc)
107instance MonoFoldable (PackageBuild desc)
93instance MonoTraversable (PackageBuild desc)
108instance MonoTraversable (PackageBuild desc)
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'
117+ vr' = simplifyVersionRange vr
95instance ToJSON (PackageBuild desc) where
119instance ToJSON (PackageBuild desc) where
96 toJSON PackageBuild {..} = object $ concat
120 toJSON PackageBuild {..} = object $ concat
97 [ maybe [] (\m -> ["maintainer" .= m]) pbMaintainer
121 [ maybe [] (\m -> ["maintainer" .= m]) pbMaintainer
99 [ "version" .= asText (display pbVersion)
123 [ "version" .= asText (display pbVersion)
124+ , "version-range" .= asText (display $ superSimplifyVersionRange pbVersionRange)
100 , "github-pings" .= pbGithubPings
125 , "github-pings" .= pbGithubPings
101 , "users" .= map unPackageName (unpack pbUsers)
126 , "users" .= map unPackageName (unpack pbUsers)
102 , "flags" .= Map.mapKeysWith const (\(FlagName f) -> asText $ pack f) pbFlags
127 , "flags" .= Map.mapKeysWith const (\(FlagName f) -> asText $ pack f) pbFlags
@@ -108,6 +133,7 @@ instance ToJSON (PackageBuild desc) where
108instance desc ~ () => FromJSON (PackageBuild desc) where
133instance desc ~ () => FromJSON (PackageBuild desc) where
109 parseJSON = withObject "PackageBuild" $ \o -> PackageBuild
134 parseJSON = withObject "PackageBuild" $ \o -> PackageBuild
110 <$> (o .: "version" >>= efail . simpleParse . asText)
135 <$> (o .: "version" >>= efail . simpleParse . asText)
136+ <*> (o .: "version-range" >>= fmap superSimplifyVersionRange . efail . simpleParse . asText)
111 <*> o .:? "maintainer"
137 <*> o .:? "maintainer"
112 <*> o .:? "github-pings" .!= mempty
138 <*> o .:? "github-pings" .!= mempty
113 <*> (Set.map PackageName <$> (o .:? "users" .!= mempty))
139 <*> (Set.map PackageName <$> (o .:? "users" .!= mempty))
@@ -137,7 +163,10 @@ newBuildPlan pc = liftIO $ do
137 -- FIXME topologically sort packages? maybe just leave that to the build phase
163 -- FIXME topologically sort packages? maybe just leave that to the build phase
138 return BuildPlan
164 return BuildPlan
139 { bpCore = pcCorePackages pc
165 { bpCore = pcCorePackages pc
140− -- bpCoreExes = pcCoreExecutables pc
166+ , bpCoreExecutables = pcCoreExecutables pc
167+ , bpGhcVersion = pcGhcVersion pc
169+ , bpArch = pcArch pc
141 , bpTools = tools
170 , bpTools = tools
142 , bpExtra = extra
171 , bpExtra = extra
@@ -253,7 +282,9 @@ mkPackageBuild pc gpd = do
254 return PackageBuild
283 return PackageBuild
255 { pbVersion = version
284 { 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
257 , pbGithubPings = getGithubPings gpd
288 , pbGithubPings = getGithubPings gpd
258 , pbUsers = mempty -- must be filled in later
289 , pbUsers = mempty -- must be filled in later
259 , pbFlags = flags
290 , pbFlags = flags