arch-hs 0.9.0.0 → 0.9.1.0
raw patch · 13 files changed
+144/−120 lines, 13 filesdep ~megaparsecdep ~polysemydep ~template-haskellPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: megaparsec, polysemy, template-haskell
API changes (from Hackage documentation)
+ Distribution.ArchHs.Compat: pattern PkgFlag :: FlagName -> ConfVar
+ Distribution.ArchHs.Compat: type PkgFlag = Flag
+ Distribution.ArchHs.Core: collectExeDeps :: (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) => ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) -> GenericPackageDescription -> [UnqualComponentName] -> Sem r (a, a, [SystemDependency])
+ Distribution.ArchHs.Core: collectLibDeps :: (Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a, Monoid a) => ([(PackageName, VersionRange)] -> a) -> GenericPackageDescription -> Sem r (a, a, [SystemDependency])
+ Distribution.ArchHs.Core: collectSetupDeps :: (Member Trace r, Show a, Monoid a) => ([(PackageName, VersionRange)] -> a) -> GenericPackageDescription -> Sem r a
+ Distribution.ArchHs.Core: collectSubLibDeps :: (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) => ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) -> GenericPackageDescription -> [UnqualComponentName] -> Sem r (a, a, [SystemDependency])
+ Distribution.ArchHs.Core: collectTestDeps :: (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) => ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) -> GenericPackageDescription -> [UnqualComponentName] -> Sem r (a, a, [SystemDependency])
+ Distribution.ArchHs.Core: subsumeGHCVersion :: Members [CommunityEnv, WithMyErr] r => InterpreterFor KnownGHCVersion r
+ Distribution.ArchHs.Types: type KnownGHCVersion = Reader Version
- Distribution.ArchHs.Core: evalConditionTree :: (HasCallStack, Semigroup k, HasBuildInfo k, Members [FlagAssignmentsEnv, Trace] r) => GenericPackageDescription -> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
+ Distribution.ArchHs.Core: evalConditionTree :: (HasCallStack, Semigroup k, HasBuildInfo k, Members [KnownGHCVersion, FlagAssignmentsEnv, Trace] r) => GenericPackageDescription -> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
- Distribution.ArchHs.Core: getDependencies :: (HasCallStack, Members [HackageEnv, FlagAssignmentsEnv, WithMyErr, DependencyRecord, State (Set PackageName), Trace] r) => [UnqualComponentName] -> Maybe PackageName -> PackageName -> Sem r (AdjacencyMap (Set DependencyType) PackageName, Set PackageName, Map PackageName [SystemDependency])
+ Distribution.ArchHs.Core: getDependencies :: (HasCallStack, Members [KnownGHCVersion, HackageEnv, FlagAssignmentsEnv, WithMyErr, DependencyRecord, State (Set PackageName), Trace] r) => [UnqualComponentName] -> Maybe PackageName -> PackageName -> Sem r (AdjacencyMap (Set DependencyType) PackageName, Set PackageName, Map PackageName [SystemDependency])
- Distribution.ArchHs.Hackage: getPackageFlag :: Members [HackageEnv, WithMyErr] r => PackageName -> Sem r [Flag]
+ Distribution.ArchHs.Hackage: getPackageFlag :: Members [HackageEnv, WithMyErr] r => PackageName -> Sem r [PkgFlag]
- Distribution.ArchHs.PP: prettyFlags :: [(PackageName, [Flag])] -> Doc AnsiStyle
+ Distribution.ArchHs.PP: prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle
Files
- CHANGELOG.md +8/−0
- README.md +2/−2
- app/Json.hs +3/−3
- app/Main.hs +2/−2
- arch-hs.cabal +6/−5
- diff/Diff.hs +12/−72
- diff/Main.hs +2/−1
- src/Distribution/ArchHs/Compat.hs +22/−0
- src/Distribution/ArchHs/Core.hs +78/−32
- src/Distribution/ArchHs/Hackage.hs +1/−1
- src/Distribution/ArchHs/Internal/Prelude.hs +2/−0
- src/Distribution/ArchHs/PP.hs +2/−2
- src/Distribution/ArchHs/Types.hs +4/−0
CHANGELOG.md view
@@ -3,6 +3,14 @@ `arch-hs` uses [PVP Versioning][1]. The changelog is available [on GitHub][2]. +## 0.9.1.0++* Support Cabal 3.4++* Use the version of [`haskell-ghc`](https://archlinux.org/packages/community/x86_64/ghc/) to evaluate condition trees++* Fix the bug that sub-lib components appear wrongly in results+ ## 0.9.0.0 * Remove `arch-hs-submit` executable
README.md view
@@ -6,8 +6,8 @@ | Env | CI | | ---------------- | ------------------------------------------------------------------------------------------------------------------------- |-| pacman (-f alpm) | [](https://github.com/berberman/arch-hs/actions) |-| cabal-install | [](https://travis-ci.com/berberman/arch-hs) |+| pacman (-f alpm) | [](https://github.com/berberman/arch-hs/actions/workflows/archlinux.yml) |+| cabal-install | [](https://github.com/berberman/arch-hs/actions/workflows/ci.yml) | A program generating PKGBUILD for hackage packages. Special thanks to [felixonmars](https://github.com/felixonmars/).
app/Json.hs view
@@ -31,7 +31,7 @@ archLinuxName :: ArchLinuxName -> Value archLinuxName (ArchLinuxName name) = String $ T.pack name -flag :: Flag -> Value+flag :: PkgFlag -> Value flag f = object [ "name" .= unFlagName (flagName f),@@ -99,7 +99,7 @@ data FlagsS = FlagsS { fPkg :: PackageName,- fFlag :: [Flag]+ fFlag :: [PkgFlag] } instance ToJSON FlagsS where@@ -137,5 +137,5 @@ fromSolvedPackage ProvidedPackage {..} = SolvedPackageS _pkgName [] (Just _pkgProvider) fromSolvedPackage SolvedPackage {..} = SolvedPackageS _pkgName (fromSolvedDependency <$> _pkgDeps) Nothing -fromFlag :: (PackageName, [Flag]) -> FlagsS+fromFlag :: (PackageName, [PkgFlag]) -> FlagsS fromFlag (fPkg, fFlag) = FlagsS {..}
app/Main.hs view
@@ -42,7 +42,7 @@ import System.FilePath (takeFileName) app ::- Members '[Embed IO, State (Set.Set PackageName), CommunityEnv, HackageEnv, FlagAssignmentsEnv, DependencyRecord, Trace, Aur, WithMyErr] r =>+ Members '[Embed IO, State (Set.Set PackageName), KnownGHCVersion, CommunityEnv, HackageEnv, FlagAssignmentsEnv, DependencyRecord, Trace, Aur, WithMyErr] r => PackageName -> FilePath -> Bool ->@@ -337,7 +337,7 @@ optFileTrace ref manager- (app optTarget optOutputDir optAur optSkip optUusi optForce optMetaDir optJson (loadFilesDBFromOptions optFilesDB))+ (subsumeGHCVersion $ app optTarget optOutputDir optAur optSkip optUusi optForce optMetaDir optJson (loadFilesDBFromOptions optFilesDB)) & printAppResult -----------------------------------------------------------------------------
arch-hs.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: arch-hs-version: 0.9.0.0+version: 0.9.1.0 synopsis: Distribute hackage packages to archlinux description: @arch-hs@ is a command-line program, which simplifies the process of producing@@ -23,7 +23,7 @@ CHANGELOG.md README.md -tested-with: GHC ==8.10.4+tested-with: GHC ==8.10.5 || ==9.0.1 source-repository head type: git@@ -52,18 +52,18 @@ , hackage-db ^>=2.1.0 , http-client , http-client-tls- , megaparsec ^>=9.0.0+ , megaparsec ^>=9.0.0 || ^>=9.1.0 , microlens ^>=0.4.11 , microlens-th ^>=0.4.3 , neat-interpolation ^>=0.5.1 , optparse-simple ^>=0.1.1.3- , polysemy+ , polysemy ^>=1.5.0 || ^>=1.6.0 , prettyprinter ^>=1.7.0 , prettyprinter-ansi-terminal ^>=1.1.2 , servant-client ^>=0.18.2 , split ^>=0.2.3 , tar-conduit ^>=0.3.2- , template-haskell ^>=2.16.0+ , template-haskell ^>=2.16.0 || ^>=2.17.0 , text ghc-options:@@ -99,6 +99,7 @@ exposed-modules: Distribution.ArchHs.Aur Distribution.ArchHs.CommunityDB+ Distribution.ArchHs.Compat Distribution.ArchHs.Core Distribution.ArchHs.Exception Distribution.ArchHs.FilesDB
diff/Diff.hs view
@@ -8,81 +8,20 @@ import Data.Algorithm.Diff import qualified Data.ByteString.Lazy as LBS-import qualified Data.Map.Strict as Map import Data.Maybe (catMaybes, fromJust) import Distribution.ArchHs.CommunityDB (versionInCommunity)-import Distribution.ArchHs.Core (evalConditionTree)+import Distribution.ArchHs.Core import Distribution.ArchHs.Exception import Distribution.ArchHs.Internal.Prelude import Distribution.ArchHs.PP import Distribution.ArchHs.Types import Distribution.ArchHs.Utils-import Distribution.PackageDescription (CondTree, ConfVar) import Distribution.PackageDescription.Parsec (parseGenericPackageDescriptionMaybe)-import qualified Distribution.Types.BuildInfo.Lens as L-import Distribution.Types.Dependency (Dependency)-import Distribution.Types.SetupBuildInfo import Distribution.Utils.ShortText (fromShortText) import Network.HTTP.Client ---------------------------------------------------------------------------------- Duplicated from Core.hs with modifications.- type VersionedList = [(PackageName, VersionRange)] -type VersionedComponentList = [(UnqualComponentName, VersionedList)]--collectLibDeps :: Members [FlagAssignmentsEnv, Trace, DependencyRecord] r => GenericPackageDescription -> Sem r (VersionedList, VersionedList)-collectLibDeps cabal = do- case cabal & condLibrary of- Just lib -> do- bInfo <- evalConditionTree cabal lib- let libDeps = unDepV <$> buildDependsIfBuild bInfo- toolDeps = unBuildTools $ buildToolsAndbuildToolDependsIfBuild bInfo- mapM_ (uncurry updateDependencyRecord) libDeps- mapM_ (uncurry updateDependencyRecord) toolDeps- return (libDeps, toolDeps)- Nothing -> return ([], [])--collectComponentialDeps ::- (Semigroup k, L.HasBuildInfo k, Members [FlagAssignmentsEnv, Trace, DependencyRecord] r) =>- (GenericPackageDescription -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]) ->- GenericPackageDescription ->- [UnqualComponentName] ->- Sem r (VersionedComponentList, VersionedComponentList)-collectComponentialDeps f cabal skip = do- let exes = cabal & f- bInfo <- filter (not . (`elem` skip) . fst) . zip (exes <&> fst) <$> mapM (evalConditionTree cabal . snd) exes- let deps = bInfo <&> _2 %~ (fmap unDepV . buildDependsIfBuild)- toolDeps = bInfo <&> _2 %~ (unBuildTools . buildToolsAndbuildToolDependsIfBuild)- mapM_ (uncurry updateDependencyRecord) $ deps ^.. each . _2 ^. each- mapM_ (uncurry updateDependencyRecord) $ toolDeps ^.. each . _2 ^. each- return (deps, toolDeps)--collectExeDeps :: Members [FlagAssignmentsEnv, Trace, DependencyRecord] r => GenericPackageDescription -> [UnqualComponentName] -> Sem r (VersionedComponentList, VersionedComponentList)-collectExeDeps = collectComponentialDeps condExecutables--collectTestDeps :: Members [FlagAssignmentsEnv, Trace, DependencyRecord] r => GenericPackageDescription -> [UnqualComponentName] -> Sem r (VersionedComponentList, VersionedComponentList)-collectTestDeps = collectComponentialDeps condTestSuites--collectSubLibDeps :: Members [FlagAssignmentsEnv, Trace, DependencyRecord] r => GenericPackageDescription -> [UnqualComponentName] -> Sem r (VersionedComponentList, VersionedComponentList)-collectSubLibDeps = collectComponentialDeps condSubLibraries--collectSetupDeps :: Member Trace r => GenericPackageDescription -> Sem r VersionedList-collectSetupDeps cabal = do- let name = getPkgName' cabal- trace' $ "Getting setup dependencies of " <> show name- case setupBuildInfo $ packageDescription cabal of- Just (SetupBuildInfo deps _) -> do- let result = unDepV <$> deps- trace' $ "Found: " <> show result- return result- _ -> return []--updateDependencyRecord :: Member DependencyRecord r => PackageName -> VersionRange -> Sem r ()-updateDependencyRecord name range = modify' $ Map.insertWith (<>) name [range]- ----------------------------------------------------------------------------- getCabalFromHackage :: Members [Embed IO, WithMyErr, Reader Manager] r => PackageName -> Version -> Sem r GenericPackageDescription@@ -98,15 +37,15 @@ _ -> error "Failed to parse .cabal file" directDependencies ::- Members [FlagAssignmentsEnv, Trace, DependencyRecord] r =>+ Members [KnownGHCVersion, FlagAssignmentsEnv, Trace, DependencyRecord] r => GenericPackageDescription -> Sem r (VersionedList, VersionedList) directDependencies cabal = do- (libDeps, libToolsDeps) <- collectLibDeps cabal- (subLibDeps, subLibToolsDeps) <- collectSubLibDeps cabal []- (exeDeps, exeToolsDeps) <- collectExeDeps cabal []- (testDeps, testToolsDeps) <- collectTestDeps cabal []- setupDeps <- collectSetupDeps cabal+ (libDeps, libToolsDeps, _) <- collectLibDeps id cabal+ (subLibDeps, subLibToolsDeps, _) <- collectSubLibDeps id cabal []+ (exeDeps, exeToolsDeps, _) <- collectExeDeps id cabal []+ (testDeps, testToolsDeps, _) <- collectTestDeps id cabal []+ setupDeps <- collectSetupDeps id cabal let flatten = mconcat . fmap snd l = libDeps lt = libToolsDeps@@ -116,8 +55,9 @@ et = flatten exeToolsDeps t = flatten testDeps tt = flatten testToolsDeps- notMyself = (/= getPkgName' cabal)- distinct = filter (notMyself . fst) . nub+ mySubLibs = fmap (unqualComponentNameToPackageName . fst) subLibDeps+ notMyselfOrSubLib = (&&) <$> (/= getPkgName' cabal) <*> (`notElem` mySubLibs)+ distinct = filter (notMyselfOrSubLib . fst) . nub depends = distinct $ l <> sl <> e makedepends = distinct (lt <> slt <> et <> t <> tt <> setupDeps) \\ depends sort' = sortBy (\x y -> uncurry compare $ getTwo _1 x y)@@ -125,7 +65,7 @@ ----------------------------------------------------------------------------- -diffCabal :: Members [CommunityEnv, FlagAssignmentsEnv, WithMyErr, Trace, DependencyRecord, Reader Manager, Embed IO] r => PackageName -> Version -> Version -> Sem r ()+diffCabal :: Members [KnownGHCVersion, CommunityEnv, FlagAssignmentsEnv, WithMyErr, Trace, DependencyRecord, Reader Manager, Embed IO] r => PackageName -> Version -> Version -> Sem r () diffCabal name a b = do ga <- getCabalFromHackage name a gb <- getCabalFromHackage name b@@ -228,7 +168,7 @@ joinToString xs = indent 2 $ vsep xs joinVersionWithName (n, range) = unPackageName n <> " " <> prettyShow range -flags :: PackageName -> [Flag] -> [Flag] -> Doc AnsiStyle+flags :: PackageName -> [PkgFlag] -> [PkgFlag] -> Doc AnsiStyle flags name a b = annMagneta "Flags" <> colon <> line <> if noDiff diff
diff/Main.hs view
@@ -9,6 +9,7 @@ import qualified Data.Map as Map import Data.Text.Prettyprint.Doc.Render.Terminal import Diff+import Distribution.ArchHs.Core (subsumeGHCVersion) import Distribution.ArchHs.Exception import Distribution.ArchHs.Internal.Prelude import Distribution.ArchHs.Options@@ -34,7 +35,7 @@ manager <- newTlsManager printInfo "Start running..."- runDiff community optFlags manager (diffCabal optPackageName optVersionA optVersionB) & printAppResult+ runDiff community optFlags manager (subsumeGHCVersion $ diffCabal optPackageName optVersionA optVersionB) & printAppResult runDiff :: CommunityDB ->
+ src/Distribution/ArchHs/Compat.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE PatternSynonyms #-}++module Distribution.ArchHs.Compat+ ( pattern PkgFlag,+ PkgFlag,+ )+where++import Distribution.Types.ConfVar+import Distribution.Types.Flag++pattern PkgFlag :: FlagName -> ConfVar+{-# COMPLETE PkgFlag #-}++#if MIN_VERSION_Cabal(3,4,0)+type PkgFlag = PackageFlag+pattern PkgFlag x = PackageFlag x+#else+type PkgFlag = Flag+pattern PkgFlag x = Flag x+#endif
src/Distribution/ArchHs/Core.hs view
@@ -11,6 +11,14 @@ ( getDependencies, cabalToPkgBuild, evalConditionTree,+ subsumeGHCVersion,++ -- * Helper functions+ collectLibDeps,+ collectExeDeps,+ collectTestDeps,+ collectSubLibDeps,+ collectSetupDeps, ) where @@ -18,8 +26,10 @@ import Data.Bifunctor (second) import Data.Containers.ListUtils (nubOrd) import qualified Data.Map as Map+import Data.Maybe (fromMaybe) import Data.Set (Set) import qualified Data.Set as Set+import Distribution.ArchHs.CommunityDB (versionInCommunity) import Distribution.ArchHs.Exception import Distribution.ArchHs.Hackage ( getLatestCabal,@@ -36,7 +46,7 @@ import Distribution.ArchHs.Types import Distribution.ArchHs.Utils import Distribution.Compiler (CompilerFlavor (..))-import Distribution.PackageDescription+import Distribution.PackageDescription hiding (pkgName) import Distribution.SPDX import Distribution.System (Arch (X86_64), OS (Linux)) import qualified Distribution.Types.BuildInfo.Lens as L@@ -44,21 +54,21 @@ import Distribution.Types.Dependency (Dependency) import Distribution.Utils.ShortText (fromShortText) -archEnv :: FlagAssignment -> ConfVar -> Either ConfVar Bool-archEnv _ (OS Linux) = Right True-archEnv _ (OS _) = Right False-archEnv _ (Arch X86_64) = Right True-archEnv _ (Arch _) = Right False-archEnv _ (Impl GHC range) = Right $ withinRange (mkVersion [8, 10, 4]) range-archEnv _ (Impl _ _) = Right False-archEnv assignment f@(Flag f') = go f $ lookupFlagAssignment f' assignment+archEnv :: Version -> FlagAssignment -> ConfVar -> Either ConfVar Bool+archEnv _ _ (OS Linux) = Right True+archEnv _ _ (OS _) = Right False+archEnv _ _ (Arch X86_64) = Right True+archEnv _ _ (Arch _) = Right False+archEnv ghcVersion _ (Impl GHC range) = Right $ withinRange ghcVersion range+archEnv _ _ (Impl _ _) = Right False+archEnv _ assignment f@(PkgFlag f') = go f $ lookupFlagAssignment f' assignment where go _ (Just r) = Right r go x Nothing = Left x -- | Simplify the condition tree from 'GenericPackageDescription' with given flag assignments and archlinux system assumption. evalConditionTree ::- (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [FlagAssignmentsEnv, Trace] r) =>+ (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [KnownGHCVersion, FlagAssignmentsEnv, Trace] r) => GenericPackageDescription -> CondTree ConfVar [Dependency] k -> Sem r BuildInfo@@ -80,7 +90,8 @@ trace' $ "Evaluating condition tree of " <> show name trace' $ "Flags: " <> show thisFlag traceCallStack- return $ (^. L.buildInfo) . snd $ simplifyCondTree (archEnv thisFlag) cond+ ghcVersion <- ask+ return $ (^. L.buildInfo) . snd $ simplifyCondTree (archEnv ghcVersion thisFlag) cond ----------------------------------------------------------------------------- @@ -88,7 +99,7 @@ -- All version constraints will be discarded, -- and only packages depended by executables, libraries, and test suits will be collected. getDependencies ::- (HasCallStack, Members [HackageEnv, FlagAssignmentsEnv, WithMyErr, DependencyRecord, State (Set PackageName), Trace] r) =>+ (HasCallStack, Members [KnownGHCVersion, HackageEnv, FlagAssignmentsEnv, WithMyErr, DependencyRecord, State (Set PackageName), Trace] r) => -- | Skipped [UnqualComponentName] -> -- | Parent@@ -103,11 +114,14 @@ trace' $ "Already resolved: " <> show resolved traceCallStack cabal <- getLatestCabal name- (libDeps, libToolsDeps, libSysDeps) <- collectLibDeps cabal- (subLibDeps, subLibToolsDeps, subLibSysDeps) <- collectSubLibDeps cabal skip- (exeDeps, exeToolsDeps, exeSysDeps) <- collectExeDeps cabal skip- (testDeps, testToolsDeps, testSysDeps) <- collectTestDeps cabal skip- setupDeps <- collectSetupDeps cabal+ let kIgnoreVersionLib = fmap fst+ kIgnoreVersionComp = fmap (second $ fmap fst)+ kIgnoreVersionSetup = kIgnoreVersionLib+ (libDeps, libToolsDeps, libSysDeps) <- collectLibDeps kIgnoreVersionLib cabal+ (subLibDeps, subLibToolsDeps, subLibSysDeps) <- collectSubLibDeps kIgnoreVersionComp cabal skip+ (exeDeps, exeToolsDeps, exeSysDeps) <- collectExeDeps kIgnoreVersionComp cabal skip+ (testDeps, testToolsDeps, testSysDeps) <- collectTestDeps kIgnoreVersionComp cabal skip+ setupDeps <- collectSetupDeps kIgnoreVersionSetup cabal -- Ignore benchmarks -- (benchDeps, benchToolsDeps) <- collectBenchMarkDeps cabal skip let uname :: (UnqualComponentName -> DependencyType) -> ComponentPkgList -> [(DependencyType, PkgList)]@@ -186,8 +200,12 @@ (if null currentSysDeps then Map.empty else Map.singleton name currentSysDeps) <> nextSys ) -collectLibDeps :: Members [FlagAssignmentsEnv, DependencyRecord, Trace] r => GenericPackageDescription -> Sem r (PkgList, PkgList, [SystemDependency])-collectLibDeps cabal = do+collectLibDeps ::+ (Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a, Monoid a) =>+ ([(PackageName, VersionRange)] -> a) ->+ GenericPackageDescription ->+ Sem r (a, a, [SystemDependency])+collectLibDeps k cabal = do case cabal & condLibrary of Just lib -> do let name = getPkgName' cabal@@ -198,20 +216,21 @@ systemDeps = unSystemDependency $ pkgconfigDependsAndExtraLibsIfBuild info mapM_ (uncurry updateDependencyRecord) libDeps mapM_ (uncurry updateDependencyRecord) toolDeps- let result = (fmap fst libDeps, fmap fst toolDeps, systemDeps)+ let result = (k libDeps, k toolDeps, systemDeps) trace' $ "Found: " <> show result traceCallStack return result- Nothing -> return ([], [], [])+ Nothing -> return mempty -- 'Monoid a' comes from here collectComponentialDeps ::- (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [FlagAssignmentsEnv, DependencyRecord, Trace] r) =>+ (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) => String -> (GenericPackageDescription -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]) ->+ ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) -> GenericPackageDescription -> [UnqualComponentName] ->- Sem r (ComponentPkgList, ComponentPkgList, [SystemDependency])-collectComponentialDeps tag f cabal skip = do+ Sem r (a, a, [SystemDependency])+collectComponentialDeps tag f k cabal skip = do let conds = cabal & f name = getPkgName' cabal trace' $ "Getting " <> tag <> " dependencies of " <> show name@@ -219,7 +238,6 @@ let deps = info <&> _2 %~ (fmap unDepV . buildDependsIfBuild) toolDeps = info <&> _2 %~ (unBuildTools . buildToolsAndbuildToolDependsIfBuild) sysDeps = info <&> _2 %~ (unSystemDependency . pkgconfigDependsAndExtraLibsIfBuild)- k = fmap (second $ fmap fst) mapM_ (uncurry updateDependencyRecord) $ deps ^.. each . _2 ^. each mapM_ (uncurry updateDependencyRecord) $ toolDeps ^.. each . _2 ^. each let result = (k deps, k toolDeps, mconcat $ fmap snd sysDeps)@@ -227,25 +245,44 @@ traceCallStack return result -collectExeDeps :: (HasCallStack, Members [FlagAssignmentsEnv, DependencyRecord, Trace] r) => GenericPackageDescription -> [UnqualComponentName] -> Sem r (ComponentPkgList, ComponentPkgList, [SystemDependency])+collectExeDeps ::+ (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>+ ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->+ GenericPackageDescription ->+ [UnqualComponentName] ->+ Sem r (a, a, [SystemDependency]) collectExeDeps = collectComponentialDeps "exe" condExecutables -collectTestDeps :: (HasCallStack, Members [FlagAssignmentsEnv, DependencyRecord, Trace] r) => GenericPackageDescription -> [UnqualComponentName] -> Sem r (ComponentPkgList, ComponentPkgList, [SystemDependency])+collectTestDeps ::+ (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>+ ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->+ GenericPackageDescription ->+ [UnqualComponentName] ->+ Sem r (a, a, [SystemDependency]) collectTestDeps = collectComponentialDeps "test" condTestSuites -collectSubLibDeps :: (HasCallStack, Members [FlagAssignmentsEnv, DependencyRecord, Trace] r) => GenericPackageDescription -> [UnqualComponentName] -> Sem r (ComponentPkgList, ComponentPkgList, [SystemDependency])+collectSubLibDeps ::+ (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>+ ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->+ GenericPackageDescription ->+ [UnqualComponentName] ->+ Sem r (a, a, [SystemDependency]) collectSubLibDeps = collectComponentialDeps "sublib" condSubLibraries -collectSetupDeps :: Member Trace r => GenericPackageDescription -> Sem r PkgList-collectSetupDeps cabal = do+collectSetupDeps ::+ (Member Trace r, Show a, Monoid a) =>+ ([(PackageName, VersionRange)] -> a) ->+ GenericPackageDescription ->+ Sem r a+collectSetupDeps k cabal = do let name = getPkgName' cabal trace' $ "Getting setup dependencies of " <> show name case setupBuildInfo $ packageDescription cabal of Just (SetupBuildInfo deps _) -> do- let result = fst . unDepV <$> deps+ let result = k $ unDepV <$> deps trace' $ "Found: " <> show result return result- _ -> return []+ _ -> return mempty updateDependencyRecord :: Member DependencyRecord r => PackageName -> VersionRange -> Sem r () updateDependencyRecord name range = modify' $ Map.insertWith (<>) name [range]@@ -311,3 +348,12 @@ _licenseFile = licenseFiles cabal ^? ix 0 _enableUusi = uusi return PkgBuild {..}++-----------------------------------------------------------------------------++-- | Get the ghc version in 'CommunityDB'+subsumeGHCVersion :: Members [CommunityEnv, WithMyErr] r => InterpreterFor KnownGHCVersion r+subsumeGHCVersion m = do+ rawVersion <- versionInCommunity $ ArchLinuxName "haskell-ghc"+ let ghcVersion = fromMaybe (error $ "Impossible: unable to parse ghc version from [community]: " <> rawVersion) $ simpleParsec rawVersion+ runReader ghcVersion m
src/Distribution/ArchHs/Hackage.hs view
@@ -93,7 +93,7 @@ Nothing -> throw $ PkgNotFound name -- | Get flags of a package.-getPackageFlag :: Members [HackageEnv, WithMyErr] r => PackageName -> Sem r [Flag]+getPackageFlag :: Members [HackageEnv, WithMyErr] r => PackageName -> Sem r [PkgFlag] getPackageFlag name = do cabal <- getLatestCabal name return $ cabal & genPackageFlags
src/Distribution/ArchHs/Internal/Prelude.hs view
@@ -31,6 +31,7 @@ module Polysemy.Reader, module Polysemy.State, module Polysemy.Trace,+ module Distribution.ArchHs.Compat, module Distribution.Types.PackageDescription, module Distribution.Types.GenericPackageDescription, module Distribution.Types.Version,@@ -60,6 +61,7 @@ ( decodeUtf8, encodeUtf8, )+import Distribution.ArchHs.Compat import Distribution.Parsec (simpleParsec) import Distribution.Pretty (prettyShow) import Distribution.Types.Flag
src/Distribution/ArchHs/PP.hs view
@@ -97,10 +97,10 @@ . fmap (\(i :: Int, n) -> pretty i <> dot <+> viaPretty n) . zip [1 ..] -prettyFlags :: [(PackageName, [Flag])] -> Doc AnsiStyle+prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle prettyFlags = vsep . fmap (\(name, flags) -> annMagneta (viaPretty name) <> line <> indent 2 (vsep (prettyFlag <$> flags))) -prettyFlag :: Flag -> Doc AnsiStyle+prettyFlag :: PkgFlag -> Doc AnsiStyle prettyFlag f = "⚐" <+> annYellow name <> colon <> line <> indent
src/Distribution/ArchHs/Types.hs view
@@ -22,6 +22,7 @@ HackageEnv, CommunityEnv, FlagAssignmentsEnv,+ KnownGHCVersion, DependencyType (..), DependencyKind (..), DependencyProvider (..),@@ -83,6 +84,9 @@ -- | Unused state effect type DependencyRecord = State (Map PackageName [VersionRange])++-- | Reader effect of GHC version in dependency resolution+type KnownGHCVersion = Reader Version -- | The type of a dependency. Who requires this? data DependencyType