You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

80 lines
1.8 KiB

let readdir = dir => {
let items = ref([]);
let%lwt dir = Lwt_unix.opendir(dir);
let iterate = () => {
let%lwt _ =
while%lwt (true) {
let%lwt value = Lwt_unix.readdir(dir);
if (value.[0] != '.') {
items := [value, ...items^];
};
Lwt.return();
};
Lwt.return([]);
};
let%lwt items =
try%lwt (iterate()) {
| End_of_file => Lwt.return(items^)
};
let%lwt _ = Lwt_unix.closedir(dir);
Lwt.return(items);
};
let writeFile = (path, contents) => {
let%lwt targetFile = Lwt_io.open_file(~mode=Lwt_io.Output, path);
let%lwt () = Lwt_io.write(targetFile, contents);
let%lwt () = Lwt_io.close(targetFile);
Lwt.return();
};
let exists = path => {
try%lwt (Lwt_unix.file_exists(path)) {
| Unix.Unix_error(_, _, _) => Lwt.return(false)
};
};
let readlink = path =>
try%lwt (Lwt_unix.readlink(path) |> Lwt.map(x => Ok(x))) {
| err => Lwt.return_error(err)
};
// Credit: https://github.com/fastpack/fastpack/blob/9f6aa7d5b83ffef03e73a15679200576ff9dbcb7/FastpackUtil/FS.re#L94
let rec rmdir = dir => {
let%lwt files = Lwt_unix.files_of_directory(dir) |> Lwt_stream.to_list;
let%lwt () =
Lwt_list.iter_s(
filename =>
switch (filename) {
| "."
| ".." => Lwt.return_unit
| _ =>
let path = Filename.concat(dir, filename);
switch%lwt (Lwt_unix.stat(path)) {
| {st_kind: Lwt_unix.S_DIR, _} => rmdir(path)
| _ => Lwt_unix.unlink(path)
};
},
files,
);
Lwt_unix.rmdir(dir);
};
type path =
| Exists(string)
| Missing(string);
let rec realpath = path => {
switch%lwt (readlink(path)) {
| Ok(path) => realpath(path)
| Error(_) =>
switch%lwt (exists(path)) {
| true => Exists(path) |> Lwt.return
| false => Missing(path) |> Lwt.return
}
};
};