Source file dune_project_cache.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
let src = Logs.Src.create "dunolint" ~doc:"dunolint"
module Load_result = struct
type t =
| Absent
| Present of
(Dune_project_context.t, Dune_project_context.Invalid_dune_project.t) Result.t
end
type t = Load_result.t Hashtbl.M(Relative_path).t
let create () : t = Hashtbl.create (module Relative_path)
let load_dune_project_in_dir (t : t) ~dir : Load_result.t =
let file_path = Relative_path.extend dir (Fsegment.v "dune-project") in
match Hashtbl.find t file_path with
| Some load_result -> load_result
| None ->
let parsing_result =
match
match (Unix.stat (Relative_path.to_string file_path)).st_kind with
| exception Unix.Unix_error (ENOENT, _, _) -> `Absent
| file_kind ->
(match[@coverage off] file_kind with
| S_REG | S_LNK -> `Present
| S_DIR | S_CHR | S_BLK | S_FIFO | S_SOCK -> `Not_a_file)
with
| `Absent -> `Absent
| `Not_a_file -> `Absent [@coverage off]
| `Present ->
`Present
(try
let original_contents =
In_channel.read_all (file_path |> Relative_path.to_string)
in
Dune_project_context.create ~path:file_path ~original_contents
with
| exn ->
(let err =
Err.create
~loc:(Loc.of_file ~path:(file_path :> Fpath.t))
[ Pp.text "Failed to load dune-project file."; Err.exn exn ]
in
Error err)
[@coverage off])
in
let load_result : Load_result.t =
match parsing_result with
| `Absent ->
Log.debug ~src (fun () ->
Pp.O.
[ Pp.text "Dune project file does not exist at "
++ Pp_tty.path (module Relative_path) file_path
++ Pp.text "."
]);
Absent
| `Present (Ok _ as ok) ->
Log.info ~src (fun () ->
Pp.O.
[ Pp.text "Loaded dune-project file from "
++ Pp_tty.path (module Relative_path) file_path
++ Pp.text "."
]);
Present ok
| `Present (Error err) ->
Err.emit err ~level:Info;
Present (Error (Dune_project_context.Invalid_dune_project.acknowledge err))
in
Hashtbl.set t ~key:file_path ~data:load_result;
load_result
;;