{-# LANGUAGE QuasiQuotes #-}
import Baserock.Schema.V9
import Control.Monad.State
import Gitlab
import Lens.Micro.Platform
import RIO
import RIO.List.Partial
import qualified RIO.ByteString as BS
import qualified RIO.HashMap as HM
import qualified RIO.HashMap.Partial as HMP
import qualified RIO.Text as Text
import qualified RIO.Text.Partial as TextP
import System.Environment ( getEnv
, getArgs
)
import System.Console.Docopt
patterns :: Docopt
patterns = [docopt|
Usage:
baserock bump-shas <stratum>
baserock sanitize <system>
|]
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) = parseMaybe (.: "aliases") =<< ybdconf :: Maybe Value
return $ (\(String y) -> y) <$> as
toSignificantSuffix = (!! 1) . TextP.splitOn ":"
sanitize x = do
s <- loadSystem x
xs <- use defStrata
logInfo $ "Saving all strata in system " <> displayShow x
forM_ (s ^.. (strata . traverse . stratumIncludeMorph)) $
liftM2 encodeFilePrettyLogged (Text.unpack) (xs HMP.!)
encodeFilePrettyLogged x s
main = do
args <- parseArgsOrExit patterns =<< getArgs
logOptions <- logOptionsHandle stdout True
when (args `isPresent` command "sanitize") $ do
f <- args `getArgOrExit` argument "system"
withLogFunc logOptions $ flip runRIO $
void $ flip execStateT mempty $ sanitize f
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 = fromString envBaseUrl
, glCredsToken = fromString envPrivateToken
}
withLogFunc logOptions $ flip runRIO $ do
s <- decodeFileThrowLogged f
let s2 = expandAliases aliases s
r <- runGitlab gconf $ traverseOf (chunks . traverse) bumpChunkSha s2
let s3 = contractAliases aliases r
encodeFilePrettyLogged f s3