filter os compatible packages before filtering for latest version from requested spec

This commit is contained in:
Lucy Cifferello
2022-06-17 14:52:36 -06:00
parent 4794e6ae16
commit 7ab9dff242
3 changed files with 26 additions and 19 deletions

View File

@@ -313,9 +313,9 @@ getPackageListR = do
$ searchServices category query
.| collateVersions
.| zipCategories
.| filterPkgOsCompatible osPredicate
-- empty list since there are no requested packages in this case
.| filterLatestVersionFromSpec []
.| filterPkgOsCompatible osPredicate
-- pages start at 1 for some reason. TODO: make pages start at 0
.| (dropC (limit' * (page - 1)) *> takeC limit')
.| sinkList
@@ -328,8 +328,8 @@ getPackageListR = do
$ getPkgData (packageReqId <$> packages')
.| collateVersions
.| zipCategories
.| filterLatestVersionFromSpec vMap
.| filterPkgOsCompatible osPredicate
.| filterLatestVersionFromSpec vMap
.| sinkList
-- NOTE: if a package's dependencies do not meet the system requirements, it is currently omitted from the list
pkgsWithDependencies <- runDB $ mapConcurrently (getPackageDependencies osPredicate) filteredPackages

View File

@@ -155,6 +155,12 @@ data PackageMetadata = PackageMetadata
, packageMetadataPkgVersion :: !Version
}
deriving (Eq, Show)
data PackageMetadataIntermediary = PackageMetadataIntermediary
{ packageMetadataIntermediaryPkgId :: !PkgId
, packageMetadataIntermediaryPkgVersionRecords :: ![Entity VersionRecord]
, packageMetadataIntermediaryPkgCategories :: ![Entity Category]
}
deriving (Eq, Show)
data PackageDependencyMetadata = PackageDependencyMetadata
{ packageDependencyMetadataPkgDependencyRecord :: !(Entity PkgDependency)
, packageDependencyMetadataDepPkgRecord :: !(Entity PkgRecord)

View File

@@ -44,6 +44,7 @@ import Foundation ( Handler )
import GHC.List ( lookup )
import Handler.Types.Marketplace ( PackageDependencyMetadata(..)
, PackageMetadata(..)
, PackageMetadataIntermediary(..)
)
import Lib.PkgRepository ( PkgRepo
, getHash
@@ -110,16 +111,16 @@ orThrow action other = action >>= \case
Nothing -> other
Just x -> pure x
filterPkgOsCompatible :: Monad m => (Version -> Bool) -> ConduitT PackageMetadata PackageMetadata m ()
filterPkgOsCompatible :: Monad m => (Version -> Bool) -> ConduitT (PkgId, [Entity VersionRecord], [Entity Category]) PackageMetadataIntermediary m ()
filterPkgOsCompatible p =
awaitForever
$ \PackageMetadata { packageMetadataPkgId = pkg, packageMetadataPkgVersionRecords = versions, packageMetadataPkgCategories = cats, packageMetadataPkgVersion = requestedVersion } ->
$ \(pkgId, vs, cats) ->
do
let compatible = filter (p . versionRecordOsVersion . entityVal) versions
unless (null compatible) $ yield PackageMetadata { packageMetadataPkgId = pkg
, packageMetadataPkgVersionRecords = compatible
, packageMetadataPkgCategories = cats
, packageMetadataPkgVersion = requestedVersion
let compatible = filter (p . versionRecordOsVersion . entityVal) vs
unless (null compatible) $ yield PackageMetadataIntermediary
{ packageMetadataIntermediaryPkgId = pkgId
, packageMetadataIntermediaryPkgVersionRecords = compatible
, packageMetadataIntermediaryPkgCategories = cats
}
filterDependencyOsCompatible :: (Version -> Bool) -> PackageDependencyMetadata -> PackageDependencyMetadata
@@ -133,14 +134,14 @@ filterDependencyOsCompatible p PackageDependencyMetadata { packageDependencyMeta
filterLatestVersionFromSpec :: (Monad m, MonadLogger m)
=> [(PkgId, VersionRange)]
-> ConduitT (PkgId, [Entity VersionRecord], [Entity Category]) PackageMetadata m ()
filterLatestVersionFromSpec versionMap = awaitForever $ \(pkgId, vs, cats) -> do
-> ConduitT PackageMetadataIntermediary PackageMetadata m ()
filterLatestVersionFromSpec versionMap = awaitForever $ \PackageMetadataIntermediary { packageMetadataIntermediaryPkgId = pkg, packageMetadataIntermediaryPkgVersionRecords = versions, packageMetadataIntermediaryPkgCategories = cats } -> do
-- if no packages are specified, the VersionRange is implicitly `*`
let spec = fromMaybe Any $ lookup pkgId versionMap
case headMay . sortOn Down $ filter (`satisfies` spec) $ fmap (versionRecordNumber . entityVal) vs of
Nothing -> $logInfo [i|No version for #{pkgId} satisfying #{spec}|]
Just v -> yield $ PackageMetadata { packageMetadataPkgId = pkgId
, packageMetadataPkgVersionRecords = vs
let spec = fromMaybe Any $ lookup pkg versionMap
case headMay . sortOn Down $ filter (`satisfies` spec) $ fmap (versionRecordNumber . entityVal) versions of
Nothing -> $logInfo [i|No version for #{pkg} satisfying #{spec}|]
Just v -> yield $ PackageMetadata { packageMetadataPkgId = pkg
, packageMetadataPkgVersionRecords = versions
, packageMetadataPkgCategories = cats
, packageMetadataPkgVersion = v
}