11open Import
22module Name = Package_name
3-
4- module Id = struct
5- module T = struct
6- type t =
7- { name : Name .t
8- ; dir : Path.Source .t
9- }
10-
11- let compare { name; dir } pkg =
12- match Name. compare name pkg.name with
13- | Eq -> Path.Source. compare dir pkg.dir
14- | e -> e
15- ;;
16-
17- let to_dyn { dir; name } =
18- Dyn. record [ " name" , Name. to_dyn name; " dir" , Path.Source. to_dyn dir ]
19- ;;
20- end
21-
22- include T
23-
24- let hash { name; dir } = Tuple.T2. hash Name. hash Path.Source. hash (name, dir)
25- let name t = t.name
26-
27- module C = Comparable. Make (T )
28- module Set = C. Set
29- module Map = C. Map
30- end
3+ module Id = Package_id
314
325type opam_file =
336 | Exists of bool
@@ -57,6 +30,7 @@ type t =
5730 ; sites : Section .t Site.Map .t
5831 ; allow_empty : bool
5932 ; original_opam_file : original_opam_file option
33+ ; exclusive_dir : (Loc .t * Path.Source .t ) option
6034 }
6135
6236(* Package name are globally unique, so we can reasonably expect that there will
@@ -80,6 +54,7 @@ let id t = t.id
8054let original_opam_file t = t.original_opam_file
8155let set_inside_opam_dir t ~dir = { t with opam_file = Name. file t.id.name ~dir }
8256let set_version_and_info t ~version ~info = { t with version; info }
57+ let exclusive_dir t = t.exclusive_dir
8358
8459let encode
8560 (name : Name.t )
@@ -99,6 +74,7 @@ let encode
9974 ; allow_empty
10075 ; opam_file = _
10176 ; original_opam_file = _
77+ ; exclusive_dir
10278 }
10379 =
10480 let open Encoder in
@@ -119,6 +95,10 @@ let encode
11995 (Name.Map. keys deprecated_package_names)
12096 ; field_l " sites" (pair Site. encode Section. encode) (Site.Map. to_list sites)
12197 ; field_b " allow_empty" allow_empty
98+ ; field_o
99+ " dir"
100+ (fun (_ , dir ) -> Path.Source. basename dir |> Dune_sexp. atom_or_quoted_string)
101+ exclusive_dir
122102 ]
123103 in
124104 list sexp (string " package" :: fields)
@@ -155,6 +135,11 @@ let decode =
155135 and + depopts = field ~default: [] " depopts" (repeat Package_dependency. decode)
156136 and + info = Package_info. decode ~since: (2 , 0 ) ()
157137 and + tags = field " tags" (enter (repeat string )) ~default: []
138+ and + exclusive_dir =
139+ field_o
140+ " dir"
141+ (let + loc, s = Syntax. since Stanza. syntax (3 , 21 ) >>> located string in
142+ loc, Path.Source. relative ~error_loc: loc dir s)
158143 and + deprecated_package_names =
159144 name_map
160145 (Syntax. since Stanza. syntax (2 , 0 ))
@@ -176,7 +161,7 @@ let decode =
176161 and + allow_empty = field_b " allow_empty" ~check: (Syntax. since Stanza. syntax (3 , 0 ))
177162 and + lang_version = Syntax. get_exn Stanza. syntax in
178163 let allow_empty = lang_version < (3 , 0 ) || allow_empty in
179- let id = { Id. name; dir } in
164+ let id = Id. create ~ name ~ dir in
180165 let opam_file = Name. file id.name ~dir: id.dir in
181166 { id
182167 ; loc
@@ -194,6 +179,7 @@ let decode =
194179 ; allow_empty
195180 ; opam_file
196181 ; original_opam_file = None
182+ ; exclusive_dir
197183 }
198184;;
199185
@@ -221,6 +207,7 @@ let to_dyn
221207 ; allow_empty
222208 ; opam_file = _
223209 ; original_opam_file = _
210+ ; exclusive_dir = _
224211 }
225212 =
226213 let open Dyn in
@@ -264,8 +251,9 @@ let create
264251 ~tags
265252 ~original_opam_file
266253 ~deprecated_package_names
254+ ~contents_basename
267255 =
268- let id = { Id. name; dir } in
256+ let id = Id. create ~ name ~ dir in
269257 { id
270258 ; loc
271259 ; version
@@ -282,5 +270,7 @@ let create
282270 ; allow_empty
283271 ; opam_file = Name. file name ~dir
284272 ; original_opam_file
273+ ; exclusive_dir =
274+ Option. map contents_basename ~f: (fun (loc , s ) -> loc, Path.Source. relative dir s)
285275 }
286276;;
0 commit comments