Use Stack (executable) to get licenses

This commit is contained in:
Juan Pedro Villa Isaza 2019-02-05 16:01:07 -05:00
parent 4f4d41d986
commit ec8412b4ca
2 changed files with 41 additions and 5 deletions

View File

@ -101,6 +101,7 @@ main = do
return (Just package) return (Just package)
maybeDependencies <- getDependencies maybeDependencies <- getDependencies
maybeLicenses <- getLicenses
case maybeDependencies of case maybeDependencies of
Nothing -> Nothing ->
@ -108,7 +109,7 @@ main = do
Just dependencies -> do Just dependencies -> do
(dependenciesByLicense', failed) <- (dependenciesByLicense', failed) <-
orderPackagesByLicense quiet pid dependencies orderPackagesByLicense quiet pid maybeLicenses dependencies
let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense' let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense'

View File

@ -16,6 +16,7 @@ module Licensor
( LiLicense(..) ( LiLicense(..)
, LiPackage(..) , LiPackage(..)
, getDependencies , getDependencies
, getLicenses
, getPackage , getPackage
, orderPackagesByLicense , orderPackagesByLicense
, version , version
@ -126,12 +127,45 @@ getDependencies = do
return $ fmap Set.fromList $ sequence $ fmap simpleParse (lines deps) return $ fmap Set.fromList $ sequence $ fmap simpleParse (lines deps)
getLicenses :: IO (Maybe [(PackageName, License)])
getLicenses = do
eitherDeps <-
Exception.try $ readProcess "stack" ["ls", "dependencies", "--license"] ""
case eitherDeps of
Left (_ :: IOError) ->
return Nothing
Right deps ->
return $ sequence $ fmap toNameLicense (lines deps)
where
toNameLicense dep =
case words dep of
[name, license] ->
(,) <$> simpleParse name <*> simpleParse license
_ ->
Nothing
-- | -- |
-- --
-- --
getPackageLicense :: Bool -> PackageIdentifier -> IO (Maybe LiLicense) getPackageLicense
getPackageLicense quiet p@PackageIdentifier{..} = do :: Bool
-> PackageIdentifier
-> Maybe [(PackageName, License)]
-> IO (Maybe LiLicense)
getPackageLicense quiet p@PackageIdentifier{..} (Just licenses) = do
unless quiet (putStr $ display p ++ "...")
case lookup pkgName licenses of
Just license -> do
unless quiet (putStrLn $ display license)
return $ Just (LiLicense license)
Nothing ->
return Nothing
getPackageLicense quiet p@PackageIdentifier{..} Nothing = do
unless quiet (putStr $ display p ++ "...") unless quiet (putStr $ display p ++ "...")
let let
url = url =
@ -169,15 +203,16 @@ getPackageLicense quiet p@PackageIdentifier{..} = do
orderPackagesByLicense orderPackagesByLicense
:: Bool :: Bool
-> Maybe PackageIdentifier -> Maybe PackageIdentifier
-> Maybe [(PackageName, License)]
-> Set PackageIdentifier -> Set PackageIdentifier
-> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier) -> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier)
orderPackagesByLicense quiet maybeP = orderPackagesByLicense quiet maybeP maybeLicenses =
let let
cond = cond =
maybe (const False) (==) maybeP maybe (const False) (==) maybeP
insertPackage package orderedPackages' = do insertPackage package orderedPackages' = do
maybeLicense <- getPackageLicense quiet package maybeLicense <- getPackageLicense quiet package maybeLicenses
(orderedPackages, failed) <- orderedPackages' (orderedPackages, failed) <- orderedPackages'
return $ return $