mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-02-12 14:27:30 +01:00
Upload docs map
This commit is contained in:
parent
bc5b77bdd5
commit
8651984bf3
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>"
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user