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