diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2025-05-18 10:35:24 +0200 | 
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-05-20 22:03:55 +0200 | 
| commit | aa9926074264d63aa6ceb2f3dd81e1fb9f9d0d29 (patch) | |
| tree | e4d2b06e65fb11081fbc61787d05572cc904bc71 /src | |
| parent | 4ac26772681d74be2cbbf9376a02ebc395257c86 (diff) | |
Reflect dependencies in job id
Diffstat (limited to 'src')
| -rw-r--r-- | src/Eval.hs | 25 | 
1 files changed, 17 insertions, 8 deletions
| diff --git a/src/Eval.hs b/src/Eval.hs index 013c074..05381dd 100644 --- a/src/Eval.hs +++ b/src/Eval.hs @@ -58,22 +58,30 @@ isDefaultRepoMissingInId djob      matches (JobIdCommit rname _) = isNothing rname      matches (JobIdTree rname _ _) = isNothing rname -collectOtherRepos :: DeclaredJob -> Eval [ (( Maybe RepoName, Maybe Text ), FilePath ) ] -collectOtherRepos decl = do +collectOtherRepos :: DeclaredJobSet -> DeclaredJob -> Eval [ (( Maybe RepoName, Maybe Text ), FilePath ) ] +collectOtherRepos dset decl = do +    let dependencies = map fst $ jobUses decl +    dependencyRepos <- forM dependencies $ \name -> do +        jobs <- either (throwError . OtherEvalError . T.pack) return $ jobsetJobsEither dset +        job <- maybe (throwError $ OtherEvalError $ "job ‘" <> textJobName name <> "’ not found") return . find ((name ==) . jobName) $ jobs +        return $ jobOtherCheckout job +      missingDefault <- isDefaultRepoMissingInId decl +      let checkouts = concat              [ if missingDefault then map (( Nothing, Nothing ), ) $ jobContainingCheckout decl else []              , map (first (first Just)) $ jobOtherCheckout decl +            , map (first (first Just)) $ concat dependencyRepos              ]      let commonSubdir reporev = joinPath $ foldr1 commonPrefix $              map (maybe [] splitDirectories . jcSubtree . snd) . filter ((reporev ==) . fst) $ checkouts      return $ map (\r -> ( r, commonSubdir r )) . nub . map fst $ checkouts -evalJob :: [ ( Maybe RepoName, Tree ) ] -> DeclaredJob -> Eval Job -evalJob revisionOverrides decl = do +evalJob :: [ ( Maybe RepoName, Tree ) ] -> DeclaredJobSet -> DeclaredJob -> Eval Job +evalJob revisionOverrides dset decl = do      EvalInput {..} <- ask -    otherRepos <- collectOtherRepos decl +    otherRepos <- collectOtherRepos dset decl      otherRepoTrees <- forM otherRepos $ \(( mbname, mbrev ), commonPath ) -> do          ( mbname, ) . ( commonPath, ) <$> case lookup mbname revisionOverrides of              Just tree -> return tree @@ -101,7 +109,7 @@ evalJob revisionOverrides decl = do  evalJobSet :: [ ( Maybe RepoName, Tree ) ] -> DeclaredJobSet -> Eval JobSet  evalJobSet revisionOverrides decl = do -    jobs <- either (return . Left) (handleToEither . mapM (evalJob revisionOverrides)) $ jobsetJobsEither decl +    jobs <- either (return . Left) (handleToEither . mapM (evalJob revisionOverrides decl)) $ jobsetJobsEither decl      return JobSet          { jobsetCommit = jobsetCommit decl          , jobsetJobsEither = jobs @@ -121,9 +129,10 @@ evalRepo (Just name) = asks (lookup name . eiOtherRepos) >>= \case  canonicalJobName :: [ Text ] -> Config -> Eval JobId  canonicalJobName (r : rs) config = do      let name = JobName r +        dset = JobSet Nothing $ Right $ configJobs config      case find ((name ==) . jobName) (configJobs config) of          Just djob -> do -            otherRepos <- collectOtherRepos djob +            otherRepos <- collectOtherRepos dset djob              ( overrides, rs' ) <- (\f -> foldM f ( [], rs ) otherRepos) $                  \( overrides, crs ) (( mbname, _ ), path ) -> do                      ( tree, crs' ) <- readTreeFromIdRef crs path =<< evalRepo mbname @@ -131,7 +140,7 @@ canonicalJobName (r : rs) config = do              case rs' of                  (r' : _) -> throwError $ OtherEvalError $ "unexpected job ref part ‘" <> r' <> "’"                  _ -> return () -            jobId <$> evalJob overrides djob +            jobId <$> evalJob overrides dset djob          Nothing -> throwError $ OtherEvalError $ "job ‘" <> r <> "’ not found"  canonicalJobName [] _ = throwError $ OtherEvalError "expected job name" |