From 755bef0c3e45a7c9400f6162f83838b6c027a54b Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Mon, 20 Oct 2014 15:47:33 +0300 Subject: [PATCH] Better create-snapshot --- Stackage/ServerFiles.hs | 4 +- stackage-upload.hs | 93 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/Stackage/ServerFiles.hs b/Stackage/ServerFiles.hs index 32663f5c..6473e617 100644 --- a/Stackage/ServerFiles.hs +++ b/Stackage/ServerFiles.hs @@ -35,9 +35,9 @@ createHackageFile isInc hp ii ghcVer date hackageH tarballH = do , ".stackage" ] hPutStr tarballH $ concat - [ "#!/bin/bash -ex\n\ncp ../build* .\ntar czfv " + [ "#!/bin/bash -ex\n\ntar czfv " , stackageFP - , " hackage desc" + , " hackage desc ../build*" ] indextargz <- getTarballName indexLBS <- L.readFile indextargz diff --git a/stackage-upload.hs b/stackage-upload.hs index d842ee29..42550fd2 100644 --- a/stackage-upload.hs +++ b/stackage-upload.hs @@ -1,10 +1,19 @@ {-# LANGUAGE OverloadedStrings #-} +import Control.Monad (filterM, when) import qualified Data.ByteString.Char8 as S8 +import Data.List (isInfixOf, isPrefixOf, + sort) import Network.HTTP.Client import Network.HTTP.Client.MultipartFormData +import System.Directory (doesDirectoryExist, + getDirectoryContents) import System.Environment (getArgs, getEnv, getProgName) import System.Exit (exitFailure) +import System.Exit (ExitCode (ExitSuccess)) +import System.FilePath (takeDirectory, ()) +import System.Process (createProcess, cwd, + proc, waitForProcess) main :: IO () main = withManager defaultManagerSettings $ \m -> do @@ -22,6 +31,8 @@ main = withManager defaultManagerSettings $ \m -> do ] exitFailure + let uploadDocs = "exclusive" `isInfixOf` alias + putStrLn $ concat [ "Uploading " , filepath @@ -41,5 +52,85 @@ main = withManager defaultManagerSettings $ \m -> do [ ("Authorization", S8.pack token) , ("Accept", "application/json") ] ++ requestHeaders req2 + , redirectCount = 0 + , checkStatus = \_ _ _ -> Nothing } - httpLbs req3 m >>= print + res <- httpLbs req3 m + + snapid <- + case lookup "x-stackage-ident" $ responseHeaders res of + Just snapid -> do + putStrLn $ "New ident: " ++ S8.unpack snapid + return snapid + Nothing -> error $ "An error occurred: " ++ show res + + when uploadDocs $ do + putStrLn "Generating index file" + let root = takeDirectory filepath "haddock" + contents <- getDirectoryContents root + dirs <- filterM (\n -> doesDirectoryExist $ root n) + $ filter (not . ("." `isPrefixOf`)) + $ sort contents + writeFile (root "index.html") $ mkIndex (S8.unpack snapid) dirs + writeFile (root "style.css") styleCss + + putStrLn "Creating tarball" + (Nothing, Nothing, Nothing, ph) <- createProcess + (proc "tar" $ "czf" : "haddock.tar.xz" : "index.html" : "style.css" : dirs) + { cwd = Just root + } + ec <- waitForProcess ph + if ec == ExitSuccess + then putStrLn "Haddock tarball generated" + else error "Error generating Haddock tarball" + + putStrLn "Uploading Haddocks" + + req1 <- parseUrl $ "http://www.stackage.org/upload-haddock/" + ++ S8.unpack snapid + let formData = + [ partFileSource "tarball" $ root "haddock.tar.xz" + ] + req2 <- formDataBody formData req1 + let req3 = req2 + { method = "PUT" + , requestHeaders = + [ ("Authorization", S8.pack token) + , ("Accept", "application/json") + ] ++ requestHeaders req2 + , redirectCount = 0 + , checkStatus = \_ _ _ -> Nothing + } + httpLbs req3 m >>= print + +mkIndex :: String -> [String] -> String +mkIndex snapid dirs = concat + [ "\nHaddocks index" + , "" + , "" + , "" + , "

Haddock documentation index

" + , "

Return to snapshot

" + ] + where + toLI name = concat + [ "
  • " + , name + , "
  • " + ] + +styleCss :: String +styleCss = concat + [ "@media (min-width: 530px) {" + , "ul { -webkit-column-count: 2; -moz-column-count: 2; column-count: 2 }" + , "}" + , "@media (min-width: 760px) {" + , "ul { -webkit-column-count: 3; -moz-column-count: 3; column-count: 3 }" + , "}" + ]