summaryrefslogtreecommitdiff
path: root/src/Eval.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Eval.hs')
-rw-r--r--src/Eval.hs34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/Eval.hs b/src/Eval.hs
index 1828468..7e53128 100644
--- a/src/Eval.hs
+++ b/src/Eval.hs
@@ -14,6 +14,7 @@ import Control.Monad.Reader
import Data.Bifunctor
import Data.List
+import Data.Maybe
import Data.Text (Text)
import Data.Text qualified as T
@@ -22,7 +23,9 @@ import Job.Types
import Repo
data EvalInput = EvalInput
- { eiContainingRepo :: Maybe Repo
+ { eiJobRoot :: JobRoot
+ , eiRootPath :: FilePath
+ , eiContainingRepo :: Maybe Repo
, eiOtherRepos :: [ ( RepoName, Repo ) ]
}
@@ -66,17 +69,22 @@ evalJobSet ei decl = do
runExceptStr = first (T.unpack . textEvalError) . runExcept
-canonicalJobName :: [ Text ] -> Config -> Eval [ JobIdPart ]
-canonicalJobName (r : rs) config = do
+canonicalJobName :: [ Text ] -> Maybe Tree -> Config -> Eval [ JobIdPart ]
+canonicalJobName (r : rs) mbTree config = do
einput <- ask
let name = JobName r
case find ((name ==) . jobName) (configJobs config) of
Just djob -> do
job <- either throwError return $ runExcept $ evalJob einput djob
- let repos = nub $ map (\( EvaluatedJobRepo repo, _, _ ) -> repo) $ jobOtherCheckout job
+ repos <- concat <$> sequence
+ [ case mbTree of
+ Just _ -> return []
+ Nothing -> maybeToList <$> asks eiContainingRepo
+ , return $ nub $ map (\( EvaluatedJobRepo repo, _, _ ) -> repo) $ jobOtherCheckout job
+ ]
(JobIdName name :) <$> canonicalOtherCheckouts rs repos
Nothing -> throwError $ OtherEvalError $ "job ‘" <> r <> "’ not found"
-canonicalJobName [] _ = throwError $ OtherEvalError "expected job name"
+canonicalJobName [] _ _ = throwError $ OtherEvalError "expected job name"
canonicalOtherCheckouts :: [ Text ] -> [ Repo ] -> Eval [ JobIdPart ]
canonicalOtherCheckouts (r : rs) (repo : repos) = do
@@ -98,14 +106,14 @@ canonicalCommitConfig (r : rs) repo = do
Just tree -> return tree
Nothing -> throwError $ OtherEvalError $ "failed to resolve ‘" <> r <> "’ to a commit or tree in " <> T.pack (show repo)
config <- either fail return =<< loadConfigForCommit tree
- (JobIdTree (treeId tree) :) <$> canonicalJobName rs config
+ (JobIdTree (treeId tree) :) <$> canonicalJobName rs (Just tree) config
canonicalCommitConfig [] _ = throwError $ OtherEvalError "expected commit or tree reference"
-evalJobReference :: Config -> JobRef -> Eval JobId
-evalJobReference config (JobRef rs) =
- fmap JobId $ do
- asks eiContainingRepo >>= \case
- Just defRepo -> do
+evalJobReference :: JobRef -> Eval JobId
+evalJobReference (JobRef rs) =
+ JobId <$> do
+ asks eiJobRoot >>= \case
+ JobRootRepo defRepo -> do
canonicalCommitConfig rs defRepo
- Nothing -> do
- canonicalJobName rs config
+ JobRootConfig config -> do
+ canonicalJobName rs Nothing config