94 lines
2.6 KiB
OCaml
94 lines
2.6 KiB
OCaml
|
|
open Stdune
|
||
|
|
|
||
|
|
let temp_dir () = Temp.create Dir ~prefix:"copyfile" ~suffix:"test"
|
||
|
|
|
||
|
|
let%expect_test "copy file simple" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
Io.write_file src "foobarbaz";
|
||
|
|
Io.copy_file ~src ~dst ();
|
||
|
|
print_endline (Io.read_file dst);
|
||
|
|
[%expect {| foobarbaz |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "copy file overwrite" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
Io.write_file src "foobarbaz";
|
||
|
|
Io.write_file dst "xxx";
|
||
|
|
Io.copy_file ~src ~dst ();
|
||
|
|
print_endline (Io.read_file dst);
|
||
|
|
[%expect {| foobarbaz |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "copy file chmod" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
Io.write_file src "foobarbaz";
|
||
|
|
Io.copy_file ~chmod:(fun _ -> 428) ~src ~dst ();
|
||
|
|
print_endline (Io.read_file dst);
|
||
|
|
Printf.printf "permissions: %d\n" (Path.stat_exn dst).st_perm;
|
||
|
|
[%expect
|
||
|
|
{|
|
||
|
|
foobarbaz
|
||
|
|
permissions: 428 |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "copy file - no src" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
match Io.copy_file ~src ~dst () with
|
||
|
|
| () -> assert false
|
||
|
|
| exception Sys_error s ->
|
||
|
|
let s =
|
||
|
|
let _, exn = String.lsplit2_exn s ~on:':' in
|
||
|
|
sprintf "$PATH:%s" exn
|
||
|
|
in
|
||
|
|
print_endline s;
|
||
|
|
[%expect {| $PATH: No such file or directory |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "copy file - src is a directory" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
Unix.mkdir (Path.to_string src) 0o755;
|
||
|
|
Io.copy_file ~src ~dst ();
|
||
|
|
[%expect.unreachable]
|
||
|
|
[@@expect.uncaught_exn {| (Sys_error "Is a directory") |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "copy file - dst is a directory" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let src = Path.relative dir "initial" in
|
||
|
|
let dst = Path.relative dir "final" in
|
||
|
|
Io.write_file src "foobarbaz";
|
||
|
|
Unix.mkdir (Path.to_string dst) 0o755;
|
||
|
|
Unix.sleepf 0.5;
|
||
|
|
match Io.copy_file ~src ~dst () with
|
||
|
|
| _ -> assert false
|
||
|
|
| exception Sys_error s ->
|
||
|
|
let s =
|
||
|
|
let _, exn = String.lsplit2_exn s ~on:':' in
|
||
|
|
sprintf "$DIR:%s" exn
|
||
|
|
in
|
||
|
|
print_endline s;
|
||
|
|
[%expect {| $DIR: Is a directory |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "making a directory for an existing file" =
|
||
|
|
let dir = temp_dir () in
|
||
|
|
let fn = Path.relative dir "foo" in
|
||
|
|
Io.write_file fn "";
|
||
|
|
(* This does not error, but it will if it ends with a "/" on MacOS *)
|
||
|
|
ignore (Fpath.mkdir (Path.to_string fn));
|
||
|
|
[%expect {| |}];
|
||
|
|
Path.mkdir_p fn;
|
||
|
|
(* This in turn does not error *)
|
||
|
|
[%expect {| |}]
|
||
|
|
;;
|