{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} import Baserock.Schema.V9 import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as BS8 import Control.Exception import Control.Lens hiding (argument) import Control.Monad (when) import Control.Monad.Except import Data.Char (toUpper) import Data.HashMap.Strict import Data.List import qualified Data.Text as Text import Data.Yaml import Gitlab import System.Environment (getEnv, getArgs) import System.Console.Docopt patterns :: Docopt patterns = [docopt| Usage: baserock bump-shas baserock sanitize |] getArgOrExit = getArgOrExitWith patterns chunkLatest :: MonadGitlab m => Chunk -> m GitlabCommitData chunkLatest = liftM2 getShaOfRef (toSignificantSuffix . _repo) _ref bumpChunkSha :: MonadGitlab m => Chunk -> m Chunk bumpChunkSha c = fmap (flip (sha ?~) c . commitId) . chunkLatest $ c getAliases ybdconf = do ybdconf <- decodeFile ybdconf :: IO (Maybe Object) let Just (Object as) = join $ parseMaybe (flip (.:) "aliases") <$> ybdconf :: Maybe Value return $ fmap (\(String y) -> y) $ as toSignificantSuffix = (!! 1) . Text.splitOn ":" main = do args <- parseArgsOrExit patterns =<< getArgs when (args `isPresent` command "sanitize") $ do f <- args `getArgOrExit` (argument "system") s <- decodeSystemAST f case s of Right r -> encodeSystemAST f r Left e -> throwIO e when (args `isPresent` command "bump-shas") $ do f <- args `getArgOrExit` (argument "stratum") envPrivateToken <- getEnv "GITLAB_PRIVATE_TOKEN" envBaseUrl <- getEnv "GITLAB_BASE_URL" aliases <- getAliases "ybd.conf" let gconf = GitlabConfig { glCredsUrl = BS8.pack envBaseUrl, glCredsToken = BS8.pack envPrivateToken } s <- either (error . show) id <$> decodeFileEither f let s2 = over (chunks . traverse . repo) (flip (foldrWithKey Text.replace) aliases) s r <- runGitlab gconf $ mapMOf (chunks . traverse) bumpChunkSha $ s2 let s3 = over (chunks . traverse . repo) (flip (foldlWithKey' ((flip . (flip . ) . flip) Text.replace)) aliases) r BS.writeFile f (toPrettyYaml s3)