Upload docs map

This commit is contained in:
Michael Snoyman 2014-12-13 20:42:49 +02:00
parent bc5b77bdd5
commit 8651984bf3
4 changed files with 86 additions and 1 deletions

View File

@ -178,4 +178,13 @@ completeBuild buildType = withManager defaultManagerSettings $ \man -> do
putStrLn $ "Distro upload response: " ++ tshow res2 putStrLn $ "Distro upload response: " ++ tshow res2
_ -> putStrLn "No creds found, skipping Hackage distro upload" _ -> putStrLn "No creds found, skipping Hackage distro upload"
putStrLn "Uploading doc map"
uploadDocMap UploadDocMap
{ udmServer = def
, udmAuthToken = decodeUtf8 token
, udmSnapshot = ident
, udmDocDir = pbDocDir pb
, udmPlan = plan
} man >>= print
postBuild postBuild

View File

@ -6,6 +6,7 @@ module Stackage2.ServerBundle
( serverBundle ( serverBundle
, epochTime , epochTime
, bpAllPackages , bpAllPackages
, docsListing
) where ) where
import qualified Codec.Archive.Tar as Tar import qualified Codec.Archive.Tar as Tar
@ -17,6 +18,9 @@ import Stackage2.BuildConstraints
import Stackage2.BuildPlan import Stackage2.BuildPlan
import Stackage2.Prelude import Stackage2.Prelude
import qualified System.PosixCompat.Time as PC import qualified System.PosixCompat.Time as PC
import qualified Text.XML as X
import Text.XML.Cursor
import Filesystem (isFile)
-- | Get current time -- | Get current time
epochTime :: IO Tar.EpochTime epochTime :: IO Tar.EpochTime
@ -61,3 +65,43 @@ serverBundle time title slug bp@BuildPlan {..} = GZip.compress $ Tar.write
toBuilder (asText "-") ++ toBuilder (asText "-") ++
toBuilder (display version) ++ toBuilder (display version) ++
toBuilder (asText "\n") toBuilder (asText "\n")
docsListing :: BuildPlan
-> FilePath -- ^ docs directory
-> IO ByteString
docsListing bp docsDir =
fmap (Y.encode . fold) $ mapM go $ mapToList $ bpAllPackages bp
where
go :: (PackageName, Version) -> IO (Map Text Y.Value)
go (package, version) = do -- handleAny (const $ return mempty) $ do
let dirname = fpFromText (concat
[ display package
, "-"
, display version
])
indexFP = (docsDir </> dirname </> "index.html")
ie <- isFile indexFP
if ie
then do
doc <- flip X.readFile indexFP X.def
{ X.psDecodeEntities = X.decodeHtmlEntities
}
let cursor = fromDocument doc
getPair x = take 1 $ do
href <- attribute "href" x
let name = concat $ x $// content
guard $ not $ null name
return (href, name)
pairs = cursor $// attributeIs "class" "module"
&/ laxElement "a" >=> getPair
m <- fmap fold $ forM pairs $ \(href, name) -> do
let suffix = dirname </> fpFromText href
e <- isFile $ docsDir </> suffix
return $ if e
then asMap $ singletonMap name [fpToText dirname, href]
else mempty
return $ singletonMap (display package) $ Y.object
[ "version" Y..= display version
, "modules" Y..= m
]
else return mempty

View File

@ -11,6 +11,8 @@ module Stackage2.Upload
, UploadDocs (..) , UploadDocs (..)
, uploadDocs , uploadDocs
, uploadHackageDistro , uploadHackageDistro
, UploadDocMap (..)
, uploadDocMap
) where ) where
import Control.Monad.Writer.Strict (execWriter, tell) import Control.Monad.Writer.Strict (execWriter, tell)
@ -20,7 +22,7 @@ import Network.HTTP.Client
import Network.HTTP.Client.MultipartFormData import Network.HTTP.Client.MultipartFormData
import Stackage2.BuildPlan (BuildPlan) import Stackage2.BuildPlan (BuildPlan)
import Stackage2.Prelude import Stackage2.Prelude
import Stackage2.ServerBundle (bpAllPackages) import Stackage2.ServerBundle (bpAllPackages, docsListing)
import System.IO.Temp (withSystemTempFile) import System.IO.Temp (withSystemTempFile)
newtype StackageServer = StackageServer { unStackageServer :: Text } newtype StackageServer = StackageServer { unStackageServer :: Text }
@ -169,6 +171,35 @@ uploadHackageDistro bp username password =
, method = "PUT" , method = "PUT"
} }
data UploadDocMap = UploadDocMap
{ udmServer :: StackageServer
, udmAuthToken :: Text
, udmSnapshot :: SnapshotIdent
, udmDocDir :: FilePath
, udmPlan :: BuildPlan
}
uploadDocMap UploadDocMap {..} man = do
docmap <- docsListing udmPlan udmDocDir
req1 <- parseUrl $ unpack $ unStackageServer udmServer ++ "/upload-doc-map"
req2 <- formDataBody (formData docmap) req1
let req3 = req2
{ method = "PUT"
, requestHeaders =
[ ("Authorization", encodeUtf8 udmAuthToken)
, ("Accept", "application/json")
] ++ requestHeaders req2
, redirectCount = 0
, checkStatus = \_ _ _ -> Nothing
, responseTimeout = Just 300000000
}
httpLbs req3 man
where
formData docmap =
[ partBS "snapshot" (encodeUtf8 $ unSnapshotIdent udmSnapshot)
, partFileRequestBody "docmap" "docmap" $ RequestBodyBS docmap
]
mkIndex :: String -> [String] -> String mkIndex :: String -> [String] -> String
mkIndex snapid dirs = concat mkIndex snapid dirs = concat
[ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>" [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"

View File

@ -75,6 +75,7 @@ library
, async , async
, streaming-commons >= 0.1.7.1 , streaming-commons >= 0.1.7.1
, semigroups , semigroups
, xml-conduit
executable stackage executable stackage
default-language: Haskell2010 default-language: Haskell2010