From 34eeb8cc99f0360277fda317531e6186dd55e8c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mauricio=20Fern=C3=A1ndez?= <mauricio.fernandez@ahrefs.com>
Date: Fri, 1 Jul 2022 23:53:51 +0200
Subject: [PATCH] Fix ocamldep-postproc in case-insensitive, case-preserving
 filesystems.

---
 src/builtin/omake_builtin_ocamldep.ml |  6 +-----
 src/ir/omake_cache.ml                 | 11 ++++++++++-
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/builtin/omake_builtin_ocamldep.ml b/src/builtin/omake_builtin_ocamldep.ml
index 56f3007..8ce4187 100644
--- a/src/builtin/omake_builtin_ocamldep.ml
+++ b/src/builtin/omake_builtin_ocamldep.ml
@@ -37,11 +37,7 @@ let ocamldep_postproc venv pos loc args =
     try
       let name1 = String.uncapitalize_ascii name
       and name2 = String.capitalize_ascii name in
-      let names = (* check name with orignal case first *)
-        if name1 = name then
-          [name1; name2]
-        else
-          [name2; name1] in
+      let names = (* check name with uncapitalized case first *) [name1; name2] in
       match Omake_target.target_is_buildable_in_path_1 cache venv pos path names with
         | Some node ->
             Some (Omake_env.venv_nodename venv node)
diff --git a/src/ir/omake_cache.ml b/src/ir/omake_cache.ml
index 04e5461..fe52bb5 100644
--- a/src/ir/omake_cache.ml
+++ b/src/ir/omake_cache.ml
@@ -779,6 +779,12 @@ let has_file_stat ?compact_stat ?digest cache node =
     has_file_stat_1 ?compact_stat ?digest cache node
 
 
+let unix_filename_exists path =
+  let basedir = Filename.dirname path in
+  let basename = Filename.basename path in
+  basename = "." || basename = ".." || Array.exists (String.equal basename) (Sys.readdir basedir)
+
+
 let stat_unix_node cache ~force node =
   (* We used to cache this information, but don't do this anymore. Hence,
      the [force] flag is ignored: we always re-stat
@@ -787,6 +793,7 @@ let stat_unix_node cache ~force node =
   let name = Omake_node.Node.fullname node in
   try
     let s = Unix.LargeFile.stat name in
+    if not @@ unix_filename_exists name then raise (Sys_error "");
     ex_set cache node true;
     s
   with
@@ -806,7 +813,9 @@ let lstat_unix_node _cache ~force node =
   ignore(force);
   let name = Omake_node.Node.fullname node in
   try
-    Unix.LargeFile.lstat name
+    let s = Unix.LargeFile.lstat name in
+    if not @@ unix_filename_exists name then raise (Sys_error "");
+    s
   with
       Unix.Unix_error _
     | Sys_error _ ->