1
1
{-# LANGUAGE RecordWildCards, NamedFieldPuns, RecursiveDo #-}
2
+ {-# LANGUAGE TupleSections #-}
2
3
3
4
module Distribution.Server.Features.Sitemap (
4
5
SitemapFeature (.. )
@@ -28,6 +29,10 @@ import Network.URI
28
29
import Control.DeepSeq
29
30
import Text.Read
30
31
import Data.List.Split
32
+ import Distribution.Server.Framework.BlobStorage
33
+ import Distribution.Server.Features.TarIndexCache
34
+ import qualified Data.TarIndex as Tar
35
+ import System.FilePath (takeExtension )
31
36
32
37
data Sitemap
33
38
= Sitemap
@@ -52,6 +57,7 @@ initSitemapFeature :: ServerEnv
52
57
-> IO ( CoreFeature
53
58
-> DocumentationFeature
54
59
-> TagsFeature
60
+ -> TarIndexCacheFeature
55
61
-> IO SitemapFeature )
56
62
57
63
initSitemapFeature env@ ServerEnv { serverCacheDelay,
@@ -60,10 +66,11 @@ initSitemapFeature env@ServerEnv{ serverCacheDelay,
60
66
61
67
return $ \ coref@ CoreFeature {.. }
62
68
docsCore@ DocumentationFeature {.. }
63
- tagsf@ TagsFeature {.. } -> do
69
+ tagsf@ TagsFeature {.. }
70
+ tarf@ TarIndexCacheFeature {.. } -> do
64
71
65
72
rec let (feature, updateSitemapCache) =
66
- sitemapFeature env coref docsCore tagsf
73
+ sitemapFeature env coref docsCore tagsf tarf
67
74
initTime sitemapCache
68
75
69
76
sitemapCache <- newAsyncCacheNF updateSitemapCache
@@ -80,13 +87,15 @@ sitemapFeature :: ServerEnv
80
87
-> CoreFeature
81
88
-> DocumentationFeature
82
89
-> TagsFeature
90
+ -> TarIndexCacheFeature
83
91
-> UTCTime
84
92
-> AsyncCache Sitemap
85
93
-> (SitemapFeature , IO Sitemap )
86
94
sitemapFeature ServerEnv {.. }
87
95
CoreFeature {.. }
88
96
DocumentationFeature {.. }
89
97
TagsFeature {.. }
98
+ TarIndexCacheFeature {cachedTarIndex}
90
99
initTime
91
100
sitemapCache
92
101
= (SitemapFeature {.. }, updateSitemapCache)
@@ -151,10 +160,10 @@ sitemapFeature ServerEnv{..}
151
160
pkgIndex <- queryGetPackageIndex
152
161
docIndex <- queryDocumentationIndex
153
162
154
- let sitemaps = generateSitemap serverBaseURI pageBuildDate
163
+ sitemaps <- generateSitemap serverBaseURI pageBuildDate
155
164
(map fst alltags)
156
- pkgIndex docIndex
157
- uriScheme i = " /sitemap/" <> show i <> " .xml"
165
+ pkgIndex docIndex cachedTarIndex
166
+ let uriScheme i = " /sitemap/" <> show i <> " .xml"
158
167
sitemapIndex = renderSitemapIndex serverBaseURI (map uriScheme [0 .. (length sitemaps - 1 )])
159
168
return $ Sitemap (XMLResponse sitemapIndex) (map XMLResponse sitemaps)
160
169
@@ -165,19 +174,21 @@ generateSitemap :: URI
165
174
-> T. Text
166
175
-> [Tag ]
167
176
-> PackageIndex. PackageIndex PkgInfo
168
- -> Map. Map PackageId a
169
- -> [ByteString ]
170
- generateSitemap serverBaseURI pageBuildDate alltags pkgIndex docIndex =
171
- renderSitemap serverBaseURI <$> chunksOf 50000 allEntries
177
+ -> Map. Map PackageId BlobId
178
+ -> (BlobId -> IO Tar. TarIndex )
179
+ -> IO [ByteString ]
180
+ generateSitemap serverBaseURI pageBuildDate alltags pkgIndex docIndex cachedTarIndex = do
181
+ versionedDocSubEntries <- versionedDocSubEntriesIO
182
+ let -- Combine and build sitemap
183
+ allEntries = miscEntries
184
+ ++ tagEntries
185
+ ++ nameEntries
186
+ ++ nameVersEntries
187
+ ++ baseDocEntries
188
+ ++ versionedDocEntries
189
+ ++ versionedDocSubEntries
190
+ pure $ renderSitemap serverBaseURI <$> chunksOf 50000 allEntries
172
191
where
173
- -- Combine and build sitemap
174
- allEntries = miscEntries
175
- ++ tagEntries
176
- ++ nameEntries
177
- ++ nameVersEntries
178
- ++ baseDocEntries
179
- ++ versionedDocEntries
180
-
181
192
-- Misc. pages
182
193
-- e.g. ["http://myhackage.com/index", ...]
183
194
miscEntries = urlsToSitemapEntries miscPages pageBuildDate Weekly 0.75
@@ -258,3 +269,26 @@ generateSitemap serverBaseURI pageBuildDate alltags pkgIndex docIndex =
258
269
, Map. member (packageId pkg) docIndex
259
270
]
260
271
pageBuildDate Monthly 0.25
272
+
273
+ -- Versioned doc pages in subdirectories
274
+ -- versionedSubDocURIs :: [path :: String]
275
+ -- e.g. ["http://myhackage.com/packages/mypackage-1.0.2/docs/Lib.html", ...]
276
+ versionedDocSubEntriesIO = do
277
+ let pkgs = [ (pkg , blob)
278
+ | pkg <- concat pkgss
279
+ , Just blob <- [Map. lookup (packageId pkg) docIndex]
280
+ ]
281
+ pkgIndices <- traverse (\ (pkg, blob) -> (pkg,) <$> cachedTarIndex blob) pkgs
282
+ pure $ urlsToSitemapEntries
283
+ [ prefixPkgURI ++ display (packageId pkg) ++ " /docs" ++ fp
284
+ | (pkg, tarIndex) <- pkgIndices
285
+ , Just tar <- [Tar. lookup tarIndex " " ]
286
+ , fp <- entryToPaths " /" tar
287
+ , takeExtension fp == " .html"
288
+ ]
289
+ pageBuildDate Monthly 0.25
290
+
291
+ entryToPaths :: FilePath -> Tar. TarIndexEntry -> [FilePath ]
292
+ entryToPaths _ (Tar. TarFileEntry _) = []
293
+ entryToPaths base (Tar. TarDir content) = map ((base </> ) . fst ) content ++
294
+ [ file | (folder, entry) <- content, file <- entryToPaths (base </> folder) entry ]
0 commit comments