@@ -1,10 +1,19 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2+import Control.Monad (filterM, when)
2import qualified Data.ByteString.Char8 as S8
3import qualified Data.ByteString.Char8 as S8
4+import Data.List (isInfixOf, isPrefixOf,
3import Network.HTTP.Client
6import Network.HTTP.Client
4import Network.HTTP.Client.MultipartFormData
7import Network.HTTP.Client.MultipartFormData
8+import System.Directory (doesDirectoryExist,
5import System.Environment (getArgs, getEnv,
10import System.Environment (getArgs, getEnv,
6 getProgName)
11 getProgName)
7import System.Exit (exitFailure)
12import System.Exit (exitFailure)
13+import System.Exit (ExitCode (ExitSuccess))
14+import System.FilePath (takeDirectory, (</>))
15+import System.Process (createProcess, cwd,
16+ proc, waitForProcess)
9main :: IO ()
18main :: IO ()
10main = withManager defaultManagerSettings $ \m -> do
19main = withManager defaultManagerSettings $ \m -> do
@@ -22,6 +31,8 @@ main = withManager defaultManagerSettings $ \m -> do
23 exitFailure
32 exitFailure
34+ let uploadDocs = "exclusive" `isInfixOf` alias
25 putStrLn $ concat
36 putStrLn $ concat
26 [ "Uploading "
37 [ "Uploading "
27 , filepath
38 , filepath
@@ -41,5 +52,85 @@ main = withManager defaultManagerSettings $ \m -> do
41 [ ("Authorization", S8.pack token)
52 [ ("Authorization", S8.pack token)
42 , ("Accept", "application/json")
53 , ("Accept", "application/json")
43 ] ++ requestHeaders req2
54 ] ++ requestHeaders req2
56+ , checkStatus = \_ _ _ -> Nothing
58+ res <- httpLbs req3 m
61+ case lookup "x-stackage-ident" $ responseHeaders res of
63+ putStrLn $ "New ident: " ++ S8.unpack snapid
65+ Nothing -> error $ "An error occurred: " ++ show res
68+ putStrLn "Generating index file"
69+ let root = takeDirectory filepath </> "haddock"
70+ contents <- getDirectoryContents root
71+ dirs <- filterM (\n -> doesDirectoryExist $ root </> n)
72+ $ filter (not . ("." `isPrefixOf`))
74+ writeFile (root </> "index.html") $ mkIndex (S8.unpack snapid) dirs
75+ writeFile (root </> "style.css") styleCss
77+ putStrLn "Creating tarball"
78+ (Nothing, Nothing, Nothing, ph) <- createProcess
79+ (proc "tar" $ "czf" : "haddock.tar.xz" : "index.html" : "style.css" : dirs)
82+ ec <- waitForProcess ph
84+ then putStrLn "Haddock tarball generated"
85+ else error "Error generating Haddock tarball"
87+ putStrLn "Uploading Haddocks"
89+ req1 <- parseUrl $ "http://www.stackage.org/upload-haddock/"
92+ [ partFileSource "tarball" $ root </> "haddock.tar.xz"
94+ req2 <- formDataBody formData req1
98+ [ ("Authorization", S8.pack token)
99+ , ("Accept", "application/json")
100+ ] ++ requestHeaders req2
102+ , checkStatus = \_ _ _ -> Nothing
45− httpLbs req3 m >>= print
104+ httpLbs req3 m >>= print
106+mkIndex :: String -> [String] -> String
107+mkIndex snapid dirs = concat
108+ [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"
109+ , "<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css'>"
110+ , "<link rel='stylesheet' href='style.css'>"
112+ , "<body><div class='container'><h1>Haddock documentation index</h1>"
113+ , "<p><a href=\"http://www.stackage.org/stackage/"
115+ , "\">Return to snapshot</a></p><ul>"
116+ , concatMap toLI dirs
117+ , "</ul></div></body></html>"
130+ [ "@media (min-width: 530px) {"
131+ , "ul { -webkit-column-count: 2; -moz-column-count: 2; column-count: 2 }"
133+ , "@media (min-width: 760px) {"
134+ , "ul { -webkit-column-count: 3; -moz-column-count: 3; column-count: 3 }"