mirror of
https://github.com/Start9Labs/registry.git
synced 2026-03-26 02:11:53 +00:00
filter os compatible packages before filtering for latest version from requested spec
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user