@@ -29,6 +29,7 @@ import Distribution.Package
29
29
import Distribution.PackageDescription
30
30
import Distribution.PackageDescription.Configuration
31
31
import Distribution.Pretty (prettyShow )
32
+ import Distribution.Types.Version (Version )
32
33
import Distribution.Utils.ShortText (fromShortText )
33
34
34
35
import Control.Concurrent
@@ -89,17 +90,33 @@ data PackageItem = PackageItem {
89
90
itemLastUpload :: ! UTCTime ,
90
91
-- Hotness = recent downloads + stars + 2 * no rev deps
91
92
itemHotness :: ! Float ,
92
- -- Last version
93
- itemLastVersion :: ! String
93
+ -- Reference version (non-deprecated highest numbered version)
94
+ itemReferenceVersion :: ! String
94
95
}
95
96
96
97
instance MemSize PackageItem where
97
98
memSize (PackageItem a b c d e f g h i j k l _m n o) = memSize11 a b c d e f g h i j (k, l, n, o)
98
99
99
100
100
101
emptyPackageItem :: PackageName -> PackageItem
101
- emptyPackageItem pkg = PackageItem pkg Set. empty Nothing " " []
102
- 0 0 0 False 0 0 0 (UTCTime (toEnum 0 ) 0 ) 0 " "
102
+ emptyPackageItem pkg =
103
+ PackageItem {
104
+ itemName = pkg,
105
+ itemTags = Set. empty,
106
+ itemDeprecated = Nothing ,
107
+ itemDesc = " " ,
108
+ itemMaintainer = [] ,
109
+ itemVotes = 0 ,
110
+ itemDownloads = 0 ,
111
+ itemRevDepsCount = 0 ,
112
+ itemHasLibrary = False ,
113
+ itemNumExecutables = 0 ,
114
+ itemNumTests = 0 ,
115
+ itemNumBenchmarks = 0 ,
116
+ itemLastUpload = UTCTime (toEnum 0 ) 0 ,
117
+ itemHotness = 0 ,
118
+ itemReferenceVersion = " "
119
+ }
103
120
104
121
105
122
initListFeature :: ServerEnv
@@ -134,10 +151,14 @@ initListFeature _env = do
134
151
135
152
registerHookJust packageChangeHook isPackageAdd $ \ pkg -> do
136
153
let pkgname = packageName . packageId $ pkg
137
- modifyItem pkgname $ \ x -> x
138
- {itemLastUpload = fst (pkgOriginalUploadInfo pkg)
139
- ,itemLastVersion = prettyShow $ pkgVersion $ pkgInfoId pkg
140
- }
154
+ prefsinfo <- queryGetPreferredInfo pkgname
155
+ index <- queryGetPackageIndex
156
+ let allVersions = packageVersion <$> PackageIndex. lookupPackageName index pkgname
157
+ modifyItem pkgname $ \ x ->
158
+ updateReferenceVersion prefsinfo allVersions $
159
+ x
160
+ { itemLastUpload = fst (pkgOriginalUploadInfo pkg)
161
+ }
141
162
runHook_ itemUpdate (Set. singleton pkgname)
142
163
143
164
registerHook groupChangedHook $ \ (gd,_,_,_,_) ->
@@ -174,6 +195,11 @@ initListFeature _env = do
174
195
modifyItem pkgname (updateDeprecation mpkgs)
175
196
runHook_ itemUpdate (Set. singleton pkgname)
176
197
198
+ registerHook updatePreferredHook $ \ (pkgname, prefsinfo) -> do
199
+ index <- queryGetPackageIndex
200
+ let allVersions = packageVersion <$> PackageIndex. lookupPackageName index pkgname
201
+ modifyItem pkgname $ updateReferenceVersion prefsinfo allVersions
202
+
177
203
return feature
178
204
179
205
@@ -265,8 +291,9 @@ listFeature CoreFeature{..}
265
291
votes <- pkgNumScore pkgname
266
292
deprs <- queryGetDeprecatedFor pkgname
267
293
maintainers <- queryUserGroup (maintainersGroup pkgname)
294
+ prefsinfo <- queryGetPreferredInfo pkgname
268
295
269
- return $ (,) pkgname $ (updateDescriptionItem desc $ emptyPackageItem pkgname) {
296
+ return $ (,) pkgname . updateReferenceVersion prefsinfo [pkgVersion (pkgInfoId pkg)] $ (updateDescriptionItem desc $ emptyPackageItem pkgname) {
270
297
itemTags = tags
271
298
, itemMaintainer = map (userIdToName users) (UserIdSet. toList maintainers)
272
299
, itemDeprecated = deprs
@@ -275,7 +302,6 @@ listFeature CoreFeature{..}
275
302
, itemLastUpload = fst (pkgOriginalUploadInfo pkg)
276
303
, itemRevDepsCount = intRevDirectCount
277
304
, itemHotness = votes + fromIntegral (cmFind pkgname downs) + fromIntegral intRevDirectCount * 2
278
- , itemLastVersion = prettyShow $ pkgVersion $ pkgInfoId pkg
279
305
}
280
306
281
307
------------------------------
@@ -329,6 +355,17 @@ updateDeprecation pkgs item =
329
355
itemDeprecated = pkgs
330
356
}
331
357
358
+ updateReferenceVersion :: PreferredInfo -> [Version ] -> PackageItem -> PackageItem
359
+ updateReferenceVersion prefsinfo allVersions item =
360
+ item {
361
+ itemReferenceVersion =
362
+ case nonDeprecatedVersion of
363
+ [] -> " "
364
+ xs -> prettyShow $ maximum xs
365
+ }
366
+ where
367
+ nonDeprecatedVersion = filter (`notElem` deprecatedVersions prefsinfo) allVersions
368
+
332
369
updateReverseItem :: Int -> PackageItem -> PackageItem
333
370
updateReverseItem revDirectCount item =
334
371
item {
0 commit comments