hackport-0.7.1.2: src/Portage/Cabal.hs
{-|
Module : Portage.Cabal
License : GPL-3+
Maintainer : haskell@gentoo.org
Utilities to extract and manipulate information from a package's @.cabal@ file,
such as its license and dependencies.
-}
module Portage.Cabal
( convertLicense
, partition_depends
) where
import qualified Data.List as L
import qualified Distribution.License as Cabal
import qualified Distribution.SPDX as SPDX
import qualified Distribution.Package as Cabal
import qualified Distribution.Pretty as Cabal
-- | Convert the Cabal 'SPDX.License' into the Gentoo format, as a 'String'.
--
-- Generally, if the license is one of the common free-software or
-- open-source licenses, 'convertLicense' should return the license
-- as a 'Right' 'String':
--
-- >>> convertLicense (SPDX.License $ SPDX.simpleLicenseExpression SPDX.GPL_3_0_or_later)
-- Right "GPL-3+"
--
-- >>> convertLicense (SPDX.License $ SPDX.simpleLicenseExpression SPDX.GPL_3_0_only)
-- Right "GPL-3"
--
-- If it is a more obscure license, this should alert the user by returning
-- a 'Left' 'String':
--
-- >>> convertLicense (SPDX.License $ SPDX.simpleLicenseExpression SPDX.EUPL_1_1)
-- Left ...
convertLicense :: SPDX.License -> Either String String
convertLicense l =
case Cabal.licenseFromSPDX l of
-- good ones
Cabal.AGPL mv -> Right $ "AGPL-" ++ case Cabal.prettyShow <$> mv of
Just "3" -> "3"
Just "3.0" -> "3+"
_ -> "3" -- almost certainly version 3
Cabal.GPL mv -> Right $ "GPL-" ++ case Cabal.prettyShow <$> mv of
Just "2" -> "2"
Just "2.0" -> "2+"
Just "3" -> "3"
Just "3.0" -> "3+"
_ -> "2" -- possibly version 2
Cabal.LGPL mv -> Right $ "LGPL-" ++ case Cabal.prettyShow <$> mv of
Just "2" -> "2"
-- Cabal can't handle 2.0+ properly
Just "2.0" -> "2"
Just "3" -> "3"
Just "3.0" -> "3+"
_ -> "2.1" -- probably version 2.1
Cabal.BSD2 -> Right "BSD-2"
Cabal.BSD3 -> Right "BSD"
Cabal.BSD4 -> Right "BSD-4"
Cabal.PublicDomain -> Right "public-domain"
Cabal.MIT -> Right "MIT"
Cabal.Apache mv -> Right $ "Apache-" ++
maybe "1.1" Cabal.prettyShow mv -- probably version 1.1
Cabal.ISC -> Right "ISC"
Cabal.MPL v -> Right $ "MPL-" ++ Cabal.prettyShow v -- probably version 1.0
-- bad ones
Cabal.AllRightsReserved -> Left "EULA-style licence. Please pick it manually."
Cabal.UnknownLicense _ -> Left "license unknown to cabal. Please pick it manually."
Cabal.OtherLicense -> Left "(Other) Please look at license file of package and pick it manually."
Cabal.UnspecifiedLicense -> Left "(Unspecified) Please look at license file of package and pick it manually."
-- | Extract only the dependencies which are not bundled with @GHC@.
partition_depends :: [Cabal.PackageName] -> Cabal.PackageName -> [Cabal.Dependency] -> ([Cabal.Dependency], [Cabal.Dependency])
partition_depends ghc_package_names merged_cabal_pkg_name = L.partition (not . is_internal_depend)
where is_internal_depend (Cabal.Dependency pn _vr _lib) = is_itself || is_ghc_package
where is_itself = pn == merged_cabal_pkg_name
is_ghc_package = pn `elem` ghc_package_names