@@ -325,7 +325,7 @@ let cram_commmands commands =
325325 Buffer. contents buf
326326;;
327327
328- let create_sh_script cram_stanzas ~temp_dir : sh_script Fiber. t =
328+ let create_sh_script cram_stanzas ~temp_dir ~ setup_scripts : sh_script Fiber. t =
329329 let script = Path. relative temp_dir " main.sh" in
330330 let oc = Io. open_out ~binary: true script in
331331 Fiber. finalize ~finally: (fun () -> Fiber. return @@ close_out oc)
@@ -374,6 +374,15 @@ let create_sh_script cram_stanzas ~temp_dir : sh_script Fiber.t =
374374 }
375375 in
376376 fprln oc " trap 'exit 0' EXIT" ;
377+ let * () =
378+ Fiber. sequential_iter setup_scripts ~f: (fun (script_path : Path.t ) ->
379+ let + script_sh_path = sh_path script_path in
380+ fprln oc " . %s" script_sh_path;
381+ match script_path with
382+ | In_source_tree _ -> assert false
383+ | External _ -> ()
384+ | In_build_dir _ -> fprln oc " rm -f %s" script_sh_path)
385+ in
377386 let + cram_to_output = Fiber. sequential_map ~f: loop cram_stanzas in
378387 let command_count = ! i in
379388 let metadata_file = Option. some_if (command_count > 0 ) metadata_file in
@@ -413,9 +422,9 @@ let make_temp_dir ~script =
413422 temp_dir
414423;;
415424
416- let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout =
425+ let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~ setup_scripts =
417426 let open Fiber.O in
418- let * sh_script = create_sh_script cram_stanzas ~temp_dir in
427+ let * sh_script = create_sh_script cram_stanzas ~temp_dir ~setup_scripts in
419428 let env = make_run_env env ~temp_dir ~cwd in
420429 let open Fiber.O in
421430 let sh =
@@ -483,13 +492,21 @@ let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout =
483492 (timeout_msg @ [ timeout_set_message ])
484493;;
485494
486- let run_produce_correction ~conflict_markers ~src ~env ~script ~timeout lexbuf =
495+ let run_produce_correction
496+ ~conflict_markers
497+ ~src
498+ ~env
499+ ~script
500+ ~timeout
501+ ~setup_scripts
502+ lexbuf
503+ =
487504 let temp_dir = make_temp_dir ~script in
488505 let cram_stanzas = cram_stanzas lexbuf ~conflict_markers in
489506 let cwd = Path. parent_exn script in
490507 let env = make_run_env env ~temp_dir ~cwd in
491508 let open Fiber.O in
492- run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout
509+ run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~setup_scripts
493510 >> | compose_cram_output
494511;;
495512
@@ -502,7 +519,16 @@ module Script = Persistent.Make (struct
502519 let test_example () = []
503520 end )
504521
505- let run_and_produce_output ~conflict_markers ~src ~env ~dir :cwd ~script ~dst ~timeout =
522+ let run_and_produce_output
523+ ~conflict_markers
524+ ~src
525+ ~env
526+ ~dir :cwd
527+ ~script
528+ ~dst
529+ ~timeout
530+ ~setup_scripts
531+ =
506532 let script_contents = Io. read_file ~binary: false script in
507533 let lexbuf = Lexbuf. from_string script_contents ~fname: (Path. to_string script) in
508534 let temp_dir = make_temp_dir ~script in
@@ -512,7 +538,7 @@ let run_and_produce_output ~conflict_markers ~src ~env ~dir:cwd ~script ~dst ~ti
512538 let env = make_run_env env ~temp_dir ~cwd in
513539 let open Fiber.O in
514540 let + commands =
515- run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout
541+ run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~setup_scripts
516542 >> | List. filter_map ~f: (function
517543 | Cram_lexer. Command c -> Some c
518544 | Comment _ -> None )
@@ -530,28 +556,42 @@ module Run = struct
530556 ; script : 'path
531557 ; output : 'target
532558 ; timeout : (Loc .t * float ) option
559+ ; setup_scripts : 'path list
533560 }
534561
535562 let name = " cram-run"
536- let version = 2
537-
538- let bimap ({ src = _ ; dir; script; output; timeout } as t ) f g =
539- { t with dir = f dir; script = f script; output = g output; timeout }
563+ let version = 3
564+
565+ let bimap ({ src = _ ; dir; script; output; timeout; setup_scripts } as t ) f g =
566+ { t with
567+ dir = f dir
568+ ; script = f script
569+ ; output = g output
570+ ; timeout
571+ ; setup_scripts = List. map ~f setup_scripts
572+ }
540573 ;;
541574
542575 let is_useful_to ~memoize :_ = true
543576
544- let encode { src = _ ; dir; script; output; timeout } path target : Sexp.t =
577+ let encode { src = _ ; dir; script; output; timeout; setup_scripts } path target
578+ : Sexp. t
579+ =
545580 List
546581 [ path dir
547582 ; path script
548583 ; target output
549584 ; Dune_sexp.Encoder. (option float (Option. map ~f: snd timeout))
550585 |> Dune_sexp. to_sexp
586+ ; List (List. map ~f: path setup_scripts)
551587 ]
552588 ;;
553589
554- let action { src; dir; script; output; timeout } ~ectx :_ ~(eenv : Action.env ) =
590+ let action
591+ { src; dir; script; output; timeout; setup_scripts }
592+ ~ectx :_
593+ ~(eenv : Action.env )
594+ =
555595 run_and_produce_output
556596 ~conflict_markers: Ignore
557597 ~src
@@ -560,14 +600,15 @@ module Run = struct
560600 ~script
561601 ~dst: output
562602 ~timeout
603+ ~setup_scripts
563604 ;;
564605 end
565606
566607 include Action_ext. Make (Spec )
567608end
568609
569- let run ~src ~dir ~script ~output ~timeout =
570- Run. action { src; dir; script; output; timeout }
610+ let run ~src ~dir ~script ~output ~timeout ~ setup_scripts =
611+ Run. action { src; dir; script; output; timeout; setup_scripts }
571612;;
572613
573614module Make_script = struct
@@ -688,7 +729,8 @@ module Action = struct
688729 ~src: script
689730 ~env: eenv.env
690731 ~script
691- ~timeout: None )
732+ ~timeout: None
733+ ~setup_scripts: [] )
692734 ;;
693735 end
694736
0 commit comments