diff --git a/src/Manage.curry b/src/Manage.curry index f0665522fe362507a08e1ae09dc8fc4577f9bc12..01501faf0c6a209c7bc127650051f816251a2d64 100644 --- a/src/Manage.curry +++ b/src/Manage.curry @@ -12,6 +12,8 @@ import CSV ( readCSVFile ) import Directory ( copyFile, doesFileExist, doesDirectoryExist , createDirectoryIfMissing, getCurrentDirectory ) import FilePath ( (</>) ) +import HTML +import IOExts ( evalCmd ) import List ( sum ) import System ( getArgs, exitWith, system ) @@ -23,6 +25,7 @@ main :: IO () main = do args <- getArgs case args of + ["genhtml"] -> writeAllPackagesAsHTML ["testall"] -> testAllPackages ["add",pkgfile] -> addNewPackage pkgfile _ -> do putStrLn $ "Wrong arguments!\n\n" ++ helpText @@ -32,13 +35,50 @@ helpText :: String helpText = unlines $ [ "Options:", "" , "add package.json : add this package to the central repository" + , "genhtml : generate HTML pages of central repository" , "testall : test all packages of the central repository"] +------------------------------------------------------------------------------ +-- Generate web pages of the central repository +writeAllPackagesAsHTML :: IO () +writeAllPackagesAsHTML = do + system ("cpm list --csv > allpkgs.csv") + allinfos <- readCSVFile "allpkgs.csv" >>= return . tail + let indexfile = "index.html" + putStrLn $ "Writing '" ++ indexfile ++ "'..." + writeVisibleFile indexfile $ showHtmlPage $ + standardPage "Curry Packages in the CPM Repository" + [packageInfosAsHtmlTable allinfos] + mapIO_ writePackageAsHTML allinfos + system "rm -f allpkgs.csv" >> done + where + writePackageAsHTML pkginfo = case pkginfo of + [name,_,version] -> do + let htmlfile = name ++ ".html" + putStrLn $ "Writing '" ++ htmlfile ++ "'..." + (_,out,_) <- evalCmd "cpm" ["info","-a","-p",name,version] "" + writeVisibleFile htmlfile $ showHtmlPage $ + standardPage ("Curry Package '"++name++"'") [verbatim out] + _ -> error $ "Illegal package info: " ++ show pkginfo + + writeVisibleFile f s = writeFile f s >> system ("chmod 644 " ++ f) >> done + +-- Format a list of package infos (name, synopsi, version) as an HTML table +packageInfosAsHtmlTable :: [[String]] -> HtmlExp +packageInfosAsHtmlTable pkginfos = + headedTable $ [map ((:[]) . htxt) ["Name", "Synopsis", "Version"] ] ++ + map formatPkg pkginfos + where + formatPkg pkginfo = case pkginfo of + [pname,psyn,pversion] -> [ [href (pname++".html") [htxt pname]] + , [htxt psyn], [htxt pversion] ] + _ -> error $ "Illegal package info: " ++ show pkginfo + + ------------------------------------------------------------------------------ -- Run `cpm test` on all packages of the central repository testAllPackages :: IO () testAllPackages = do - --system ("cpm list --all --csv > allpkgs.csv") system ("cpm list --csv > allpkgs.csv") allinfos <- readCSVFile "allpkgs.csv" >>= return . tail runAllTests allinfos @@ -51,7 +91,7 @@ testAllPackages = do recreateDirectory bindir results <- mapIO (testPackage bindir) allinfos if sum (map fst results) == 0 - then putStrLn "PACKAGES SUCCESSFULLY TESTED!" + then putStrLn $ show (length allinfos) ++ " PACKAGES SUCCESSFULLY TESTED!" else do putStrLn $ "ERRORS OCCURRED IN PACKAGES: " ++ unwords (map snd (filter ((> 0) . fst) results)) exitWith 1