{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE PatternGuards #-}
module Distribution.Backpack.Id(
computeComponentId,
computeCompatPackageKey,
) where
import Prelude ()
import Distribution.Compat.Prelude
import Distribution.Types.UnqualComponentName
import Distribution.Simple.Compiler
import Distribution.PackageDescription
import Distribution.Simple.Setup as Setup
import qualified Distribution.Simple.InstallDirs as InstallDirs
import Distribution.Simple.LocalBuildInfo
import Distribution.Types.ComponentId
import Distribution.Types.UnitId
import Distribution.Types.MungedPackageName
import Distribution.Utils.Base62
import Distribution.Version
import Distribution.Pretty
( prettyShow )
import Distribution.Parsec ( simpleParsec )
computeComponentId
:: Bool
-> Flag String
-> Flag ComponentId
-> PackageIdentifier
-> ComponentName
-> Maybe ([ComponentId], FlagAssignment)
-> ComponentId
computeComponentId :: Bool
-> Flag String
-> Flag ComponentId
-> PackageIdentifier
-> ComponentName
-> Maybe ([ComponentId], FlagAssignment)
-> ComponentId
computeComponentId Bool
deterministic Flag String
mb_ipid Flag ComponentId
mb_cid PackageIdentifier
pid ComponentName
cname Maybe ([ComponentId], FlagAssignment)
mb_details =
let hash_suffix :: String
hash_suffix
| Just ([ComponentId]
dep_ipids, FlagAssignment
flags) <- Maybe ([ComponentId], FlagAssignment)
mb_details
= String
"-" forall a. [a] -> [a] -> [a]
++ String -> String
hashToBase62
( forall a. Pretty a => a -> String
prettyShow PackageIdentifier
pid
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show [ComponentId]
dep_ipids
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show FlagAssignment
flags )
| Bool
otherwise = String
""
generated_base :: String
generated_base = forall a. Pretty a => a -> String
prettyShow PackageIdentifier
pid forall a. [a] -> [a] -> [a]
++ String
hash_suffix
explicit_base :: String -> String
explicit_base String
cid0 = PathTemplate -> String
fromPathTemplate (PathTemplateEnv -> PathTemplate -> PathTemplate
InstallDirs.substPathTemplate PathTemplateEnv
env
(String -> PathTemplate
toPathTemplate String
cid0))
where env :: PathTemplateEnv
env = PackageIdentifier -> UnitId -> PathTemplateEnv
packageTemplateEnv PackageIdentifier
pid (String -> UnitId
mkUnitId String
"")
actual_base :: String
actual_base = case Flag String
mb_ipid of
Flag String
ipid0 -> String -> String
explicit_base String
ipid0
Flag String
NoFlag | Bool
deterministic -> forall a. Pretty a => a -> String
prettyShow PackageIdentifier
pid
| Bool
otherwise -> String
generated_base
in case Flag ComponentId
mb_cid of
Flag ComponentId
cid -> ComponentId
cid
Flag ComponentId
NoFlag -> String -> ComponentId
mkComponentId forall a b. (a -> b) -> a -> b
$ String
actual_base
forall a. [a] -> [a] -> [a]
++ (case ComponentName -> Maybe UnqualComponentName
componentNameString ComponentName
cname of
Maybe UnqualComponentName
Nothing -> String
""
Just UnqualComponentName
s -> String
"-" forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
unUnqualComponentName UnqualComponentName
s)
computeCompatPackageKey
:: Compiler
-> MungedPackageName
-> Version
-> UnitId
-> String
computeCompatPackageKey :: Compiler -> MungedPackageName -> Version -> UnitId -> String
computeCompatPackageKey Compiler
comp MungedPackageName
pkg_name Version
pkg_version UnitId
uid
| Bool -> Bool
not (Compiler -> Bool
packageKeySupported Compiler
comp Bool -> Bool -> Bool
|| Compiler -> Bool
unitIdSupported Compiler
comp)
= forall a. Pretty a => a -> String
prettyShow MungedPackageName
pkg_name forall a. [a] -> [a] -> [a]
++ String
"-" forall a. [a] -> [a] -> [a]
++ forall a. Pretty a => a -> String
prettyShow Version
pkg_version
| Bool -> Bool
not (Compiler -> Bool
unifiedIPIDRequired Compiler
comp) =
let str :: String
str = UnitId -> String
unUnitId UnitId
uid
mb_verbatim_key :: Maybe String
mb_verbatim_key
= case forall a. Parsec a => String -> Maybe a
simpleParsec String
str :: Maybe PackageId of
Just PackageIdentifier
pid0 | forall a. Pretty a => a -> String
prettyShow PackageIdentifier
pid0 forall a. Eq a => a -> a -> Bool
== String
str -> forall a. a -> Maybe a
Just String
str
Maybe PackageIdentifier
_ -> forall a. Maybe a
Nothing
mb_truncated_key :: Maybe String
mb_truncated_key
= let cand :: String
cand = forall a. [a] -> [a]
reverse (forall a. (a -> Bool) -> [a] -> [a]
takeWhile Char -> Bool
isAlphaNum (forall a. [a] -> [a]
reverse String
str))
in if forall (t :: * -> *) a. Foldable t => t a -> Int
length String
cand forall a. Eq a => a -> a -> Bool
== Int
22 Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isAlphaNum String
cand
then forall a. a -> Maybe a
Just String
cand
else forall a. Maybe a
Nothing
rehashed_key :: String
rehashed_key = String -> String
hashToBase62 String
str
in forall a. a -> Maybe a -> a
fromMaybe String
rehashed_key (Maybe String
mb_verbatim_key forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Maybe String
mb_truncated_key)
| Bool
otherwise = forall a. Pretty a => a -> String
prettyShow UnitId
uid