packages feed

hackport-0.5.1: Portage/Cabal.hs

module Portage.Cabal
  ( fromOverlay
  , convertLicense
  , partition_depends
  ) where

import qualified Data.List as L
import qualified Data.Map as Map

import qualified Distribution.Simple.PackageIndex as Cabal
import qualified Distribution.License             as Cabal
import qualified Distribution.Package             as Cabal
import qualified Distribution.Text                as Cabal

import qualified Portage.Overlay as Portage

fromOverlay :: Portage.Overlay -> Cabal.PackageIndex Portage.ExistingEbuild
fromOverlay overlay = Cabal.fromList $
  [ ebuild
  | (_pn, ebuilds) <- Map.toAscList (Portage.overlayMap overlay)
  , ebuild <- ebuilds
  ]

-- map the cabal license type to the gentoo license string format
convertLicense :: Cabal.License -> Either String String
convertLicense l =
    case l of
        --  good ones
        Cabal.AGPL mv      -> Right $ "AGPL-" ++ (maybe "3" Cabal.display mv)  -- almost certainly version 3
        Cabal.GPL mv       -> Right $ "GPL-" ++ (maybe "2" Cabal.display mv)  -- almost certainly version 2
        Cabal.LGPL mv      -> Right $ "LGPL-" ++ (maybe "2.1" Cabal.display mv) -- 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.display mv) -- probably version 1.1
        Cabal.ISC          -> Right "ISC"
        Cabal.MPL v        -> Right $ "MPL-" ++ Cabal.display 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."

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) = is_itself || is_ghc_package
              where is_itself = pn == merged_cabal_pkg_name
                    is_ghc_package = pn `elem` ghc_package_names