package merlin-lib

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file file_id.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
type t = Unix.stats

let null_stat =
  { Unix.
    st_dev = -1; st_ino = -1; st_kind = Unix.S_REG; st_nlink = -1;
    st_perm = -1; st_uid = -1; st_gid = -1; st_rdev = -1; st_size = -1;
    st_atime = nan; st_mtime = nan; st_ctime = nan }

let get_res filename =
  try Result.ok @@ Unix.stat filename
  with _ -> Error ("Stat for" ^ filename ^ "couldn't be gathered")

let get filename =
  match get_res filename with Ok fn -> fn | Error _ -> null_stat

let check a b =
  a == b || (
    (a != null_stat) && (b != null_stat) &&
    let open Unix in
    a.st_mtime = b.st_mtime &&
    a.st_size = b.st_size &&
    a.st_ino = b.st_ino &&
    a.st_dev = b.st_dev
  )

let cache = ref None

let with_cache k =
  Std.let_ref cache (Some (Hashtbl.create 7)) k

let get filename =
  match !cache with
  | None -> get filename
  | Some table ->
    match Hashtbl.find table filename with
    | stats ->
      Logger.log ~section:"stat_cache" ~title:"reuse cache" "%s" filename;
      stats
    | exception Not_found ->
      let stats = get filename in
      Hashtbl.add table filename stats;
      stats
OCaml

Innovation. Community. Security.