Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/dune_rules/opam_create.ml
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ let package_fields
; depends
; conflicts
; depopts
; available
; info = _
; id = _
; version = _
Expand Down Expand Up @@ -143,7 +144,14 @@ let package_fields
| [] -> None
| _ :: _ -> Some (k, list Package.Dependency.opam_depend v))
in
let fields = [ optional; dep_fields ] in
let available_field =
match available with
| None -> []
| Some constraint_ ->
let opam_constraint = Package.Constraint.opam_constraint constraint_ in
[ "available", opam_constraint ]
in
let fields = [ optional; dep_fields; available_field ] in
let fields =
let dune_version = Dune_project.dune_version project in
if dune_version >= (2, 0) && tags <> [] then tags :: fields else fields
Expand All @@ -155,7 +163,7 @@ let dune_name = Package.Name.of_string "dune"
let odoc_name = Package.Name.of_string "odoc"

let insert_dune_dep depends dune_version =
let constraint_ : Package.Dependency.Constraint.t =
let constraint_ : Package.Constraint.t =
let dune_version = Dune_lang.Syntax.Version.to_string dune_version in
Uop (Gte, String_literal dune_version)
in
Expand Down Expand Up @@ -186,15 +194,15 @@ let insert_dune_dep depends dune_version =
loop [] depends
;;

let rec already_requires_odoc : Package.Dependency.Constraint.t -> bool = function
let rec already_requires_odoc : Package.Constraint.t -> bool = function
| Bvar { name = "with-doc" | "build" | "post" } | Uop _ | Bop _ -> true
| Bvar _ -> false
| And l -> List.for_all ~f:already_requires_odoc l
| Or l -> List.exists ~f:already_requires_odoc l
;;

let insert_odoc_dep depends =
let with_doc : Package.Dependency.Constraint.t = Bvar { name = "with-doc" } in
let with_doc : Package.Constraint.t = Bvar { name = "with-doc" } in
let odoc_dep = { Package.Dependency.name = odoc_name; constraint_ = Some with_doc } in
let rec loop acc = function
| [] -> List.rev (odoc_dep :: acc)
Expand Down
201 changes: 102 additions & 99 deletions src/dune_rules/package.ml
Original file line number Diff line number Diff line change
Expand Up @@ -58,101 +58,64 @@ module Id = struct
module Map = C.Map
end

module Dependency = struct
let nopos pelem = { OpamParserTypes.FullPos.pelem; pos = Opam_file.nopos }

module Constraint = struct
include Dune_lang.Package_constraint

module Op = struct
include Op

let to_relop = function
| Eq -> nopos `Eq
| Gte -> nopos `Geq
| Lte -> nopos `Leq
| Gt -> nopos `Gt
| Lt -> nopos `Lt
| Neq -> nopos `Neq
;;

let to_relop_pelem op =
let ({ pelem; _ } : OpamParserTypes.FullPos.relop) = to_relop op in
pelem
;;
end

module Variable = struct
include Variable

let to_opam { name } = nopos (OpamParserTypes.FullPos.Ident name)

let to_opam_filter { name } =
OpamTypes.FIdent ([], OpamVariable.of_string name, None)
;;
end

module Value = struct
include Value

let to_opam v =
match v with
| String_literal x -> nopos (OpamParserTypes.FullPos.String x)
| Variable variable -> Variable.to_opam variable
;;

let to_opam_filter = function
| String_literal literal -> OpamTypes.FString literal
| Variable variable -> Variable.to_opam_filter variable
;;
end

let rec to_opam_condition = function
| Bvar variable ->
OpamTypes.Atom (OpamTypes.Filter (Variable.to_opam_filter variable))
| Uop (op, value) ->
OpamTypes.Atom
(OpamTypes.Constraint (Op.to_relop_pelem op, Value.to_opam_filter value))
| Bop (op, lhs, rhs) ->
OpamTypes.Atom
(OpamTypes.Filter
(OpamTypes.FOp
(Value.to_opam_filter lhs, Op.to_relop_pelem op, Value.to_opam_filter rhs)))
| And conjunction -> OpamFormula.ands (List.map conjunction ~f:to_opam_condition)
| Or disjunction -> OpamFormula.ors (List.map disjunction ~f:to_opam_condition)
let nopos pelem = { OpamParserTypes.FullPos.pelem; pos = Opam_file.nopos }

module Constraint = struct
include Dune_lang.Package_constraint

module Op = struct
include Op

let to_relop = function
| Eq -> nopos `Eq
| Gte -> nopos `Geq
| Lte -> nopos `Leq
| Gt -> nopos `Gt
| Lt -> nopos `Lt
| Neq -> nopos `Neq
;;

let to_relop_pelem op =
let ({ pelem; _ } : OpamParserTypes.FullPos.relop) = to_relop op in
pelem
;;
end

type t =
{ name : Name.t
; constraint_ : Constraint.t option
}
module Variable = struct
include Variable

let encode { name; constraint_ } =
let open Dune_sexp.Encoder in
match constraint_ with
| None -> Name.encode name
| Some c -> pair Name.encode Constraint.encode (name, c)
;;
let to_opam { name } = nopos (OpamParserTypes.FullPos.Ident name)
let to_opam_filter { name } = OpamTypes.FIdent ([], OpamVariable.of_string name, None)
end

let decode =
let open Dune_sexp.Decoder in
let constrained =
let+ name = Name.decode
and+ expr = Constraint.decode in
{ name; constraint_ = Some expr }
in
enter constrained
<|> let+ name = Name.decode in
{ name; constraint_ = None }
;;
module Value = struct
include Value

let to_dyn { name; constraint_ } =
let open Dyn in
record
[ "name", Name.to_dyn name
; "constr", Dyn.Option (Option.map ~f:Constraint.to_dyn constraint_)
]
let to_opam v =
match v with
| String_literal x -> nopos (OpamParserTypes.FullPos.String x)
| Variable variable -> Variable.to_opam variable
;;

let to_opam_filter = function
| String_literal literal -> OpamTypes.FString literal
| Variable variable -> Variable.to_opam_filter variable
;;
end

let rec to_opam_condition = function
| Bvar variable ->
OpamTypes.Atom (OpamTypes.Filter (Variable.to_opam_filter variable))
| Uop (op, value) ->
OpamTypes.Atom
(OpamTypes.Constraint (Op.to_relop_pelem op, Value.to_opam_filter value))
| Bop (op, lhs, rhs) ->
OpamTypes.Atom
(OpamTypes.Filter
(OpamTypes.FOp
(Value.to_opam_filter lhs, Op.to_relop_pelem op, Value.to_opam_filter rhs)))
| And conjunction -> OpamFormula.ands (List.map conjunction ~f:to_opam_condition)
| Or disjunction -> OpamFormula.ors (List.map disjunction ~f:to_opam_condition)
;;

type context =
Expand All @@ -178,15 +141,9 @@ module Dependency = struct
let opam_constraint t : OpamParserTypes.FullPos.value =
let open OpamParserTypes.FullPos in
let rec opam_constraint context = function
| Constraint.Bvar v -> Constraint.Variable.to_opam v
| Uop (op, x) ->
nopos (Prefix_relop (Constraint.Op.to_relop op, Constraint.Value.to_opam x))
| Bop (op, x, y) ->
nopos
(Relop
( Constraint.Op.to_relop op
, Constraint.Value.to_opam x
, Constraint.Value.to_opam y ))
| Bvar v -> Variable.to_opam v
| Uop (op, x) -> nopos (Prefix_relop (Op.to_relop op, Value.to_opam x))
| Bop (op, x, y) -> nopos (Relop (Op.to_relop op, Value.to_opam x, Value.to_opam y))
| And cs -> logical_op `And cs ~inner_ctx:Ctx_and ~group_needed:false
| Or cs ->
let group_needed =
Expand All @@ -201,9 +158,43 @@ module Dependency = struct
in
opam_constraint Root t
;;
end

module Dependency = struct
type t =
{ name : Name.t
; constraint_ : Constraint.t option
}

let encode { name; constraint_ } =
let open Dune_sexp.Encoder in
match constraint_ with
| None -> Name.encode name
| Some c -> pair Name.encode Constraint.encode (name, c)
;;

let decode =
let open Dune_sexp.Decoder in
let constrained =
let+ name = Name.decode
and+ expr = Constraint.decode in
{ name; constraint_ = Some expr }
in
enter constrained
<|> let+ name = Name.decode in
{ name; constraint_ = None }
;;

let to_dyn { name; constraint_ } =
let open Dyn in
record
[ "name", Name.to_dyn name
; "constr", Dyn.Option (Option.map ~f:Constraint.to_dyn constraint_)
]
;;

let opam_depend { name; constraint_ } =
let constraint_ = Option.map ~f:opam_constraint constraint_ in
let constraint_ = Option.map ~f:Constraint.opam_constraint constraint_ in
let pkg = nopos (OpamParserTypes.FullPos.String (Name.to_string name)) in
match constraint_ with
| None -> pkg
Expand Down Expand Up @@ -509,6 +500,7 @@ type t =
; depends : Dependency.t list
; conflicts : Dependency.t list
; depopts : Dependency.t list
; available : Constraint.t option
; info : Info.t
; version : string option
; has_opam_file : opam_file
Expand Down Expand Up @@ -539,6 +531,7 @@ let encode
; depends
; conflicts
; depopts
; available
; info
; version
; tags
Expand All @@ -558,6 +551,7 @@ let encode
; field_l "depends" Dependency.encode depends
; field_l "conflicts" Dependency.encode conflicts
; field_l "depopts" Dependency.encode depopts
; field_o "available" Constraint.encode available
; field_o "version" string version
; field "tags" (list string) ~default:[] tags
; field_l
Expand Down Expand Up @@ -595,6 +589,10 @@ let decode ~dir =
and+ depends = field ~default:[] "depends" (repeat Dependency.decode)
and+ conflicts = field ~default:[] "conflicts" (repeat Dependency.decode)
and+ depopts = field ~default:[] "depopts" (repeat Dependency.decode)
and+ available =
field_o
"available"
(Dune_lang.Syntax.since Stanza.syntax (3, 11) >>> Constraint.decode)
and+ info = Info.decode ~since:(2, 0) ()
and+ tags = field "tags" (enter (repeat string)) ~default:[]
and+ deprecated_package_names =
Expand Down Expand Up @@ -628,6 +626,7 @@ let decode ~dir =
; depends
; conflicts
; depopts
; available
; info
; version
; has_opam_file = Exists false
Expand All @@ -654,6 +653,7 @@ let to_dyn
; depends
; conflicts
; depopts
; available
; info
; has_opam_file
; tags
Expand All @@ -672,6 +672,7 @@ let to_dyn
; "depends", list Dependency.to_dyn depends
; "conflicts", list Dependency.to_dyn conflicts
; "depopts", list Dependency.to_dyn depopts
; "available", option Constraint.to_dyn available
; "info", Info.to_dyn info
; "has_opam_file", dyn_of_opam_file has_opam_file
; "tags", list string tags
Expand Down Expand Up @@ -703,6 +704,7 @@ let default name dir =
; conflicts = []
; info = Info.empty
; depopts = []
; available = None
; has_opam_file = Exists false
; tags = [ "topics"; "to describe"; "your"; "project" ]
; deprecated_package_names = Name.Map.empty
Expand Down Expand Up @@ -767,6 +769,7 @@ let load_opam_file file name =
; conflicts = []
; depends = []
; depopts = []
; available = None
; info =
{ maintainers = get_many "maintainer"
; authors = get_many "authors"
Expand Down
26 changes: 14 additions & 12 deletions src/dune_rules/package.mli
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,24 @@ module Id : sig
include Comparable_intf.S with type key := t
end

module Dependency : sig
module Constraint : sig
module Op : sig
type t = Dune_lang.Package_constraint.Op.t
module Constraint : sig
module Op : sig
type t = Dune_lang.Package_constraint.Op.t

val to_relop : t -> OpamParserTypes.FullPos.relop
end
val to_relop : t -> OpamParserTypes.FullPos.relop
end

module Value : sig
type t = Dune_lang.Package_constraint.Value.t
end
module Value : sig
type t = Dune_lang.Package_constraint.Value.t
end

type t = Dune_lang.Package_constraint.t
type t = Dune_lang.Package_constraint.t

val to_dyn : t -> Dyn.t
end
val to_dyn : t -> Dyn.t
val opam_constraint : t -> OpamParserTypes.FullPos.value
end

module Dependency : sig
type t =
{ name : Name.t
; constraint_ : Constraint.t option
Expand Down Expand Up @@ -120,6 +121,7 @@ type t =
; depends : Dependency.t list
; conflicts : Dependency.t list
; depopts : Dependency.t list
; available : Constraint.t option
; info : Info.t
; version : string option
; has_opam_file : opam_file
Expand Down
Loading