@@ -14,8 +14,8 @@ import Distribution.Server.Features.Core
14
14
import Distribution.Server.Features.PreferredVersions
15
15
import Distribution.Server.Features.PreferredVersions.State (PreferredVersions )
16
16
import qualified Distribution.Server.Packages.PackageIndex as PackageIndex
17
- import Distribution.Server.Packages.PackageIndex (PackageIndex , packageNames , allPackagesByName )
18
- import Distribution.Server.Packages.Types (PkgInfo , pkgInfoId )
17
+ import Distribution.Server.Packages.PackageIndex (PackageIndex , packageNames , allPackagesByNameNE )
18
+ import Distribution.Server.Packages.Types (PkgInfo )
19
19
import Distribution.Server.Features.ReverseDependencies.State
20
20
import Distribution.Package
21
21
import Distribution.Text (display )
@@ -26,6 +26,7 @@ import Data.Aeson
26
26
import Data.ByteString.Lazy (ByteString )
27
27
import Data.Containers.ListUtils (nubOrd )
28
28
import Data.List (mapAccumL , sortOn )
29
+ import qualified Data.List.NonEmpty as NE
29
30
import Data.Maybe (catMaybes , fromJust )
30
31
import Data.Function (fix )
31
32
import qualified Data.Bimap as Bimap
@@ -35,21 +36,21 @@ import qualified Data.Map as Map
35
36
import Data.Set (Set )
36
37
import qualified Data.Set as Set
37
38
import GHC.Generics hiding (packageName )
38
- import GHC.Stack
39
39
40
40
data ReverseFeature = ReverseFeature {
41
41
reverseFeatureInterface :: HackageFeature ,
42
42
43
43
reverseResource :: ReverseResource ,
44
44
45
- reverseHook :: Hook [PackageId ] () ,
45
+ reverseHook :: Hook [NE. NonEmpty PkgInfo ] () ,
46
46
47
47
queryReverseDeps :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> m ([PackageName ], [PackageName ]),
48
48
revPackageId :: forall m . (MonadCatch m , MonadIO m ) => PackageId -> m ReverseDisplay ,
49
49
revPackageName :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> m ReverseDisplay ,
50
50
renderReverseRecent :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> ReverseDisplay -> m ReversePageRender ,
51
51
renderReverseOld :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> ReverseDisplay -> m ReversePageRender ,
52
52
revPackageFlat :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> m [(PackageName , Int )],
53
+ revDirectCount :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> m Int ,
53
54
revPackageStats :: forall m . (MonadIO m , MonadCatch m ) => PackageName -> m ReverseCount ,
54
55
revCountForAllPackages :: forall m . (MonadIO m , MonadCatch m ) => m [(PackageName , ReverseCount )],
55
56
revJSON :: forall m . (MonadIO m , MonadThrow m ) => m ByteString ,
@@ -95,9 +96,9 @@ initReverseFeature _ = do
95
96
Just pkginfo -> do
96
97
index <- queryGetPackageIndex
97
98
r <- readMemState memState
98
- added <- addPackage (packageName pkgid) (getAllDependencies pkginfo index ) r
99
+ added <- addPackage index (packageName pkgid) (getDepNames pkginfo) r
99
100
writeMemState memState added
100
- runHook_ updateReverse [pkgid ]
101
+ runHook_ updateReverse [pure pkginfo ]
101
102
102
103
return feature
103
104
@@ -128,7 +129,7 @@ instance ToJSON Edge
128
129
reverseFeature :: IO (PackageIndex PkgInfo )
129
130
-> IO PreferredVersions
130
131
-> MemState ReverseIndex
131
- -> Hook [PackageId ] ()
132
+ -> Hook [NE. NonEmpty PkgInfo ] ()
132
133
-> ReverseFeature
133
134
134
135
reverseFeature queryGetPackageIndex
@@ -153,8 +154,7 @@ reverseFeature queryGetPackageIndex
153
154
initReverseIndex = do
154
155
index <- liftIO queryGetPackageIndex
155
156
-- We build the proper index earlier, this just fires the reverse hooks
156
- let allPackages = map pkgInfoId $ concat $ allPackagesByName index
157
- runHook_ reverseHook allPackages
157
+ runHook_ reverseHook $ allPackagesByNameNE index
158
158
159
159
160
160
reverseResource = fix $ \ r -> ReverseResource
@@ -187,14 +187,14 @@ reverseFeature queryGetPackageIndex
187
187
let indirect = Set. difference rdepsall rdeps
188
188
return (Set. toList rdeps, Set. toList indirect)
189
189
190
- revPackageId :: (HasCallStack , MonadCatch m , MonadIO m ) => PackageId -> m ReverseDisplay
190
+ revPackageId :: (MonadCatch m , MonadIO m ) => PackageId -> m ReverseDisplay
191
191
revPackageId pkgid = do
192
192
dispInfo <- revDisplayInfo
193
193
pkgIndex <- liftIO queryGetPackageIndex
194
194
revs <- queryReverseIndex
195
195
perVersionReverse dispInfo pkgIndex revs pkgid
196
196
197
- revPackageName :: (HasCallStack , MonadIO m , MonadCatch m ) => PackageName -> m ReverseDisplay
197
+ revPackageName :: (MonadIO m , MonadCatch m ) => PackageName -> m ReverseDisplay
198
198
revPackageName pkgname = do
199
199
dispInfo <- revDisplayInfo
200
200
pkgIndex <- liftIO queryGetPackageIndex
@@ -203,7 +203,7 @@ reverseFeature queryGetPackageIndex
203
203
204
204
revJSON :: (MonadIO m , MonadThrow m ) => m ByteString
205
205
revJSON = do
206
- ReverseIndex revdeps nodemap <- queryReverseIndex
206
+ ReverseIndex revdeps nodemap _depmap <- queryReverseIndex
207
207
let assoc = takeWhile (\ (a,_) -> a < Bimap. size nodemap) $ Arr. assocs . Gr. transposeG $ revdeps
208
208
nodeToString node = unPackageName (nodemap Bimap. !> node)
209
209
-- nodes = map (uncurry Node) $ map (\n -> (fst n, nodeToString (fst n))) assoc
@@ -216,7 +216,7 @@ reverseFeature queryGetPackageIndex
216
216
prefs <- liftIO queryGetPreferredVersions
217
217
return $ getDisplayInfo prefs pkgIndex
218
218
219
- renderReverseWith :: (HasCallStack , MonadIO m , MonadCatch m ) => PackageName -> ReverseDisplay -> (Maybe VersionStatus -> Bool ) -> m ReversePageRender
219
+ renderReverseWith :: (MonadIO m , MonadCatch m ) => PackageName -> ReverseDisplay -> (Maybe VersionStatus -> Bool ) -> m ReversePageRender
220
220
renderReverseWith pkg rev filterFunc = do
221
221
let rev' = map fst $ Map. toList rev
222
222
directCounts <- mapM revDirectCount (pkg: rev')
@@ -244,20 +244,20 @@ reverseFeature queryGetPackageIndex
244
244
245
245
-- -- This could also differentiate between direct and indirect dependencies
246
246
-- -- with a bit more calculation.
247
- revPackageFlat :: (HasCallStack , MonadIO m , MonadCatch m ) => PackageName -> m [(PackageName , Int )]
247
+ revPackageFlat :: (MonadIO m , MonadCatch m ) => PackageName -> m [(PackageName , Int )]
248
248
revPackageFlat pkgname = do
249
249
memState <- readMemState reverseMemState
250
250
deps <- getDependenciesFlat pkgname memState
251
251
let depList = Set. toList deps
252
252
counts <- mapM (`getTotalCount` memState) depList
253
253
return $ zip depList counts
254
254
255
- revPackageStats :: (HasCallStack , MonadIO m , MonadCatch m ) => PackageName -> m ReverseCount
255
+ revPackageStats :: (MonadIO m , MonadCatch m ) => PackageName -> m ReverseCount
256
256
revPackageStats pkgname = do
257
257
(direct, transitive) <- getReverseCount pkgname =<< readMemState reverseMemState
258
258
return $ ReverseCount direct transitive
259
259
260
- revDirectCount :: (HasCallStack , MonadIO m , MonadCatch m ) => PackageName -> m Int
260
+ revDirectCount :: (MonadIO m , MonadCatch m ) => PackageName -> m Int
261
261
revDirectCount pkgname = do
262
262
getDirectCount pkgname =<< readMemState reverseMemState
263
263
@@ -270,7 +270,7 @@ reverseFeature queryGetPackageIndex
270
270
-- broken packages.
271
271
--
272
272
-- The returned list is sorted ascendingly on directCount (see ReverseCount).
273
- revCountForAllPackages :: (HasCallStack , MonadIO m , MonadCatch m ) => m [(PackageName , ReverseCount )]
273
+ revCountForAllPackages :: (MonadIO m , MonadCatch m ) => m [(PackageName , ReverseCount )]
274
274
revCountForAllPackages = do
275
275
index <- liftIO queryGetPackageIndex
276
276
let pkgnames = packageNames index
@@ -279,7 +279,7 @@ reverseFeature queryGetPackageIndex
279
279
280
280
revForEachVersion :: (MonadThrow m , MonadIO m ) => PackageName -> m (Map. Map Version (Set PackageIdentifier ))
281
281
revForEachVersion pkg = do
282
- ReverseIndex revs nodemap <- readMemState reverseMemState
282
+ ReverseIndex revs nodemap depmap <- readMemState reverseMemState
283
283
index <- liftIO queryGetPackageIndex
284
284
nodeid <- Bimap. lookup pkg nodemap
285
285
revDepNames <- mapM (`Bimap.lookupR` nodemap) (Set. toList $ suc revs nodeid)
@@ -289,5 +289,5 @@ reverseFeature queryGetPackageIndex
289
289
revDepVersions = do
290
290
x <- nubOrd revDepNames
291
291
pkginfo <- PackageIndex. lookupPackageName index pkg
292
- pure (packageVersion pkginfo, dependsOnPkg index (packageId pkginfo) x)
292
+ pure (packageVersion pkginfo, dependsOnPkg index (packageId pkginfo) x depmap )
293
293
pure $ Map. fromListWith Set. union revDepVersions
0 commit comments