diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-07-19 10:38:37 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-07-24 21:17:52 +0200 |
| commit | e736b0a3ee8737b35fa79af644ca21cebafa76ef (patch) | |
| tree | 9749f2cf2857f640bbe1c985804339cfd50cdda4 | |
| parent | 87724986e6e9315a1ba20211e0d51882713ba259 (diff) | |
JobSet expression context and dependencies
| -rw-r--r-- | src/Eval.hs | 35 | ||||
| -rw-r--r-- | src/Job/Types.hs | 36 |
2 files changed, 41 insertions, 30 deletions
diff --git a/src/Eval.hs b/src/Eval.hs index 4e32c21..9ef8718 100644 --- a/src/Eval.hs +++ b/src/Eval.hs @@ -51,28 +51,6 @@ runEval :: Eval a -> EvalInput -> IO (Either EvalError a) runEval action einput = runExceptT $ flip runReaderT einput action -data RepoRef - = RepoRefTree Tree - | RepoRefCommit Commit - | RepoRefTag Commit (Tag Commit) - -repoRefRepo :: RepoRef -> Repo -repoRefRepo = \case - RepoRefTree tree -> treeRepo tree - RepoRefCommit commit -> commitRepo commit - RepoRefTag commit _ -> commitRepo commit - -repoRefTree :: (MonadIO m, MonadFail m) => RepoRef -> m Tree -repoRefTree = \case - RepoRefTree tree -> return tree - RepoRefCommit commit -> getCommitTree commit - RepoRefTag commit _ -> getCommitTree commit - -repoRefToIdPart :: MonadIO m => RepoRef -> m JobIdRepoPart -repoRefToIdPart = \case - RepoRefTree tree -> return $ JobIdTree (treeSubdir tree) (treeId tree) - RepoRefCommit commit -> return $ JobIdCommit (commitId commit) - RepoRefTag commit tag -> return $ JobIdTag (commitId commit) (tagId tag) repoRefLimit :: RepoDepLevel -> RepoRef -> Eval RepoRef repoRefLimit (RepoDepSubtree path) rref = do @@ -189,25 +167,22 @@ evalJobs (current : evaluating) evaluated repos dset reqs = do | RepoDepSubtree path <- deplevel -> do tree <- getCommitTree =<< readCommit repo revisionOverride - return $ Just ( JobIdTree path $ treeId tree, tree ) + return $ Just ( JobIdTree path $ treeId tree, RepoRefTree tree ) | RepoDepCommit <- deplevel -> do commit <- readCommit repo revisionOverride - tree <- getCommitTree commit - return $ Just ( JobIdCommit $ commitId commit, tree ) + return $ Just ( JobIdCommit $ commitId commit, RepoRefCommit commit ) | RepoDepTag <- deplevel -> do [ cid, tid ] <- return $ T.split (== '^') revisionOverride commit <- readCommit repo cid tag <- readTag repo tid - tree <- getCommitTree commit - return $ Just ( JobIdTag (commitId commit) (tagId tag), tree ) + return $ Just ( JobIdTag (commitId commit) (tagId tag), RepoRefTag commit tag ) Nothing -> do repoRef' <- repoRefLimit deplevel repoRef idpart <- repoRefToIdPart repoRef' - tree <- repoRefTree repoRef' - return $ Just ( idpart, tree ) + return $ Just ( idpart, repoRef' ) return $ fmap (\subtree -> ( mbrepo, subtree )) mbSubtree let otherRepoTrees = catMaybes otherRepoTreesMb if all isJust otherRepoTreesMb @@ -220,7 +195,7 @@ evalJobs (current : evaluating) evaluated repos dset reqs = do checkouts <- forM (jobCheckout current) $ \dcheckout -> do mbTree <- sequence $ msum - [ return . snd <$> lookup (jcRepo dcheckout) otherRepoTrees + [ repoRefTree . snd <$> lookup (jcRepo dcheckout) otherRepoTrees , repoRefTree <$> lookup (fst <$> jcRepo dcheckout) repos -- for containing repo if filtered from otherRepos ] return dcheckout diff --git a/src/Job/Types.hs b/src/Job/Types.hs index 6b436b5..682e056 100644 --- a/src/Job/Types.hs +++ b/src/Job/Types.hs @@ -1,5 +1,7 @@ module Job.Types where +import Control.Monad.IO.Class + import Data.Containers.ListUtils import Data.Kind import Data.Text (Text) @@ -11,6 +13,7 @@ import System.Process import {-# SOURCE #-} Config import Destination +import Expr import Repo @@ -172,3 +175,36 @@ repoDepPath = \case RepoDepSubtree path -> path RepoDepCommit -> "" RepoDepTag -> "" + + +data RepoRef + = RepoRefTree Tree + | RepoRefCommit Commit + | RepoRefTag Commit (Tag Commit) + +repoRefRepo :: RepoRef -> Repo +repoRefRepo = \case + RepoRefTree tree -> treeRepo tree + RepoRefCommit commit -> commitRepo commit + RepoRefTag commit _ -> commitRepo commit + +repoRefTree :: (MonadIO m, MonadFail m) => RepoRef -> m Tree +repoRefTree = \case + RepoRefTree tree -> return tree + RepoRefCommit commit -> getCommitTree commit + RepoRefTag commit _ -> getCommitTree commit + +repoRefToIdPart :: MonadIO m => RepoRef -> m JobIdRepoPart +repoRefToIdPart = \case + RepoRefTree tree -> return $ JobIdTree (treeSubdir tree) (treeId tree) + RepoRefCommit commit -> return $ JobIdCommit (commitId commit) + RepoRefTag commit tag -> return $ JobIdTag (commitId commit) (tagId tag) + + +data JobSetContext = JobSetContext + { jscRepos :: [ ( Maybe RepoName, Repo ) ] + , jscRepoRefs :: [ ( Maybe RepoName, RepoRef ) ] + } + +instance ExprContext JobSetContext where + type ExprDependency JobSetContext = [ JobSetDep ] |