Skip to content
Snippets Groups Projects
Select Git revision
  • 8548481fa152f146e7213cddca5e3b400999c150
  • main default protected
  • 75389691-a67c-422a-91e9-aa58bfb5-main-patch-32205
  • test-pipe
  • extended-scripts
  • structured-badges
  • guix-pipeline
  • cabal-pipeline
8 results

CheckDir.hs

Blame
  • CheckDir.hs 9.08 KiB
    {-# LANGUAGE DeriveAnyClass    #-}
    {-# LANGUAGE DeriveGeneric     #-}
    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE LambdaCase        #-}
    {-# LANGUAGE OverloadedStrings #-}
    {-# LANGUAGE TupleSections     #-}
    {-# LANGUAGE TypeFamilies      #-}
    
    -- | Module that contains high-level checking for an entire directory
    module CheckDir (recursiveCheckDir, DirResult(..), resultIsFatal)  where
    
    import           Badges                 (badgeJson)
    import           CheckMap               (MapResult (..), loadAndLintMap)
    import           Control.Monad          (void)
    import           Control.Monad.Extra    (mapMaybeM)
    import           Data.Aeson             (ToJSON, (.=))
    import qualified Data.Aeson             as A
    import           Data.Foldable          (fold)
    import           Data.Functor           ((<&>))
    import           Data.Map               (Map, elems, keys, mapWithKey)
    import qualified Data.Map               as M
    import           Data.Map.Strict        (mapKeys, (\\))
    import           Data.Maybe             (mapMaybe)
    import           Data.Text              (Text)
    import qualified Data.Text              as T
    import           GHC.Generics           (Generic)
    import           LintConfig             (LintConfig', configMaxLintLevel)
    import           Paths                  (normalise, normaliseWithFrag)
    import           System.Directory.Extra (doesFileExist)
    import           System.FilePath        (splitPath, (</>))
    import qualified System.FilePath        as FP
    import           System.FilePath.Posix  (takeDirectory)
    import           Types                  (Dep (Local, LocalMap), Level (..),
                                             hintLevel)
    import           Util                   (PrettyPrint (prettyprint))
    
    
    -- based on the startling observation that Data.Map has lower complexity
    -- for difference than Data.Set, but the same complexity for fromList
    type Set a = Map a ()
    setFromList :: Ord a => [a] -> Set a
    setFromList  = M.fromList . flip zip (repeat ())
    listFromSet :: Set a -> [a]
    listFromSet = map fst . M.toList
    
    -- | Result of linting an entire directory / repository
    data DirResult = DirResult
      { dirresultMaps          :: Map FilePath MapResult
      -- ^ all maps of this respository, by (local) filepath
      , dirresultDeps          :: [MissingDep]
      -- ^ all dependencies to things outside this repository
      , dirresultMissingAssets :: [MissingAsset]
      -- ^ entrypoints of maps which are referred to but missing
      } deriving (Generic)
    
    data MissingDep = MissingDep
      { entrypoint :: Text
      , neededBy   :: [FilePath]
      } deriving (Generic, ToJSON)
    
    -- | Missing assets are the same thing as missing dependencies,
    -- but should not be confused (and also serialise differently
    -- to json)
    newtype MissingAsset = MissingAsset MissingDep
    
    -- | given this config, should the result be considered to have failed?
    resultIsFatal :: LintConfig' -> DirResult -> Bool
    resultIsFatal config res = maximumLintLevel res > configMaxLintLevel config
    
    -- | maximum lint level that was observed anywhere in any map.