From 93f8e3635237b8f6a152de05285164e43bbfb2b9 Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 06:00:30 +0530 Subject: [PATCH 1/7] fix: Fix crash on non-ASCII version in dune-project Signed-off-by: Sachin Beniwal --- src/dune_sexp/versioned_file.ml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dune_sexp/versioned_file.ml b/src/dune_sexp/versioned_file.ml index 914832570ff..40738ce7a03 100644 --- a/src/dune_sexp/versioned_file.ml +++ b/src/dune_sexp/versioned_file.ml @@ -57,11 +57,13 @@ struct let parse first_line : Instance.t = let { First_line.lang = name_loc, name; version = ver_loc, ver } = first_line in + let ver_atom = + match Atom.parse ver with + | Some atom -> atom + | None -> User_error.raise ~loc:ver_loc [ Pp.text "Invalid version string" ] + in let dune_lang_ver = - Decoder.parse - Syntax.Version.decode - Univ_map.empty - (Atom (ver_loc, Atom.of_string ver)) + Decoder.parse Syntax.Version.decode Univ_map.empty (Atom (ver_loc, ver_atom)) in match Table.find langs name with | None -> From d679ccc6c059a3ddd7a21606f5bb0dd675de9844 Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 21:21:38 +0530 Subject: [PATCH 2/7] test: updated tests for invalid version Signed-off-by: Sachin Beniwal --- .../blackbox-tests/test-cases/lang-invalid-version.t | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/blackbox-tests/test-cases/lang-invalid-version.t b/test/blackbox-tests/test-cases/lang-invalid-version.t index 544be4a4ff9..cbd63ee0c9d 100644 --- a/test/blackbox-tests/test-cases/lang-invalid-version.t +++ b/test/blackbox-tests/test-cases/lang-invalid-version.t @@ -5,7 +5,7 @@ such situations provide a clear error. > cat > dune-project < (lang dune $1) > EOF - > dune build 2>&1 | grep "Internal error" + > dune build 2>&1 | grep "Invalid version string" > } Invalid version number: @@ -16,16 +16,16 @@ Invalid version number: Test with various non-ASCII characters: $ test_invalid_version "è" - Internal error, please report upstream including the contents of _build/log. + Error: Invalid version string $ test_invalid_version "π3.14" - Internal error, please report upstream including the contents of _build/log. + Error: Invalid version string $ test_invalid_version "α" - Internal error, please report upstream including the contents of _build/log. + Error: Invalid version string $ test_invalid_version "😀" - Internal error, please report upstream including the contents of _build/log. + Error: Invalid version string $ test_invalid_version "中3.16文" - Internal error, please report upstream including the contents of _build/log. + Error: Invalid version string From 72e9fa18f80cbcc805ac534909f69b20e295dc5c Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 21:58:53 +0530 Subject: [PATCH 3/7] fix: better message for invalid version Signed-off-by: Sachin Beniwal --- src/dune_sexp/versioned_file.ml | 13 +++++- .../test-cases/lang-invalid-version.t | 41 ++++++++++++++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/dune_sexp/versioned_file.ml b/src/dune_sexp/versioned_file.ml index 40738ce7a03..8b7fa49d81d 100644 --- a/src/dune_sexp/versioned_file.ml +++ b/src/dune_sexp/versioned_file.ml @@ -60,7 +60,18 @@ struct let ver_atom = match Atom.parse ver with | Some atom -> atom - | None -> User_error.raise ~loc:ver_loc [ Pp.text "Invalid version string" ] + | None -> + let hint = + match Table.find langs name with + | None -> [] + | Some lang -> + let latest = Syntax.greatest_supported_version_exn lang.syntax in + [ Pp.textf "try %s" (Syntax.Version.to_string latest) ] + in + User_error.raise + ~loc:ver_loc + ~hints:hint + [ Pp.text "Invalid version. Version must be two numbers separated by a dot." ] in let dune_lang_ver = Decoder.parse Syntax.Version.decode Univ_map.empty (Atom (ver_loc, ver_atom)) diff --git a/test/blackbox-tests/test-cases/lang-invalid-version.t b/test/blackbox-tests/test-cases/lang-invalid-version.t index cbd63ee0c9d..948870fed4d 100644 --- a/test/blackbox-tests/test-cases/lang-invalid-version.t +++ b/test/blackbox-tests/test-cases/lang-invalid-version.t @@ -5,27 +5,56 @@ such situations provide a clear error. > cat > dune-project < (lang dune $1) > EOF - > dune build 2>&1 | grep "Invalid version string" + > dune build > } Invalid version number: $ test_invalid_version "Ali" + File "dune-project", line 1, characters 11-14: + 1 | (lang dune Ali) + ^^^ + Error: Atom of the form NNN.NNN expected [1] Test with various non-ASCII characters: $ test_invalid_version "è" - Error: Invalid version string + File "dune-project", line 1, characters 11-13: + 1 | (lang dune è) + ^^ + Error: Invalid version. Version must be two numbers separated by a dot. + Hint: try 3.21 + [1] $ test_invalid_version "π3.14" - Error: Invalid version string + File "dune-project", line 1, characters 11-17: + 1 | (lang dune π3.14) + ^^^^^^ + Error: Invalid version. Version must be two numbers separated by a dot. + Hint: try 3.21 + [1] $ test_invalid_version "α" - Error: Invalid version string + File "dune-project", line 1, characters 11-13: + 1 | (lang dune α) + ^^ + Error: Invalid version. Version must be two numbers separated by a dot. + Hint: try 3.21 + [1] $ test_invalid_version "😀" - Error: Invalid version string + File "dune-project", line 1, characters 11-15: + 1 | (lang dune 😀) + ^^^^ + Error: Invalid version. Version must be two numbers separated by a dot. + Hint: try 3.21 + [1] $ test_invalid_version "中3.16文" - Error: Invalid version string + File "dune-project", line 1, characters 11-21: + 1 | (lang dune 中3.16文) + ^^^^^^^^^^ + Error: Invalid version. Version must be two numbers separated by a dot. + Hint: try 3.21 + [1] From 27bd39a607186d00d98aa797ffd9173bcde5113b Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 22:42:22 +0530 Subject: [PATCH 4/7] fix: hint message Signed-off-by: Sachin Beniwal --- src/dune_sexp/versioned_file.ml | 2 +- test/blackbox-tests/test-cases/lang-invalid-version.t | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dune_sexp/versioned_file.ml b/src/dune_sexp/versioned_file.ml index 8b7fa49d81d..ea549e95195 100644 --- a/src/dune_sexp/versioned_file.ml +++ b/src/dune_sexp/versioned_file.ml @@ -66,7 +66,7 @@ struct | None -> [] | Some lang -> let latest = Syntax.greatest_supported_version_exn lang.syntax in - [ Pp.textf "try %s" (Syntax.Version.to_string latest) ] + [ Pp.textf "lang dune %s" (Syntax.Version.to_string latest) ] in User_error.raise ~loc:ver_loc diff --git a/test/blackbox-tests/test-cases/lang-invalid-version.t b/test/blackbox-tests/test-cases/lang-invalid-version.t index 948870fed4d..db58cdd9ab7 100644 --- a/test/blackbox-tests/test-cases/lang-invalid-version.t +++ b/test/blackbox-tests/test-cases/lang-invalid-version.t @@ -24,7 +24,7 @@ Test with various non-ASCII characters: 1 | (lang dune è) ^^ Error: Invalid version. Version must be two numbers separated by a dot. - Hint: try 3.21 + Hint: lang dune 3.21 [1] $ test_invalid_version "π3.14" @@ -32,7 +32,7 @@ Test with various non-ASCII characters: 1 | (lang dune π3.14) ^^^^^^ Error: Invalid version. Version must be two numbers separated by a dot. - Hint: try 3.21 + Hint: lang dune 3.21 [1] $ test_invalid_version "α" @@ -40,7 +40,7 @@ Test with various non-ASCII characters: 1 | (lang dune α) ^^ Error: Invalid version. Version must be two numbers separated by a dot. - Hint: try 3.21 + Hint: lang dune 3.21 [1] $ test_invalid_version "😀" @@ -48,7 +48,7 @@ Test with various non-ASCII characters: 1 | (lang dune 😀) ^^^^ Error: Invalid version. Version must be two numbers separated by a dot. - Hint: try 3.21 + Hint: lang dune 3.21 [1] $ test_invalid_version "中3.16文" @@ -56,5 +56,5 @@ Test with various non-ASCII characters: 1 | (lang dune 中3.16文) ^^^^^^^^^^ Error: Invalid version. Version must be two numbers separated by a dot. - Hint: try 3.21 + Hint: lang dune 3.21 [1] From b0a493f7ee2b50abcdeb886901a173a65830576f Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 22:47:20 +0530 Subject: [PATCH 5/7] fix: Update src/dune_sexp/versioned_file.ml Signed-off-by: Sachin Beniwal --- src/dune_sexp/versioned_file.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dune_sexp/versioned_file.ml b/src/dune_sexp/versioned_file.ml index ea549e95195..29a1da42fd1 100644 --- a/src/dune_sexp/versioned_file.ml +++ b/src/dune_sexp/versioned_file.ml @@ -61,7 +61,7 @@ struct match Atom.parse ver with | Some atom -> atom | None -> - let hint = + let hints = match Table.find langs name with | None -> [] | Some lang -> @@ -70,7 +70,7 @@ struct in User_error.raise ~loc:ver_loc - ~hints:hint + ~hints [ Pp.text "Invalid version. Version must be two numbers separated by a dot." ] in let dune_lang_ver = From 3cf2c3e453a7dbc23be3fb383987b89d295bff36 Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 23:10:04 +0530 Subject: [PATCH 6/7] fix: added CRs in lang-invalid-version.t Signed-off-by: Sachin Beniwal --- test/blackbox-tests/test-cases/lang-invalid-version.t | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/blackbox-tests/test-cases/lang-invalid-version.t b/test/blackbox-tests/test-cases/lang-invalid-version.t index db58cdd9ab7..efa0287d5f9 100644 --- a/test/blackbox-tests/test-cases/lang-invalid-version.t +++ b/test/blackbox-tests/test-cases/lang-invalid-version.t @@ -19,6 +19,9 @@ Invalid version number: Test with various non-ASCII characters: +CR-someday benodiwal: The version_loc is greedy and captures the closing +parenthesis. + $ test_invalid_version "è" File "dune-project", line 1, characters 11-13: 1 | (lang dune è) @@ -51,6 +54,9 @@ Test with various non-ASCII characters: Hint: lang dune 3.21 [1] +CR-someday benodiwal: Unicode string lengths are miscomputed in location +excerpts for East Asian characters. + $ test_invalid_version "中3.16文" File "dune-project", line 1, characters 11-21: 1 | (lang dune 中3.16文) From 58f8c7cb6decad9bd3a4d0453d06d664d098b3c9 Mon Sep 17 00:00:00 2001 From: Sachin Beniwal Date: Thu, 27 Nov 2025 23:49:36 +0530 Subject: [PATCH 7/7] added CHANGE entry Signed-off-by: Sachin Beniwal --- doc/changes/fixed/12794.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/changes/fixed/12794.md diff --git a/doc/changes/fixed/12794.md b/doc/changes/fixed/12794.md new file mode 100644 index 00000000000..e6359412a24 --- /dev/null +++ b/doc/changes/fixed/12794.md @@ -0,0 +1,3 @@ +- Improve error message when invalid version strings are used in `dune-project` + files. Non-ASCII characters and malformed versions now show a helpful hint + with an example of the correct format. (#12794, fixes #12751, @benodiwal)