summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-03-08 13:15:02 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2025-03-11 19:50:46 +0100
commitedc58142325d1fa985e04a2bfc7713771a2a7294 (patch)
tree0b7a3a20f4103eb4717094e8b326d642bbac4e2a
parentb2295603ac1a8e333079fe1a87c04b27bd4ce157 (diff)
Repo objects in job file
Changelog: Reference and checkout other repositories from job file
-rw-r--r--src/Config.hs54
-rw-r--r--src/Job/Types.hs1
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 ) ]