module Zifter.GoogleJavaFormat where
import Control.Monad
import System.Exit
import qualified System.FilePath as FP
import System.IO
import System.Process
import Safe
import Path
import Path.IO
import Zifter.Zift
googleJavaFormatZift :: Zift ()
googleJavaFormatZift = do
format <- getJavaFormatter
rd <- getRootDir
fs <- liftIO $ snd <$> listDirRecur rd
let sources =
filter (not . hidden) $ filter ((== ".java") . fileExtension) fs
forZ_ sources format
getJavaFormatter :: Zift (Path Abs File -> Zift ())
getJavaFormatter = do
downloadJavaFormatIfMissing
jarFile <- javaFormatterJarFile
pure $ \abspath ->
runZiftCommand $
unwords
[ "java"
, "-jar"
, toFilePath jarFile
, "--replace"
, toFilePath abspath
]
downloadJavaFormatIfMissing :: Zift ()
downloadJavaFormatIfMissing = do
jarFile <- javaFormatterJarFile
exists <- doesFileExist jarFile
unless exists $ do
ensureDir $ parent jarFile
runZiftCommand $
unwords
[ wgetCmd
, javaFormatterUrl
, "--output-document"
, toFilePath jarFile
]
javaFormatDir :: Zift (Path Abs Dir)
javaFormatDir = (</> $(mkRelDir "google-java-format")) <$> getTempDir
javaFormatterJarFile :: Zift (Path Abs File)
javaFormatterJarFile =
(</> $(mkRelFile "google-java-format-1.0-all-deps.jar")) <$> javaFormatDir
wgetCmd :: String
wgetCmd = "wget"
javaFormatterUrl :: FilePath
javaFormatterUrl =
"https://github.com/google/google-java-format/releases/download/google-java-format-1.0/google-java-format-1.0-all-deps.jar"
hidden :: Path Abs t -> Bool
hidden = any ((Just '.' ==) . headMay) . FP.splitPath . toFilePath
runZiftCommand :: String -> Zift ()
runZiftCommand command = do
let cp = shell command
(_, mouth, merrh, ph) <- liftIO $ createProcess cp
ec <- liftIO $ waitForProcess ph
case mouth of
Nothing -> pure ()
Just outh -> liftIO (hGetContents outh) >>= printZift
case merrh of
Nothing -> pure ()
Just errh -> liftIO (hGetContents errh) >>= printPreprocessingError
case ec of
ExitFailure c ->
fail $ unwords [command, "failed with exit code", show c]
ExitSuccess -> printPreprocessingDone $ unwords [command, "succeeded."]