1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE NoImplicitPrelude #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE RecordWildCards #-}
6-- | Confirm that a build plan has a consistent set of dependencies.
7module Stackage2.CheckBuildPlan
11import Control.Monad.Writer.Strict (Writer, execWriter, tell)
12import Stackage2.BuildConstraints
13import Stackage2.BuildPlan
14import Stackage2.PackageDescription
15import Stackage2.Prelude
17checkBuildPlan :: MonadThrow m => BuildPlan -> m ()
18checkBuildPlan BuildPlan {..}
19 | null errs' = return ()
20 | otherwise = throwM errs
22 allPackages = siCorePackages bpSystemInfo ++ map ppVersion bpPackages
23 errs@(BadBuildPlan errs') =
24 execWriter $ mapM_ (checkDeps allPackages) $ mapToList bpPackages
26checkDeps :: Map PackageName Version
27 -> (PackageName, PackagePlan)
28 -> Writer BadBuildPlan ()
29checkDeps allPackages (user, pb) =
30 mapM_ go $ mapToList $ sdPackages $ ppDesc pb
33 case lookup dep allPackages of
34 Nothing -> tell $ BadBuildPlan $ singletonMap (dep, Nothing) errMap
36 | version `withinRange` range -> return ()
37 | otherwise -> tell $ BadBuildPlan $ singletonMap
41 errMap = singletonMap pu range
44 , puVersion = ppVersion pb
45 , puMaintainer = pcMaintainer $ ppConstraints pb
46 , puGithubPings = ppGithubPings pb
50 { puName :: PackageName
51 , puVersion :: Version
52 , puMaintainer :: Maybe Maintainer
53 , puGithubPings :: Set Text
57pkgUserShow1 :: PkgUser -> Text
58pkgUserShow1 PkgUser {..} = concat
64pkgUserShow2 :: PkgUser -> Text
65pkgUserShow2 PkgUser {..} = unwords
66 $ (maybe "No maintainer" unMaintainer puMaintainer ++ ".")
67 : map (cons '@') (setToList puGithubPings)
70 BadBuildPlan (Map (PackageName, Maybe Version) (Map PkgUser VersionRange))
72instance Exception BadBuildPlan
73instance Show BadBuildPlan where
74 show (BadBuildPlan errs) =
75 unpack $ concatMap go $ mapToList errs
77 go ((dep, mdepVer), users) = unlines
78 $ showDepVer dep mdepVer
79 : map showUser (mapToList users)
81 showDepVer :: PackageName -> Maybe Version -> Text
82 showDepVer dep Nothing = display dep ++ " (not present) depended on by:"
83 showDepVer dep (Just version) = concat
90 showUser :: (PkgUser, VersionRange) -> Text
91 showUser (pu, range) = concat
100instance Monoid BadBuildPlan where
101 mempty = BadBuildPlan mempty
102 mappend (BadBuildPlan x) (BadBuildPlan y) =
103 BadBuildPlan $ unionWith (unionWith intersectVersionRanges) x y
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list