diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2025-03-08 13:15:02 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-03-11 19:50:46 +0100 |
commit | edc58142325d1fa985e04a2bfc7713771a2a7294 (patch) | |
tree | 0b7a3a20f4103eb4717094e8b326d642bbac4e2a | |
parent | b2295603ac1a8e333079fe1a87c04b27bd4ce157 (diff) |
Repo objects in job file
Changelog: Reference and checkout other repositories from job file
-rw-r--r-- | src/Config.hs | 54 | ||||
-rw-r--r-- | src/Job/Types.hs | 1 |
2 files changed, 44 insertions, 11 deletions
diff --git a/src/Config.hs b/src/Config.hs index a24ee56..da8a089 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -32,17 +32,20 @@ configFileName = "minici.yaml" data Config = Config - { configJobs :: [Job] + { configJobs :: [ Job ] + , configRepos :: [ DeclaredRepo ] } instance Semigroup Config where a <> b = Config { configJobs = configJobs a ++ configJobs b + , configRepos = configRepos a ++ configRepos b } instance Monoid Config where mempty = Config { configJobs = [] + , configRepos = [] } instance FromYAML Config where @@ -51,21 +54,43 @@ instance FromYAML Config where (Mapping pos _ _, _) -> pos (Sequence pos _ _, _) -> pos (Anchor pos _ _, _) -> pos - jobs <- fmap catMaybes $ forM (sortBy (comparing $ posLine . getpos) $ M.assocs m) $ \case - (Scalar _ (SStr tag), node) | ["job", name] <- T.words tag -> do - Just <$> parseJob name node - _ -> return Nothing - return $ Config jobs + foldM go mempty $ sortBy (comparing $ posLine . getpos) $ M.assocs m + where + go config = \case + (Scalar _ (SStr tag), node) + | [ "job", name ] <- T.words tag -> do + job <- parseJob name node + return $ config { configJobs = configJobs config ++ [ job ] } + | [ "repo", name ] <- T.words tag -> do + repo <- parseRepo name node + return $ config { configRepos = configRepos config ++ [ repo ] } + _ -> return config parseJob :: Text -> Node Pos -> Parser Job -parseJob name node = flip (withMap "Job") node $ \j -> Job - <$> pure (JobName name) - <*> choice +parseJob name node = flip (withMap "Job") node $ \j -> do + let jobName = JobName name + jobCheckout <- choice + [ parseSingleCheckout =<< j .: "checkout" + , parseMultipleCheckouts =<< j .: "checkout" + , withNull "no checkout" (return []) =<< j .: "checkout" + , return [ ( Nothing, Nothing ) ] + ] + jobRecipe <- choice [ cabalJob =<< j .: "cabal" , shellJob =<< j .: "shell" ] - <*> parseArtifacts j - <*> (maybe (return []) parseUses =<< j .:? "uses") + jobArtifacts <- parseArtifacts j + jobUses <- maybe (return []) parseUses =<< j .:? "uses" + return Job {..} + +parseSingleCheckout :: Node Pos -> Parser [ ( Maybe RepoName, Maybe FilePath ) ] +parseSingleCheckout = withMap "checkout definition" $ \m -> do + name <- m .:? "repo" + subtree <- m .:? "subtree" + return [ ( RepoName <$> name, T.unpack <$> subtree ) ] + +parseMultipleCheckouts :: Node Pos -> Parser [ ( Maybe RepoName, Maybe FilePath ) ] +parseMultipleCheckouts = withSeq "checkout definitions" $ fmap concat . mapM parseSingleCheckout cabalJob :: Node Pos -> Parser [CreateProcess] cabalJob = withMap "cabal job" $ \m -> do @@ -97,6 +122,13 @@ parseUses = withSeq "Uses list" $ mapM $ [job, art] <- return $ T.split (== '.') text return (JobName job, ArtifactName art) + +parseRepo :: Text -> Node Pos -> Parser DeclaredRepo +parseRepo name node = flip (withMap "Repo") node $ \r -> DeclaredRepo + <$> pure (RepoName name) + <*> (T.unpack <$> r .: "path") + + findConfig :: IO (Maybe FilePath) findConfig = go "." where diff --git a/src/Job/Types.hs b/src/Job/Types.hs index 50a6b43..bfc4b2e 100644 --- a/src/Job/Types.hs +++ b/src/Job/Types.hs @@ -10,6 +10,7 @@ import Repo data Job = Job { jobName :: JobName + , jobCheckout :: [ ( Maybe RepoName, Maybe FilePath ) ] , jobRecipe :: [ CreateProcess ] , jobArtifacts :: [ ( ArtifactName, CreateProcess ) ] , jobUses :: [ ( JobName, ArtifactName ) ] |