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
12import Control.Monad.Writer.Strict (Writer, execWriter, tell)
13import qualified Data.Text as T
14import Stackage.BuildConstraints
15import Stackage.BuildPlan
16import Stackage.PackageDescription
17import Stackage.Prelude
19-- FIXME check cycles in dependencies, only looking at libraries and
22checkBuildPlan :: MonadThrow m => BuildPlan -> m ()
23checkBuildPlan BuildPlan {..}
24 | null errs' = return ()
25 | otherwise = throwM errs
27 allPackages = siCorePackages bpSystemInfo ++ map ppVersion bpPackages
28 errs@(BadBuildPlan errs') =
29 execWriter $ mapM_ (checkDeps allPackages) $ mapToList bpPackages
31checkDeps :: Map PackageName Version
32 -> (PackageName, PackagePlan)
33 -> Writer BadBuildPlan ()
34checkDeps allPackages (user, pb) =
35 mapM_ go $ mapToList $ sdPackages $ ppDesc pb
37 go (dep, diRange -> range) =
38 case lookup dep allPackages of
39 Nothing -> tell $ BadBuildPlan $ singletonMap (dep, Nothing) errMap
41 | version `withinRange` range -> return ()
42 | otherwise -> tell $ BadBuildPlan $ singletonMap
46 errMap = singletonMap pu range
49 , puVersion = ppVersion pb
50 , puMaintainer = pcMaintainer $ ppConstraints pb
51 , puGithubPings = ppGithubPings pb
55 { puName :: PackageName
56 , puVersion :: Version
57 , puMaintainer :: Maybe Maintainer
58 , puGithubPings :: Set Text
62pkgUserShow1 :: PkgUser -> Text
63pkgUserShow1 PkgUser {..} = concat
69pkgUserShow2 :: PkgUser -> Text
70pkgUserShow2 PkgUser {..} = unwords
71 $ (maybe "No maintainer" unMaintainer puMaintainer ++ ".")
72 : map (cons '@') (setToList puGithubPings)
75 BadBuildPlan (Map (PackageName, Maybe Version) (Map PkgUser VersionRange))
77instance Exception BadBuildPlan
78instance Show BadBuildPlan where
79 show (BadBuildPlan errs) =
80 unpack $ concatMap go $ mapToList errs
82 go ((dep, mdepVer), users) = unlines
84 : showDepVer dep mdepVer
85 : map showUser (mapToList users)
87 showDepVer :: PackageName -> Maybe Version -> Text
88 showDepVer dep Nothing = display dep ++ " (not present) depended on by:"
89 showDepVer dep (Just version) = concat
96 showUser :: (PkgUser, VersionRange) -> Text
97 showUser (pu, range) = concat
101 -- add a space after < to avoid confusing Markdown processors (like
102 -- Github's issue tracker)
103 , T.replace "<" "< " $ display range
108instance Monoid BadBuildPlan where
109 mempty = BadBuildPlan mempty
110 mappend (BadBuildPlan x) (BadBuildPlan y) =
111 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