aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/main.ml34
-rw-r--r--test/cli.t11
2 files changed, 45 insertions, 0 deletions
diff --git a/bin/main.ml b/bin/main.ml
index 51c4989..c915255 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -169,8 +169,42 @@ let load_ef_layer ?(user_overlays = []) () =
let dir = data_dir () in
let sanctoral_path = Filename.concat dir "sanctoral.sexp" in
let adjustments_path = Filename.concat dir "adjustments.sexp" in
+ (* An overlay handed to --overlay must be the S-expression form. The INI
+ form is real but is a SOURCE format: `colitur convert` turns it into one.
+ Feeding the INI here otherwise fails deep inside the sexp reader with
+ "more than one S-expression in file", which names neither the cause nor
+ the cure. Detect it and say both. *)
+ let looks_like_ini path =
+ match open_in path with
+ | exception _ -> false
+ | ic ->
+ (* Skip the comment header and stop at the first real line. The cap
+ only bounds how much of a binary file gets read; it is NOT a guess
+ at how long a header may be. The first version capped at 40 and
+ poland.ini's own header is 43 lines, so the detection silently
+ never fired on the very file it was written for. *)
+ let rec scan n =
+ if n > 2000 then false
+ else
+ match input_line ic with
+ | exception End_of_file -> false
+ | line ->
+ let l = String.trim line in
+ if l = "" || l.[0] = ';' || l.[0] = '#' then scan (n + 1)
+ else String.length l > 1 && l.[0] = '[' && l.[String.length l - 1] = ']'
+ in
+ let r = scan 0 in
+ close_in_noerr ic;
+ r
+ in
let load_overlay path =
match Colitur_kernel.Overlay.load Rite_ef.Vocab_ef.rank_of_sexp path with
+ | Error _ when looks_like_ini path ->
+ Error
+ (Printf.sprintf
+ "%s looks like an INI overlay, not an S-expression one.\n\
+ colitur: convert it first: colitur convert %s > overlay.sexp"
+ path path)
| Error e -> Error (Printf.sprintf "failed to load %s: %s" path e)
| Ok o -> Ok o
in
diff --git a/test/cli.t b/test/cli.t
index fe18800..b2c2263 100644
--- a/test/cli.t
+++ b/test/cli.t
@@ -1270,6 +1270,17 @@ slug the engine can produce over 2020-2045:
partial.ini: 1 of 725 celebrations named, 724 missing, 0 unknown
partial.ini: 0 of 104 book names, 104 missing
+An INI overlay handed to `--overlay` is DIAGNOSED, not left to fail inside the
+sexp reader. The INI form is a source format that `colitur convert` turns into
+the S-expression one; feeding it directly otherwise produced "more than one
+S-expression in file", which names neither the cause nor the cure.
+
+ $ printf '; a comment header\n\n[overlay]\nid = x\n' > o.ini
+ $ colitur day 2027 --overlay o.ini
+ colitur: o.ini looks like an INI overlay, not an S-expression one.
+ colitur: convert it first: colitur convert o.ini > overlay.sexp
+ [2]
+
`--check` REJECTS an unknown slug (exit 1), so a typo is visible rather than
silently dead -- its author would otherwise never learn why the name they
wrote never appears: