summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-12-09 22:22:03 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2025-12-09 22:22:03 +0100
commit72c83a013caed4f3f850731988734d125df6a720 (patch)
tree77ceff37bb85996c8a73720ef26e54e72ca9df28
parent1ece3ebb35fbe21009176b18acb4d649613e32e6 (diff)
Fix selecting single job from evaluated job ref
-rw-r--r--src/Command/Extract.hs4
-rw-r--r--src/Command/JobId.hs4
-rw-r--r--src/Command/Log.hs4
-rw-r--r--src/Command/Run.hs2
-rw-r--r--src/Command/Shell.hs4
-rw-r--r--src/Eval.hs12
-rw-r--r--test/asset/repo/checkout.yaml6
-rw-r--r--test/script/repo.et28
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")