Merge pull request #1110 from rgrinberg/1102

Fix #1102
This commit is contained in:
Rudi Grinberg 2018-08-08 23:28:50 +03:00 committed by GitHub
commit a364078541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 147 additions and 25 deletions

View File

@ -9,8 +9,12 @@ next
- Fix duplicate profile argument in suggested command when an external library - Fix duplicate profile argument in suggested command when an external library
is missing (#1109, #1106, @emillon) is missing (#1109, #1106, @emillon)
- Fix #1107. `-opaque` wasn't correctly being added to modules without - `-opaque` wasn't correctly being added to modules without an interface.
an interface. (#1108, fix #1107, @rgrinberg) (#1108, fix #1107, @rgrinberg)
- Fix validation of library `name` fields and make sure this validation also
applies when the `name` is derived from the `public_name`. (#1110, fix #1102,
@rgrinberg)
1.1.0 (06/08/2018) 1.1.0 (06/08/2018)
------------------ ------------------

View File

@ -37,21 +37,81 @@ let module_name =
let module_names = list module_name >>| String.Set.of_list let module_names = list module_name >>| String.Set.of_list
let invalid_lib_name ~loc = of_sexp_errorf loc "invalid library name" module Lib_name : sig
type t
let library_name = type result =
plain_string (fun ~loc name -> | Ok of t
| Warn of t
| Invalid
val invalid_message : string
val to_string : t -> string
val of_string : string -> result
val validate : (Loc.t * result) -> wrapped:bool -> t
val t : (Loc.t * result) Sexp.Of_sexp.t
end = struct
type t = string
let invalid_message =
"invalid library name.\n\
Hint: library names must be non-empty and composed only of \
the following characters: 'A'..'Z', 'a'..'z', '_' or '0'..'9'"
let wrapped_message =
sprintf
"%s.\n\
This is temporary allowed for libraries with (wrapped false).\
\nIt will not be supported in the future. \
Please choose a valid name field."
invalid_message
type result =
| Ok of t
| Warn of t
| Invalid
let validate (loc, res) ~wrapped =
match res, wrapped with
| Ok s, _ -> s
| Warn _, true -> Loc.fail loc "%s" wrapped_message
| Warn s, false -> Loc.warn loc "%s" wrapped_message; s
| Invalid, _ -> Loc.fail loc "%s" invalid_message
let valid_char = function
| 'A'..'Z' | 'a'..'z' | '_' | '0'..'9' -> true
| _ -> false
let to_string s = s
let of_string name =
match name with match name with
| "" -> invalid_lib_name ~loc | "" -> Invalid
| s -> | s ->
if s.[0] = '.' then invalid_lib_name ~loc if s.[0] = '.' then
Invalid
else else
try let len = String.length s in
String.iter s ~f:(function let rec loop warn i =
| 'A'..'Z' | 'a'..'z' | '_' | '.' | '0'..'9' -> () if i = len - 1 then
| _ -> raise_notrace Exit); if warn then Warn s else Ok s
s else
with Exit -> invalid_lib_name ~loc) let c = String.unsafe_get s i in
if valid_char c then
loop warn (i + 1)
else if c = '.' then
loop true (i + 1)
else
Invalid
in
loop false 0
let t = plain_string (fun ~loc s -> (loc, of_string s))
end
let file = let file =
plain_string (fun ~loc s -> plain_string (fun ~loc s ->
@ -868,7 +928,7 @@ module Library = struct
record record
(let%map buildable = Buildable.t (let%map buildable = Buildable.t
and loc = loc and loc = loc
and name = field_o "name" library_name and name = field_o "name" Lib_name.t
and public = Public_lib.public_name_field and public = Public_lib.public_name_field
and synopsis = field_o "synopsis" string and synopsis = field_o "synopsis" string
and install_c_headers = and install_c_headers =
@ -899,10 +959,20 @@ module Library = struct
in in
let name = let name =
match name, public with match name, public with
| Some n, _ -> n | Some n, _ ->
| None, Some { name = (_loc, name) ; _ } -> Lib_name.validate n ~wrapped
|> Lib_name.to_string
| None, Some { name = (loc, name) ; _ } ->
if dune_version >= (1, 1) then if dune_version >= (1, 1) then
name match Lib_name.of_string name with
| Ok m -> Lib_name.to_string m
| Warn _ | Invalid ->
of_sexp_errorf loc
"%s.\n\
Public library names don't have this restriction. \
You can either change this public name to be a valid library \
name or add a \"name\" field with a valid library name."
Lib_name.invalid_message
else else
of_sexp_error loc "name field cannot be omitted before version \ of_sexp_error loc "name field cannot be omitted before version \
1.1 of the dune language" 1.1 of the dune language"
@ -1107,13 +1177,7 @@ module Executables = struct
else else
s ^ "s" s ^ "s"
let common let common =
(* : (Loc.t * string) list option
* -> (Loc.t * string) list option
* -> multi:bool
* -> unit
* -> t * Install_conf.t option Sexp.Of_sexp.t *)
=
let%map buildable = Buildable.t let%map buildable = Buildable.t
and (_ : bool) = field "link_executables" ~default:true and (_ : bool) = field "link_executables" ~default:true
(Syntax.deleted_in Stanza.syntax (1, 0) >>> bool) (Syntax.deleted_in Stanza.syntax (1, 0) >>> bool)

View File

@ -490,6 +490,14 @@
(run %{exe:cram.exe} -skip-versions 4.02.3 -test run.t) (run %{exe:cram.exe} -skip-versions 4.02.3 -test run.t)
(diff? run.t run.t.corrected))))) (diff? run.t run.t.corrected)))))
(alias
(name name-field-validation)
(deps (package dune) (source_tree test-cases/name-field-validation))
(action
(chdir
test-cases/name-field-validation
(progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected)))))
(alias (alias
(name no-installable-mode) (name no-installable-mode)
(deps (package dune) (source_tree test-cases/no-installable-mode)) (deps (package dune) (source_tree test-cases/no-installable-mode))
@ -818,6 +826,7 @@
(alias missing-loc-run) (alias missing-loc-run)
(alias multi-dir) (alias multi-dir)
(alias multiple-private-libs) (alias multiple-private-libs)
(alias name-field-validation)
(alias no-installable-mode) (alias no-installable-mode)
(alias no-name-field) (alias no-name-field)
(alias null-dep) (alias null-dep)
@ -908,6 +917,7 @@
(alias misc) (alias misc)
(alias missing-loc-run) (alias missing-loc-run)
(alias multi-dir) (alias multi-dir)
(alias name-field-validation)
(alias no-installable-mode) (alias no-installable-mode)
(alias no-name-field) (alias no-name-field)
(alias null-dep) (alias null-dep)

View File

@ -0,0 +1 @@
Foo.run ();;

View File

@ -0,0 +1,9 @@
(library
(modules foo)
(name foo.bar)
(wrapped false))
(executable
(modules bar)
(name bar)
(libraries foo.bar))

View File

@ -0,0 +1 @@
(lang dune 1.1)

View File

@ -0,0 +1 @@
let run () = print_endline "foo"

View File

@ -0,0 +1,7 @@
$ dune exec ./bar.exe
File "dune", line 3, characters 7-14:
Warning: invalid library name.
Hint: library names must be non-empty and composed only of the following characters: 'A'..'Z', 'a'..'z', '_' or '0'..'9'.
This is temporary allowed for libraries with (wrapped false).
It will not be supported in the future. Please choose a valid name field.
foo

View File

@ -0,0 +1 @@
(library (public_name c.find))

View File

@ -0,0 +1 @@
(lang dune 1.1)

View File

@ -0,0 +1,3 @@
(library
(wrapped false)
(public_name foo.bar))

View File

@ -4,7 +4,7 @@ the name field can be omitted for libraries when public_name is present
this isn't possible for older syntax <= (1, 0) this isn't possible for older syntax <= (1, 0)
$ dune build --root no-name-lib-syntax-1-0 $ dune build --root no-name-lib-syntax-1-0
File "dune", line 1, characters 0-27: File "dune", line 1, characters 22-25:
Error: name field cannot be omitted before version 1.1 of the dune language Error: name field cannot be omitted before version 1.1 of the dune language
[1] [1]
@ -17,3 +17,23 @@ executable(s) stanza works the same way
File "dune", line 1, characters 0-36: File "dune", line 1, characters 0-36:
Error: name field may not be omitted before dune version 1.1 Error: name field may not be omitted before dune version 1.1
[1] [1]
there's only a public name but it's invalid as a name
$ dune build --root public-name-invalid-name
File "dune", line 1, characters 22-28:
Error: invalid library name.
Hint: library names must be non-empty and composed only of the following characters: 'A'..'Z', 'a'..'z', '_' or '0'..'9'.
Public library names don't have this restriction. You can either change this public name to be a valid library name or add a "name" field with a valid library name.
[1]
there's only a public name which is invalid, but sine the library is unwrapped,
it's just a warning
$ dune build --root public-name-invalid-wrapped-false
Info: creating file dune-project with this contents: (lang dune 1.1)
File "dune", line 3, characters 14-21:
Error: invalid library name.
Hint: library names must be non-empty and composed only of the following characters: 'A'..'Z', 'a'..'z', '_' or '0'..'9'.
Public library names don't have this restriction. You can either change this public name to be a valid library name or add a "name" field with a valid library name.
[1]