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

View File

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

View File

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