Update search results to link to stackage.org

This commit is contained in:
Chris Done 2016-06-14 16:47:17 +02:00
parent fffdf9717e
commit cb93e54729
3 changed files with 113 additions and 59 deletions

View File

@ -20,57 +20,74 @@ shouldRedirect = False
getHaddockR :: SnapName -> [Text] -> Handler TypedContent getHaddockR :: SnapName -> [Text] -> Handler TypedContent
getHaddockR slug rest getHaddockR slug rest
| shouldRedirect = redirect $ makeURL slug rest | shouldRedirect = do
| final:_ <- reverse rest, ".html" `isSuffixOf` final = track "Handler.Haddock.getHaddockR" $ do result <- redirectWithVersion slug rest
case result of
Just route -> redirect route
Nothing -> redirect $ makeURL slug rest
| final:_ <- reverse rest, ".html" `isSuffixOf` final = do
render <- getUrlRender render <- getUrlRender
result <- redirectWithVersion slug rest
let stylesheet = render' $ StaticR haddock_style_css case result of
script = render' $ StaticR haddock_script_js Just route -> redirect route
bootstrap = render' $ StaticR haddock_bootstrap_css Nothing -> do
jquery = render' $ StaticR haddock_jquery_js let stylesheet = render' $ StaticR haddock_style_css
render' = return . ContentText . render script = render' $ StaticR haddock_script_js
bootstrap = render' $ StaticR haddock_bootstrap_css
addExtra t@(EventEndElement "head") = jquery = render' $ StaticR haddock_jquery_js
[ EventBeginElement "link" render' = return . ContentText . render
[ ("rel", [ContentText "stylesheet"]) addExtra t@(EventEndElement "head") =
, ("href", bootstrap) [ EventBeginElement "link"
] [ ("rel", [ContentText "stylesheet"])
, EventEndElement "link" , ("href", bootstrap)
, EventBeginElement "link" ]
[ ("rel", [ContentText "stylesheet"]) , EventEndElement "link"
, ("href", [ContentText "https://fonts.googleapis.com/css?family=Open+Sans"]) , EventBeginElement "link"
] [ ("rel", [ContentText "stylesheet"])
, EventEndElement "link" , ("href", [ContentText "https://fonts.googleapis.com/css?family=Open+Sans"])
, EventBeginElement "link" ]
[ ("rel", [ContentText "stylesheet"]) , EventEndElement "link"
, ("href", stylesheet) , EventBeginElement "link"
] [ ("rel", [ContentText "stylesheet"])
, EventEndElement "link" , ("href", stylesheet)
, EventBeginElement "script" ]
[ ("src", jquery) , EventEndElement "link"
] , EventBeginElement "script"
, EventEndElement "script" [ ("src", jquery)
, EventBeginElement "script" ]
[ ("src", script) , EventEndElement "script"
] , EventBeginElement "script"
, EventEndElement "script" [ ("src", script)
, t ]
] , EventEndElement "script"
addExtra t@(EventBeginElement "body" _) = [t] ++ nav , t
addExtra t = [t] ]
addExtra t@(EventBeginElement "body" _) = [t] ++ nav
req <- parseUrl $ unpack $ makeURL slug rest addExtra t = [t]
(_, res) <- acquireResponse req >>= allocateAcquire req <- parseUrl $ unpack $ makeURL slug rest
(_, res) <- acquireResponse req >>= allocateAcquire
doc <- responseBody res doc <- responseBody res
$$ eventConduit $$ eventConduit
=$ concatMapC addExtra =$ concatMapC addExtra
=$ mapC (Nothing, ) =$ mapC (Nothing, )
=$ fromEvents =$ fromEvents
sendResponse $ toHtml doc
sendResponse $ toHtml doc
| otherwise = redirect $ makeURL slug rest | otherwise = redirect $ makeURL slug rest
redirectWithVersion
:: (GetStackageDatabase m,MonadHandler m,RedirectUrl (HandlerSite m) (Route App))
=> SnapName -> [Text] -> m (Maybe (Route App))
redirectWithVersion slug rest =
case rest of
[pkg,file] -> do
Entity sid _ <- lookupSnapshot slug >>= maybe notFound return
mversion <- getPackageVersionBySnapshot sid pkg
case mversion of
Nothing -> error "That package is not part of this snapshot."
Just version -> do
return (Just (HaddockR slug [pkg <> "-" <> version, file]))
_ -> return Nothing
nav :: [Event] nav :: [Event]
nav = nav =
el "nav" el "nav"
@ -100,6 +117,6 @@ nav =
close = [EventEndElement name] close = [EventEndElement name]
getHaddockBackupR :: [Text] -> Handler () getHaddockBackupR :: [Text] -> Handler ()
getHaddockBackupR rest = track "Handler.Haddock.getHaddockBackupR" $ redirect $ concat getHaddockBackupR rest = redirect $ concat
$ "https://s3.amazonaws.com/haddock.stackage.org" $ "https://s3.amazonaws.com/haddock.stackage.org"
: map (cons '/') rest : map (cons '/') rest

View File

@ -39,6 +39,7 @@ getHoogleR name = track "Handler.Hoogle.getHoogleR" $ do
-- Avoid concurrent Hoogle queries, see -- Avoid concurrent Hoogle queries, see
-- https://github.com/fpco/stackage-server/issues/172 -- https://github.com/fpco/stackage-server/issues/172
lock <- appHoogleLock <$> getYesod lock <- appHoogleLock <$> getYesod
urlRender <- getUrlRender
HoogleQueryOutput results mtotalCount <- HoogleQueryOutput results mtotalCount <-
case mquery of case mquery of
Just query -> do Just query -> do
@ -53,7 +54,7 @@ getHoogleR name = track "Handler.Hoogle.getHoogleR" $ do
$ const $ const
$ Hoogle.withDatabase dbPath $ Hoogle.withDatabase dbPath
-- NB! I got a segfault when I didn't force with $! -- NB! I got a segfault when I didn't force with $!
$ \db -> return $! runHoogleQuery db input $ \db -> return $! runHoogleQuery urlRender name db input
Nothing -> return $ HoogleQueryOutput [] Nothing Nothing -> return $ HoogleQueryOutput [] Nothing
let queryText = fromMaybe "" mquery let queryText = fromMaybe "" mquery
pageLink p = (SnapshotR name HoogleR pageLink p = (SnapshotR name HoogleR
@ -126,8 +127,12 @@ instance NFData HoogleResult where rnf = genericRnf
instance NFData PackageLink where rnf = genericRnf instance NFData PackageLink where rnf = genericRnf
instance NFData ModuleLink where rnf = genericRnf instance NFData ModuleLink where rnf = genericRnf
runHoogleQuery :: Hoogle.Database -> HoogleQueryInput -> HoogleQueryOutput runHoogleQuery :: (Route App -> Text)
runHoogleQuery hoogledb HoogleQueryInput {..} = -> SnapName
-> Hoogle.Database
-> HoogleQueryInput
-> HoogleQueryOutput
runHoogleQuery renderUrl snapshot hoogledb HoogleQueryInput {..} =
HoogleQueryOutput targets mcount HoogleQueryOutput targets mcount
where where
allTargets = Hoogle.searchDatabase hoogledb query allTargets = Hoogle.searchDatabase hoogledb query
@ -144,15 +149,30 @@ runHoogleQuery hoogledb HoogleQueryInput {..} =
| otherwise = limitedLength (x + 1) rest | otherwise = limitedLength (x + 1) rest
fixResult Hoogle.Target {..} = HoogleResult fixResult Hoogle.Target {..} = HoogleResult
{ hrURL = targetURL { hrURL = case sources of
, hrSources = toList $ do [(_,[ModuleLink _ m])] -> m ++ haddockAnchorFromUrl targetURL
(pname, purl) <- targetPackage _ -> targetURL
(mname, murl) <- targetModule , hrSources = sources
let p = PackageLink pname purl
m = ModuleLink mname murl
Just (p, [m])
, hrTitle = -- FIXME find out why these replaces are necessary , hrTitle = -- FIXME find out why these replaces are necessary
unpack $ T.replace "<0>" "" $ T.replace "</0>" "" $ pack unpack $ T.replace "<0>" "" $ T.replace "</0>" "" $ pack
targetItem targetItem
, hrBody = targetDocs , hrBody = targetDocs
} }
where sources = toList $ do
(pname, _) <- targetPackage
(mname, _) <- targetModule
let p = PackageLink pname (makePackageLink pname)
m = ModuleLink
mname
(T.unpack
(renderUrl
(haddockUrl
snapshot
(T.pack pname)
(T.pack mname))))
Just (p, [m])
haddockAnchorFromUrl =
('#':) . reverse . takeWhile (/='#') . reverse
makePackageLink :: String -> String
makePackageLink pkg = "/package/" ++ pkg

View File

@ -15,6 +15,7 @@ module Stackage.Database
, PackageListingInfo (..) , PackageListingInfo (..)
, getAllPackages , getAllPackages
, getPackages , getPackages
, getPackageVersionBySnapshot
, createStackageDatabase , createStackageDatabase
, openStackageDatabase , openStackageDatabase
, ModuleListingInfo (..) , ModuleListingInfo (..)
@ -526,6 +527,22 @@ getPackages sid = liftM (map toPLI) $ run $ do
, pliIsCore = isCore , pliIsCore = isCore
} }
getPackageVersionBySnapshot
:: GetStackageDatabase m
=> SnapshotId -> Text -> m (Maybe Text)
getPackageVersionBySnapshot sid name = liftM (listToMaybe . map toPLI) $ run $ do
E.select $ E.from $ \(p,sp) -> do
E.where_ $
(p E.^. PackageId E.==. sp E.^. SnapshotPackagePackage) E.&&.
(sp E.^. SnapshotPackageSnapshot E.==. E.val sid) E.&&.
(E.lower_ (p E.^. PackageName) E.==. E.lower_ (E.val name))
E.orderBy [E.asc $ E.lower_ $ p E.^. PackageName]
return
( sp E.^. SnapshotPackageVersion
)
where
toPLI (E.Value version) = version
data ModuleListingInfo = ModuleListingInfo data ModuleListingInfo = ModuleListingInfo
{ mliName :: !Text { mliName :: !Text
, mliPackageVersion :: !Text , mliPackageVersion :: !Text