From 72c83a013caed4f3f850731988734d125df6a720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Tue, 9 Dec 2025 22:22:03 +0100 Subject: Fix selecting single job from evaluated job ref --- src/Command/Extract.hs | 4 +--- src/Command/JobId.hs | 4 +--- src/Command/Log.hs | 4 +--- src/Command/Run.hs | 2 +- src/Command/Shell.hs | 4 +--- src/Eval.hs | 12 ++++++++++-- test/asset/repo/checkout.yaml | 6 ++++++ test/script/repo.et | 28 ++++++++++++++++++++++++++++ 8 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/Command/Extract.hs b/src/Command/Extract.hs index 366128c..8dee537 100644 --- a/src/Command/Extract.hs +++ b/src/Command/Extract.hs @@ -6,7 +6,6 @@ import Control.Monad import Control.Monad.Except import Control.Monad.IO.Class -import Data.Bifunctor import Data.Text qualified as T import System.Console.GetOpt @@ -80,8 +79,7 @@ cmdExtract (ExtractCommand ExtractOptions {..} ExtractArguments {..}) = do _ -> return False forM_ extractArtifacts $ \( ref, aname ) -> do - [ jid ] <- either tfail (return . map jobId) =<< - return . either (Left . textEvalError) (first T.pack . jobsetJobsEither) =<< + jid <- either (tfail . textEvalError) (return . jobId) =<< liftIO (runEval (evalJobReference ref) einput) tpath <- if diff --git a/src/Command/JobId.hs b/src/Command/JobId.hs index b349ebe..173f543 100644 --- a/src/Command/JobId.hs +++ b/src/Command/JobId.hs @@ -5,7 +5,6 @@ module Command.JobId ( import Control.Monad import Control.Monad.IO.Class -import Data.Bifunctor import Data.Text (Text) import Data.Text qualified as T @@ -53,8 +52,7 @@ cmdJobId :: JobIdCommand -> CommandExec () cmdJobId (JobIdCommand JobIdOptions {..} ref) = do einput <- getEvalInput out <- getOutput - [ JobId ids ] <- either tfail (return . map jobId) =<< - return . either (Left . textEvalError) (first T.pack . jobsetJobsEither) =<< + JobId ids <- either (tfail . textEvalError) (return . jobId) =<< liftIO (runEval (evalJobReference ref) einput) outputMessage out $ textJobId $ JobId ids diff --git a/src/Command/Log.hs b/src/Command/Log.hs index 438c25e..25bfc06 100644 --- a/src/Command/Log.hs +++ b/src/Command/Log.hs @@ -4,7 +4,6 @@ module Command.Log ( import Control.Monad.IO.Class -import Data.Bifunctor import Data.Text (Text) import Data.Text qualified as T import Data.Text.Lazy qualified as TL @@ -38,8 +37,7 @@ instance Command LogCommand where cmdLog :: LogCommand -> CommandExec () cmdLog (LogCommand ref) = do einput <- getEvalInput - [ jid ] <- either tfail (return . map jobId) =<< - return . either (Left . textEvalError) (first T.pack . jobsetJobsEither) =<< + jid <- either (tfail . textEvalError) (return . jobId) =<< liftIO (runEval (evalJobReference ref) einput) output <- getOutput storageDir <- getStorageDir diff --git a/src/Command/Run.hs b/src/Command/Run.hs index 04c7273..b299931 100644 --- a/src/Command/Run.hs +++ b/src/Command/Run.hs @@ -181,7 +181,7 @@ argumentJobSource names = do refJobSource :: [ JobRef ] -> CommandExec JobSource refJobSource [] = emptyJobSource refJobSource refs = do - sets <- foldl' addJobToList [] <$> cmdEvalWith id (mapM evalJobReference refs) + sets <- foldl' addJobToList [] <$> cmdEvalWith id (mapM evalJobReferenceToSet refs) oneshotJobSource sets where addJobToList :: [ JobSet ] -> JobSet -> [ JobSet ] diff --git a/src/Command/Shell.hs b/src/Command/Shell.hs index dfff50a..16f366e 100644 --- a/src/Command/Shell.hs +++ b/src/Command/Shell.hs @@ -5,7 +5,6 @@ module Command.Shell ( import Control.Monad import Control.Monad.IO.Class -import Data.Bifunctor import Data.Maybe import Data.Text (Text) import Data.Text qualified as T @@ -38,8 +37,7 @@ instance Command ShellCommand where cmdShell :: ShellCommand -> CommandExec () cmdShell (ShellCommand ref) = do einput <- getEvalInput - [ job ] <- either tfail return =<< - return . either (Left . textEvalError) (first T.pack . jobsetJobsEither) =<< + job <- either (tfail . textEvalError) return =<< liftIO (runEval (evalJobReference ref) einput) sh <- fromMaybe "/bin/sh" <$> liftIO (lookupEnv "SHELL") storageDir <- getStorageDir diff --git a/src/Eval.hs b/src/Eval.hs index 2afec42..6680c44 100644 --- a/src/Eval.hs +++ b/src/Eval.hs @@ -6,6 +6,7 @@ module Eval ( evalJobSet, evalJobSetSelected, evalJobReference, + evalJobReferenceToSet, loadJobSetById, ) where @@ -257,14 +258,21 @@ canonicalCommitConfig rs repo = do local (\ei -> ei { eiCurrentIdRev = JobIdTree Nothing "" (treeId tree) : eiCurrentIdRev ei }) $ canonicalJobName rs' config (Just tree) -evalJobReference :: JobRef -> Eval JobSet -evalJobReference (JobRef rs) = +evalJobReferenceToSet :: JobRef -> Eval JobSet +evalJobReferenceToSet (JobRef rs) = asks eiJobRoot >>= \case JobRootRepo defRepo -> do canonicalCommitConfig rs defRepo JobRootConfig config -> do canonicalJobName rs config Nothing +evalJobReference :: JobRef -> Eval Job +evalJobReference ref = do + jset <- evalJobReferenceToSet ref + jobs <- either (throwError . OtherEvalError . T.pack) return $ jobsetJobsEither jset + [ name ] <- return $ jobsetExplicitlyRequested jset + maybe (error "missing job in evalJobReferenceToSet result") return $ find ((name ==) . jobId) jobs + jobsetFromConfig :: [ JobIdPart ] -> Config -> Maybe Tree -> Eval ( DeclaredJobSet, [ JobIdPart ], [ ( Maybe RepoName, Tree ) ] ) jobsetFromConfig sid config _ = do diff --git a/test/asset/repo/checkout.yaml b/test/asset/repo/checkout.yaml index f1bcbc8..cc06691 100644 --- a/test/asset/repo/checkout.yaml +++ b/test/asset/repo/checkout.yaml @@ -84,6 +84,12 @@ job combined_subtree: - checkout_common_root.out - checkout_common_subtree2.out + shell: + - find \! -name 'list5' -type f > list5 + + artifact out: + path: list5 + job combined_all: uses: diff --git a/test/script/repo.et b/test/script/repo.et index aeeeb6a..7685aa7 100644 --- a/test/script/repo.et +++ b/test/script/repo.et @@ -263,3 +263,31 @@ test CheckoutSubtree: /\.\/d3_s3\/file3/ /(.*)/ capture done guard (done == "DONE") + + local: + spawn on n as p args [ "--storage=minici", "--repo=r1:./dir_r1", "--repo=r2:./dir_r2", "--repo=r3:./dir_r3", "./main", "run", "--rerun-all", "combined_subtree" ] + expect_success from p of "$mt.checkout_common_root.$r1t.$r2t" + expect_success from p of "$mt.checkout_common_subtree2.$r1t.$r2s1.$r3abc" + expect_success from p of "$mt.combined_subtree.$r1t.$r2t.$r3abc" + expect /(.*)/ from p capture done + guard (done == "run-finish") + local: + spawn on n as p args [ "--storage=minici", "--repo=r1:./dir_r1", "--repo=r2:./dir_r2", "--repo=r3:./dir_r3", "./main", "run", "--rerun-all", "$mt.combined_subtree.$r1t.$r2t.$r3abc" ] + expect_success from p of "$mt.checkout_common_root.$r1t.$r2t" + expect_success from p of "$mt.checkout_common_subtree2.$r1t.$r2s1.$r3abc" + expect_success from p of "$mt.combined_subtree.$r1t.$r2t.$r3abc" + expect /(.*)/ from p capture done + guard (done == "run-finish") + local: + spawn on n as p args [ "--storage=minici", "--repo=r1:./dir_r1", "--repo=r2:./dir_r2", "--repo=r3:./dir_r3", "./main", "extract", "$mt.combined_subtree.$r1t.$r2t.$r3abc.out", "list" ] + local: + shell on n as list: + cat list + rm list + echo DONE + expect from list: + /\.\/minici.yaml/ + /\.\/list2/ + /\.\/list4/ + /(.*)/ capture done + guard (done == "DONE") -- cgit v1.2.3