mirror of
https://github.com/commercialhaskell/stackage-server.git
synced 2026-01-11 19:58:28 +01:00
Support doc maps
This commit is contained in:
parent
6732b2827a
commit
046d3b6094
@ -18,6 +18,9 @@ import Crypto.Hash (Digest, SHA1)
|
|||||||
import qualified Filesystem.Path.CurrentOS as F
|
import qualified Filesystem.Path.CurrentOS as F
|
||||||
import Data.Slug (SnapSlug)
|
import Data.Slug (SnapSlug)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
|
import Data.Slug (unSlug)
|
||||||
|
import qualified Data.Yaml as Y
|
||||||
|
import Data.Aeson (withObject)
|
||||||
|
|
||||||
form :: Form FileInfo
|
form :: Form FileInfo
|
||||||
form = renderDivs $ areq fileField "tarball containing docs"
|
form = renderDivs $ areq fileField "tarball containing docs"
|
||||||
@ -288,3 +291,51 @@ createHaddockUnpacker root store runDB' = do
|
|||||||
]
|
]
|
||||||
[PackageHasHaddocks =. True]
|
[PackageHasHaddocks =. True]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
data DocInfo = DocInfo Version (Map Text [Text])
|
||||||
|
instance FromJSON DocInfo where
|
||||||
|
parseJSON = withObject "DocInfo" $ \o -> DocInfo
|
||||||
|
<$> (Version <$> o .: "version")
|
||||||
|
<*> o .: "modules"
|
||||||
|
|
||||||
|
getUploadDocMapR :: Handler Html
|
||||||
|
getUploadDocMapR = do
|
||||||
|
uid <- requireAuthIdOrToken
|
||||||
|
user <- runDB $ get404 uid
|
||||||
|
extra <- getExtra
|
||||||
|
when (unSlug (userHandle user) `notMember` adminUsers extra)
|
||||||
|
$ permissionDenied "Must be an administrator"
|
||||||
|
|
||||||
|
((res, widget), enctype) <- runFormPostNoToken $ renderDivs $ (,)
|
||||||
|
<$> areq
|
||||||
|
fileField
|
||||||
|
"YAML file with map" { fsName = Just "docmap" }
|
||||||
|
Nothing
|
||||||
|
<*> areq textField "Stackage ID" { fsName = Just "snapshot" } Nothing
|
||||||
|
case res of
|
||||||
|
FormSuccess (fi, snapshot) -> do
|
||||||
|
Entity sid stackage <-
|
||||||
|
runDB $ getBy404 $ UniqueStackage $ PackageSetIdent snapshot
|
||||||
|
bs <- fileSource fi $$ foldC
|
||||||
|
case Y.decodeEither bs of
|
||||||
|
Left e -> invalidArgs [pack e]
|
||||||
|
Right m0 -> do
|
||||||
|
now <- liftIO getCurrentTime
|
||||||
|
render <- getUrlRender
|
||||||
|
runDB $ forM_ (mapToList $ asMap m0) $ \(package, DocInfo version ms) -> do
|
||||||
|
did <- insert $ Docs (PackageName package) version now
|
||||||
|
forM_ (mapToList ms) $ \(name, pieces) -> do
|
||||||
|
let url = render $ HaddockR (stackageSlug stackage) pieces
|
||||||
|
insert_ $ Module did name url
|
||||||
|
setMessage "Doc map complete"
|
||||||
|
redirect UploadDocMapR
|
||||||
|
_ -> defaultLayout $ do
|
||||||
|
setTitle "Upload doc map"
|
||||||
|
[whamlet|
|
||||||
|
<form method=post action=?_method=PUT enctype=#{enctype}>
|
||||||
|
^{widget}
|
||||||
|
<input type=submit .btn value="Set document map">
|
||||||
|
|]
|
||||||
|
|
||||||
|
putUploadDocMapR :: Handler Html
|
||||||
|
putUploadDocMapR = getUploadDocMapR
|
||||||
|
|||||||
@ -23,7 +23,8 @@ getPackageR pn = do
|
|||||||
haddocksLink ident version =
|
haddocksLink ident version =
|
||||||
HaddockR ident [concat [toPathPiece pn, "-", toPathPiece version]]
|
HaddockR ident [concat [toPathPiece pn, "-", toPathPiece version]]
|
||||||
muid <- maybeAuthId
|
muid <- maybeAuthId
|
||||||
(packages, downloads, recentDownloads, nLikes, liked, Entity _ metadata, revdeps') <- runDB $ do
|
(packages, downloads, recentDownloads, nLikes, liked,
|
||||||
|
Entity _ metadata, revdeps', mdocs) <- runDB $ do
|
||||||
packages <- fmap (map reformat) $ E.select $ E.from $ \(p, s) -> do
|
packages <- fmap (map reformat) $ E.select $ E.from $ \(p, s) -> do
|
||||||
E.where_ $ (p ^. PackageStackage E.==. s ^. StackageId)
|
E.where_ $ (p ^. PackageStackage E.==. s ^. StackageId)
|
||||||
&&. (p ^. PackageName' E.==. E.val pn)
|
&&. (p ^. PackageName' E.==. E.val pn)
|
||||||
@ -46,6 +47,12 @@ getPackageR pn = do
|
|||||||
E.orderBy [E.asc $ dep ^. DependencyUser]
|
E.orderBy [E.asc $ dep ^. DependencyUser]
|
||||||
return $ dep ^. DependencyUser
|
return $ dep ^. DependencyUser
|
||||||
|
|
||||||
|
mdocsent <- selectFirst [DocsName ==. pn] [Desc DocsUploaded]
|
||||||
|
mdocs <- forM mdocsent $ \(Entity docsid (Docs _ version _)) -> (,)
|
||||||
|
<$> pure version
|
||||||
|
<*> (map entityVal <$>
|
||||||
|
selectList [ModuleDocs ==. docsid] [Asc ModuleName])
|
||||||
|
|
||||||
return ( packages
|
return ( packages
|
||||||
, downloads
|
, downloads
|
||||||
, recentDownloads
|
, recentDownloads
|
||||||
@ -53,6 +60,7 @@ getPackageR pn = do
|
|||||||
, liked
|
, liked
|
||||||
, metadata
|
, metadata
|
||||||
, map E.unValue revdeps'
|
, map E.unValue revdeps'
|
||||||
|
, mdocs
|
||||||
)
|
)
|
||||||
|
|
||||||
myTags <-
|
myTags <-
|
||||||
|
|||||||
@ -88,6 +88,16 @@ Metadata
|
|||||||
|
|
||||||
UniqueMetadata name
|
UniqueMetadata name
|
||||||
|
|
||||||
|
Docs
|
||||||
|
name PackageName
|
||||||
|
version Version
|
||||||
|
uploaded UTCTime
|
||||||
|
Module
|
||||||
|
docs DocsId
|
||||||
|
name Text
|
||||||
|
url Text
|
||||||
|
UniqueModule docs name
|
||||||
|
|
||||||
Dependency
|
Dependency
|
||||||
dep PackageName
|
dep PackageName
|
||||||
user PackageName
|
user PackageName
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
/reset-token ResetTokenR POST
|
/reset-token ResetTokenR POST
|
||||||
/upload UploadStackageR GET PUT
|
/upload UploadStackageR GET PUT
|
||||||
/upload-haddock/#Text UploadHaddockR GET PUT
|
/upload-haddock/#Text UploadHaddockR GET PUT
|
||||||
|
/upload-doc-map UploadDocMapR GET PUT
|
||||||
|
|
||||||
/stackage/#PackageSetIdent/*Texts OldStackageR GET
|
/stackage/#PackageSetIdent/*Texts OldStackageR GET
|
||||||
|
|
||||||
|
|||||||
@ -95,6 +95,13 @@ $newline never
|
|||||||
<a href="mailto:#{renderEmail email}">
|
<a href="mailto:#{renderEmail email}">
|
||||||
#{renderEmail email}
|
#{renderEmail email}
|
||||||
|
|
||||||
|
$maybe (version, modules) <- mdocs
|
||||||
|
<div .docs>
|
||||||
|
<p>Documentation for version #{version}
|
||||||
|
<ul>
|
||||||
|
$forall Module _ name url <- modules
|
||||||
|
<li>
|
||||||
|
<a href=#{url}>#{name}
|
||||||
<div .dependencies>
|
<div .dependencies>
|
||||||
Depends on
|
Depends on
|
||||||
<div .dep-list>
|
<div .dep-list>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user