1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE NoImplicitPrelude #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE RecordWildCards #-}
6{-# LANGUAGE ViewPatterns #-}
7-- | Confirm that a build plan has a consistent set of dependencies.
8module Stackage.CheckBuildPlan
13import Control.Monad.Writer.Strict (Writer, execWriter, tell)
14import qualified Data.Text as T
15import Stackage.BuildConstraints
16import Stackage.BuildPlan
17import Stackage.PackageDescription
18import Stackage.Prelude
20-- FIXME check cycles in dependencies, only looking at libraries and
23-- | Check the build plan for missing deps, wrong versions, etc.
24checkBuildPlan :: MonadThrow m => BuildPlan -> m ()
25checkBuildPlan BuildPlan {..}
26 | null errs' = return ()
27 | otherwise = throwM errs
29 allPackages = siCorePackages bpSystemInfo ++ map ppVersion bpPackages
30 errs@(BadBuildPlan errs') =
31 execWriter $ mapM_ (checkDeps allPackages) $ mapToList bpPackages
33-- | For a given package name and plan, check that its dependencies are:
35-- 1. Existent (existing in the provided package map)
36-- 2. Within version range
37checkDeps :: Map PackageName Version
38 -> (PackageName, PackagePlan)
39 -> Writer BadBuildPlan ()
40checkDeps allPackages (user, pb) =
41 mapM_ go $ mapToList $ sdPackages $ ppDesc pb
43 go (dep, diRange -> range) =
44 case lookup dep allPackages of
45 Nothing -> tell $ BadBuildPlan $ singletonMap (dep, Nothing) errMap
47 | version `withinRange` range -> return ()
48 | otherwise -> tell $ BadBuildPlan $ singletonMap
52 errMap = singletonMap pu range
55 , puVersion = ppVersion pb
56 , puMaintainer = pcMaintainer $ ppConstraints pb
57 , puGithubPings = ppGithubPings pb
61 { puName :: PackageName
62 , puVersion :: Version
63 , puMaintainer :: Maybe Maintainer
64 , puGithubPings :: Set Text
68pkgUserShow1 :: PkgUser -> Text
69pkgUserShow1 PkgUser {..} = concat
75pkgUserShow2 :: PkgUser -> Text
76pkgUserShow2 PkgUser {..} = unwords
77 $ (maybe "No maintainer" unMaintainer puMaintainer ++ ".")
78 : map (cons '@') (setToList puGithubPings)
81 BadBuildPlan (Map (PackageName, Maybe Version) (Map PkgUser VersionRange))
83instance Exception BadBuildPlan
84instance Show BadBuildPlan where
85 show (BadBuildPlan errs) =
86 unpack $ concatMap go $ mapToList errs
88 go ((dep, mdepVer), users) = unlines
90 : showDepVer dep mdepVer
91 : map showUser (mapToList users)
93 showDepVer :: PackageName -> Maybe Version -> Text
94 showDepVer dep Nothing = display dep ++ " (not present) depended on by:"
95 showDepVer dep (Just version) = concat
102 showUser :: (PkgUser, VersionRange) -> Text
103 showUser (pu, range) = concat
107 -- add a space after < to avoid confusing Markdown processors (like
108 -- Github's issue tracker)
109 , T.replace "<" "< " $ display range
114instance Monoid BadBuildPlan where
115 mempty = BadBuildPlan mempty
116 mappend (BadBuildPlan x) (BadBuildPlan y) =
117 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