@@ -324,7 +324,7 @@ let cram_commmands commands =
324324 Buffer. contents buf
325325;;
326326
327- let create_sh_script cram_stanzas ~temp_dir : sh_script Fiber. t =
327+ let create_sh_script cram_stanzas ~temp_dir ~ setup_scripts : sh_script Fiber. t =
328328 let script = Path. relative temp_dir " main.sh" in
329329 let oc = Io. open_out ~binary: true script in
330330 Fiber. finalize ~finally: (fun () -> Fiber. return @@ close_out oc)
@@ -373,6 +373,15 @@ let create_sh_script cram_stanzas ~temp_dir : sh_script Fiber.t =
373373 }
374374 in
375375 fprln oc " trap 'exit 0' EXIT" ;
376+ let * () =
377+ Fiber. sequential_iter setup_scripts ~f: (fun (script_path : Path.t ) ->
378+ let + script_sh_path = sh_path script_path in
379+ fprln oc " . %s" script_sh_path;
380+ match script_path with
381+ | In_source_tree _ -> assert false
382+ | External _ -> ()
383+ | In_build_dir _ -> fprln oc " rm -f %s" script_sh_path)
384+ in
376385 let + cram_to_output = Fiber. sequential_map ~f: loop cram_stanzas in
377386 let command_count = ! i in
378387 let metadata_file = Option. some_if (command_count > 0 ) metadata_file in
@@ -412,9 +421,9 @@ let make_temp_dir ~script =
412421 temp_dir
413422;;
414423
415- let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout =
424+ let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~ setup_scripts =
416425 let open Fiber.O in
417- let * sh_script = create_sh_script cram_stanzas ~temp_dir in
426+ let * sh_script = create_sh_script cram_stanzas ~temp_dir ~setup_scripts in
418427 let env = make_run_env env ~temp_dir ~cwd in
419428 let open Fiber.O in
420429 let sh =
@@ -482,13 +491,13 @@ let run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout =
482491 (timeout_msg @ [ timeout_set_message ])
483492;;
484493
485- let run_produce_correction ~conflict ~src ~env ~script ~timeout lexbuf =
494+ let run_produce_correction ~conflict ~src ~env ~script ~timeout ~ setup_scripts lexbuf =
486495 let temp_dir = make_temp_dir ~script in
487496 let cram_stanzas = cram_stanzas lexbuf ~conflict in
488497 let cwd = Path. parent_exn script in
489498 let env = make_run_env env ~temp_dir ~cwd in
490499 let open Fiber.O in
491- run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout
500+ run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~setup_scripts
492501 >> | compose_cram_output
493502;;
494503
@@ -501,7 +510,16 @@ module Script = Persistent.Make (struct
501510 let test_example () = []
502511 end )
503512
504- let run_and_produce_output ~conflict ~src ~env ~dir :cwd ~script ~dst ~timeout =
513+ let run_and_produce_output
514+ ~conflict
515+ ~src
516+ ~env
517+ ~dir :cwd
518+ ~script
519+ ~dst
520+ ~timeout
521+ ~setup_scripts
522+ =
505523 let script_contents = Io. read_file ~binary: false script in
506524 let lexbuf = Lexbuf. from_string script_contents ~fname: (Path. to_string script) in
507525 let temp_dir = make_temp_dir ~script in
@@ -511,7 +529,7 @@ let run_and_produce_output ~conflict ~src ~env ~dir:cwd ~script ~dst ~timeout =
511529 let env = make_run_env env ~temp_dir ~cwd in
512530 let open Fiber.O in
513531 let + commands =
514- run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout
532+ run_cram_test env ~src ~script ~cram_stanzas ~temp_dir ~cwd ~timeout ~setup_scripts
515533 >> | List. filter_map ~f: (function
516534 | Cram_lexer. Command c -> Some c
517535 | Comment _ -> None )
@@ -529,28 +547,42 @@ module Run = struct
529547 ; script : 'path
530548 ; output : 'target
531549 ; timeout : (Loc .t * float ) option
550+ ; setup_scripts : 'path list
532551 }
533552
534553 let name = " cram-run"
535- let version = 2
536-
537- let bimap ({ src = _ ; dir; script; output; timeout } as t ) f g =
538- { t with dir = f dir; script = f script; output = g output; timeout }
554+ let version = 3
555+
556+ let bimap ({ src = _ ; dir; script; output; timeout; setup_scripts } as t ) f g =
557+ { t with
558+ dir = f dir
559+ ; script = f script
560+ ; output = g output
561+ ; timeout
562+ ; setup_scripts = List. map ~f setup_scripts
563+ }
539564 ;;
540565
541566 let is_useful_to ~memoize :_ = true
542567
543- let encode { src = _ ; dir; script; output; timeout } path target : Sexp.t =
568+ let encode { src = _ ; dir; script; output; timeout; setup_scripts } path target
569+ : Sexp. t
570+ =
544571 List
545572 [ path dir
546573 ; path script
547574 ; target output
548575 ; Dune_sexp.Encoder. (option float (Option. map ~f: snd timeout))
549576 |> Dune_sexp. to_sexp
577+ ; List (List. map ~f: path setup_scripts)
550578 ]
551579 ;;
552580
553- let action { src; dir; script; output; timeout } ~ectx :_ ~(eenv : Action.env ) =
581+ let action
582+ { src; dir; script; output; timeout; setup_scripts }
583+ ~ectx :_
584+ ~(eenv : Action.env )
585+ =
554586 run_and_produce_output
555587 ~conflict: Ignore
556588 ~src
@@ -559,14 +591,15 @@ module Run = struct
559591 ~script
560592 ~dst: output
561593 ~timeout
594+ ~setup_scripts
562595 ;;
563596 end
564597
565598 include Action_ext. Make (Spec )
566599end
567600
568- let run ~src ~dir ~script ~output ~timeout =
569- Run. action { src; dir; script; output; timeout }
601+ let run ~src ~dir ~script ~output ~timeout ~ setup_scripts =
602+ Run. action { src; dir; script; output; timeout; setup_scripts }
570603;;
571604
572605module Make_script = struct
@@ -687,7 +720,8 @@ module Action = struct
687720 ~src: script
688721 ~env: eenv.env
689722 ~script
690- ~timeout: None )
723+ ~timeout: None
724+ ~setup_scripts: [] )
691725 ;;
692726 end
693727
0 commit comments