module Distribution.ArchLinux.HackageTranslation where
import Distribution.Package
import Distribution.PackageDescription
import Distribution.PackageDescription.Parse
import Distribution.Text
import Data.Char
import qualified Data.Map as M
import qualified Data.Set as Set
import Data.Maybe
import qualified Codec.Archive.Tar as Tar
import qualified Data.ByteString.Lazy.Char8 as Bytes
import Debug.Trace
getCabalsFromTarball :: Bytes.ByteString -> [GenericPackageDescription]
getCabalsFromTarball tarball = Tar.foldEntries insertThis [] (const []) files
where files = Tar.read tarball
insertThis file list = case getCabalFromEntry file of
Nothing -> list
Just pkg -> pkg:list
getCabalFromEntry :: Tar.Entry -> Maybe GenericPackageDescription
getCabalFromEntry file = case Tar.entryContent file of
Tar.NormalFile contents _ -> parse2maybe $ parsePackageDescription $ Bytes.unpack contents
otherwise -> Nothing
parse2maybe a = case a of
ParseOk _ pkg -> Just pkg
otherwise -> Nothing
getSpecifiedCabalsFromTarball :: Bytes.ByteString -> [String] -> [GenericPackageDescription]
getSpecifiedCabalsFromTarball tarball list =
getSpecifiedCabals (mapMaybe parsePackageIdentifier list) (getCabalsFromTarball tarball)
parsePackageIdentifier :: String -> Maybe PackageIdentifier
parsePackageIdentifier s = case words s of
name:version:_ -> case ver of
Nothing -> void
Just v -> Just $ PackageIdentifier { pkgName = PackageName name ,
pkgVersion = v }
where ver = simpleParse version
otherwise -> void
where
void = Debug.Trace.trace("Malformed package identifier " ++ s) Nothing
getSpecifiedCabals :: [PackageIdentifier] -> [GenericPackageDescription] -> [GenericPackageDescription]
getSpecifiedCabals list packages = filter wasSpecified packages
where set = Set.fromList list
wasSpecified p = Set.member (packageId p) set