Skip to content

Commit 2c6cc0d

Browse files
committed
Driver: Reenable sidebar and search
1 parent 958bfe5 commit 2c6cc0d

File tree

6 files changed

+107
-106
lines changed

6 files changed

+107
-106
lines changed

src/driver/compile.ml

Lines changed: 40 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ let find_partials odoc_dir : Odoc_unit.intf Odoc_unit.unit Util.StringMap.t * _
8585
| Ok h -> (h, tbl)
8686
| Error _ -> (* odoc_dir doesn't exist...? *) (Util.StringMap.empty, tbl)
8787

88-
let compile ?partial ~output_dir ?linked_dir:_ (all : Odoc_unit.t list) =
88+
let compile ?partial ~partial_dir ?linked_dir:_ (all : Odoc_unit.t list) =
8989
(* let linked_dir = Option.value linked_dir ~default:output_dir in *)
9090
let intf_units, impl_units, mld_units =
9191
List.fold_left
@@ -102,7 +102,7 @@ let compile ?partial ~output_dir ?linked_dir:_ (all : Odoc_unit.t list) =
102102
let hashes = mk_byhash intf_units in
103103
let other_hashes, tbl =
104104
match partial with
105-
| Some _ -> find_partials output_dir
105+
| Some _ -> find_partials partial_dir
106106
| None -> (Util.StringMap.empty, Hashtbl.create 10)
107107
in
108108
let all_hashes =
@@ -127,29 +127,6 @@ let compile ?partial ~output_dir ?linked_dir:_ (all : Odoc_unit.t list) =
127127
None)
128128
deps
129129
in
130-
131-
(* let includes = Fpath.Set.add output_dir includes in ?????????? *)
132-
133-
(* TOOOODOOOOO *)
134-
(* let impl = *)
135-
(* match modty.m_impl with *)
136-
(* | Some impl -> ( *)
137-
(* match impl.mip_src_info with *)
138-
(* | Some si -> *)
139-
(* let odoc_file = Fpath.(output_dir // impl.mip_odoc_file) in *)
140-
(* let odocl_file = Fpath.(linked_dir // impl.mip_odocl_file) in *)
141-
(* Odoc.compile_impl ~output_dir ~input_file:impl.mip_path *)
142-
(* ~includes ~parent_id:impl.mip_parent_id ~source_id:si.src_id; *)
143-
(* Atomic.incr Stats.stats.compiled_impls; *)
144-
(* Some *)
145-
(* { *)
146-
(* impl_odoc = odoc_file; *)
147-
(* impl_odocl = odocl_file; *)
148-
(* src = si.src_path; *)
149-
(* } *)
150-
(* | None -> None) *)
151-
(* | None -> None *)
152-
(* in *)
153130
let includes = Fpath.Set.of_list unit.include_dirs in
154131
Odoc.compile ~output_dir:unit.output_dir ~input_file:unit.input_file
155132
~includes ~parent_id:unit.parent_id;
@@ -229,61 +206,52 @@ let link : compiled list -> _ =
229206
in
230207
Fiber.List.map link compiled
231208

232-
(* let index_one ~odocl_dir pkg_name pkg = *)
233-
(* let dir = pkg.Packages.pkg_dir in *)
234-
(* let output_file = Fpath.(odocl_dir // dir / Odoc.index_filename) in *)
235-
(* let libs = *)
236-
(* List.map *)
237-
(* (fun lib -> (lib.Packages.lib_name, Fpath.(odocl_dir // lib.odoc_dir))) *)
238-
(* pkg.Packages.libraries *)
239-
(* in *)
240-
(* Odoc.compile_index ~json:false ~output_file ~libs *)
241-
(* ~docs:[ (pkg_name, Fpath.(odocl_dir // pkg.mld_odoc_dir)) ] *)
242-
(* () *)
243-
244-
(* let index ~odocl_dir pkgs = Util.StringMap.iter (index_one ~odocl_dir) pkgs *)
245-
246-
(* let sherlodoc_index_one ~html_dir ~odocl_dir _ pkg_content = *)
247-
(* let inputs = *)
248-
(* [ Fpath.(odocl_dir // pkg_content.Packages.pkg_dir / Odoc.index_filename) ] *)
249-
(* in *)
250-
(* let dst = Fpath.(html_dir // Sherlodoc.db_js_file pkg_content.pkg_dir) in *)
251-
(* let dst_dir, _ = Fpath.split_base dst in *)
252-
(* Util.mkdir_p dst_dir; *)
253-
(* Sherlodoc.index ~format:`js ~inputs ~dst () *)
254-
255-
(* let sherlodoc ~html_dir ~odocl_dir pkgs = *)
256-
(* ignore @@ Bos.OS.Dir.create html_dir; *)
257-
(* Sherlodoc.js Fpath.(html_dir // Sherlodoc.js_file); *)
258-
(* Util.StringMap.iter (sherlodoc_index_one ~html_dir ~odocl_dir) pkgs; *)
259-
(* let format = `marshal in *)
260-
(* let dst = Fpath.(html_dir // Sherlodoc.db_marshal_file) in *)
261-
(* let dst_dir, _ = Fpath.split_base dst in *)
262-
(* Util.mkdir_p dst_dir; *)
263-
(* let inputs = *)
264-
(* pkgs |> Util.StringMap.bindings *)
265-
(* |> List.map (fun (_pkgname, pkg) -> *)
266-
(* Fpath.(odocl_dir // pkg.Packages.pkg_dir / Odoc.index_filename)) *)
267-
(* in *)
268-
(* Sherlodoc.index ~format ~inputs ~dst () *)
209+
let sherlodoc_index_one ~output_dir (index : Odoc_unit.index) =
210+
let inputs = [ index.output_file ] in
211+
let rel_path = Fpath.(index.search_dir / "sherlodoc_db.js") in
212+
let dst = Fpath.(output_dir // rel_path) in
213+
let dst_dir, _ = Fpath.split_base dst in
214+
Util.mkdir_p dst_dir;
215+
Sherlodoc.index ~format:`js ~inputs ~dst ();
216+
rel_path
269217

270-
let html_generate output_dir (* ~odocl_dir *) linked =
218+
let html_generate output_dir linked =
219+
let tbl = Hashtbl.create 10 in
220+
Sherlodoc.js Fpath.(output_dir // Sherlodoc.js_file);
221+
let compile_index : Odoc_unit.index -> _ =
222+
fun index ->
223+
let compile_index_one
224+
({ pkg_args = { pages; libs }; output_file; json; search_dir = _ } as
225+
index :
226+
Odoc_unit.index) =
227+
let () = Odoc.compile_index ~json ~output_file ~libs ~docs:pages () in
228+
sherlodoc_index_one ~output_dir index
229+
in
230+
match Hashtbl.find_opt tbl index.output_file with
231+
| None ->
232+
let p, r = Promise.create () in
233+
Hashtbl.add tbl index.output_file p;
234+
let rel_path = compile_index_one index in
235+
Atomic.incr Stats.stats.generated_indexes;
236+
Promise.resolve r rel_path;
237+
rel_path
238+
| Some p -> Promise.await p
239+
in
271240
let html_generate : linked -> unit =
272241
fun l ->
242+
let output_dir = Fpath.to_string output_dir in
243+
let input_file = l.odocl_file in
273244
match l.kind with
274245
| `Intf { hidden = true; _ } -> ()
275246
| `Impl { src_path; _ } ->
276-
Odoc.html_generate ~search_uris:[] ?index:None
277-
~output_dir:(Fpath.to_string output_dir)
278-
~input_file:l.odocl_file ~source:src_path ();
247+
Odoc.html_generate ~search_uris:[] ~output_dir ~input_file
248+
~source:src_path ();
279249
Atomic.incr Stats.stats.generated_units
280250
| _ ->
281-
(* let pkg_dir = l. in *)
282-
(* let search_uris = [ Sherlodoc.db_js_file pkg_dir; Sherlodoc.js_file ] in *)
283-
(* let index = Some Fpath.(odocl_dir // pkg_dir / Odoc.index_filename) in *)
284-
Odoc.html_generate ~search_uris:[] ?index:None
285-
~output_dir:(Fpath.to_string output_dir)
286-
~input_file:l.odocl_file ?source:None (* l.src *) ();
251+
let db_path = compile_index l.index in
252+
let search_uris = [ db_path; Sherlodoc.js_file ] in
253+
let index = l.index.output_file in
254+
Odoc.html_generate ~search_uris ~index ~output_dir ~input_file ();
287255
Atomic.incr Stats.stats.generated_units
288256
in
289257
Fiber.List.iter html_generate linked

src/driver/compile.mli

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ val init_stats : Packages.set -> unit
44

55
val compile :
66
?partial:Fpath.t ->
7-
output_dir:Fpath.t ->
7+
partial_dir:Fpath.t ->
88
?linked_dir:Fpath.t ->
9-
(* Packages.set *) Odoc_unit.t list (* Util.StringMap.t *) ->
9+
Odoc_unit.t list ->
1010
compiled list
1111
(** Use [partial] to reuse the output of a previous call to [compile]. Useful in
1212
the voodoo context.
@@ -18,8 +18,4 @@ type linked
1818

1919
val link : compiled list -> linked list
2020

21-
(* val index : odocl_dir:Fpath.t -> Packages.set -> unit *)
22-
23-
(* val sherlodoc : html_dir:Fpath.t -> odocl_dir:Fpath.t -> Packages.set -> unit *)
24-
25-
val html_generate : Fpath.t (* -> odocl_dir:Fpath.t *) -> linked list -> unit
21+
val html_generate : Fpath.t -> linked list -> unit

src/driver/odoc_driver.ml

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -470,17 +470,19 @@ let render_stats env nprocs =
470470
++ dline "Linking" non_hidden
471471
++ dline "Linking impls" total_impls
472472
++ dline "Linking mlds" total_mlds
473+
++ dline "Indexes" 10000
473474
++ dline "HTML" (total_impls + non_hidden + total_mlds)
474475
++ line (procs nprocs))
475-
(fun comp compimpl compmld link linkimpl linkmld html procs ->
476-
let rec inner (a, b, c, d, e, f, g, h) =
476+
(fun comp compimpl compmld link linkimpl linkmld indexes html procs ->
477+
let rec inner (a, b, c, d, e, f, i, g, h) =
477478
Eio.Time.sleep clock 0.1;
478479
let a' = Atomic.get Stats.stats.compiled_units in
479480
let b' = Atomic.get Stats.stats.compiled_impls in
480481
let c' = Atomic.get Stats.stats.compiled_mlds in
481482
let d' = Atomic.get Stats.stats.linked_units in
482483
let e' = Atomic.get Stats.stats.linked_impls in
483484
let f' = Atomic.get Stats.stats.linked_mlds in
485+
let i' = Atomic.get Stats.stats.generated_indexes in
484486
let g' = Atomic.get Stats.stats.generated_units in
485487
let h' = Atomic.get Stats.stats.processes in
486488

@@ -490,12 +492,13 @@ let render_stats env nprocs =
490492
link (d' - d);
491493
linkimpl (e' - e);
492494
linkmld (f' - f);
495+
indexes (i' - i);
493496
html (g' - g);
494497
procs (h' - h);
495498
if g' < non_hidden + total_impls + total_mlds then
496-
inner (a', b', c', d', e', f', g', h')
499+
inner (a', b', c', d', e', f', i', g', h')
497500
in
498-
inner (0, 0, 0, 0, 0, 0, 0, 0))
501+
inner (0, 0, 0, 0, 0, 0, 0, 0, 0))
499502

500503
let run libs verbose packages_dir odoc_dir odocl_dir html_dir stats nb_workers
501504
odoc_bin voodoo package_name blessed dune_style =
@@ -540,17 +543,15 @@ let run libs verbose packages_dir odoc_dir odocl_dir html_dir stats nb_workers
540543
(fun () ->
541544
let all =
542545
let all = Util.StringMap.bindings all |> List.map snd in
543-
Odoc_unit.of_packages ~output_dir:odoc_dir ~linked_dir:odocl_dir all
546+
Odoc_unit.of_packages ~output_dir:odoc_dir ~linked_dir:odocl_dir
547+
~index_dir:None all
544548
in
545549
let compiled =
546-
Compile.compile ?partial ~output_dir:odoc_dir ?linked_dir:odocl_dir
550+
Compile.compile ?partial ~partial_dir:odoc_dir ?linked_dir:odocl_dir
547551
all
548552
in
549553
let linked = Compile.link compiled in
550-
(* let odocl_dir = match odocl_dir with Some l -> l | None -> odoc_dir in *)
551-
(* let () = Compile.index ~odocl_dir all in *)
552-
(* let () = Compile.sherlodoc ~html_dir ~odocl_dir all in *)
553-
let () = Compile.html_generate html_dir (* ~odocl_dir *) linked in
554+
let () = Compile.html_generate html_dir linked in
554555
let _ = Odoc.support_files html_dir in
555556
())
556557
(fun () -> render_stats env nb_workers)

src/driver/odoc_unit.ml

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ type pkg_args = {
33
libs : (string * Fpath.t) list;
44
}
55

6+
type index = {
7+
pkg_args : pkg_args;
8+
output_file : Fpath.t;
9+
json : bool;
10+
search_dir : Fpath.t;
11+
}
12+
613
type 'a unit = {
714
parent_id : Odoc.id;
815
odoc_dir : Fpath.t;
@@ -13,6 +20,7 @@ type 'a unit = {
1320
pkg_args : pkg_args;
1421
pkgname : string;
1522
include_dirs : Fpath.t list;
23+
index : index;
1624
kind : 'a;
1725
}
1826

@@ -26,10 +34,12 @@ type mld = [ `Mld ]
2634

2735
type t = [ impl | intf | mld ] unit
2836

29-
let of_packages ~output_dir ~linked_dir (pkgs : Packages.t list) : t list =
37+
let of_packages ~output_dir ~linked_dir ~index_dir (pkgs : Packages.t list) :
38+
t list =
3039
let linked_dir =
3140
match linked_dir with None -> output_dir | Some dir -> dir
3241
in
42+
let index_dir = match index_dir with None -> output_dir | Some dir -> dir in
3343
(* This isn't a hashtable, but a table of hashes! Yay! *)
3444
let hashtable =
3545
let open Packages in
@@ -48,29 +58,38 @@ let of_packages ~output_dir ~linked_dir (pkgs : Packages.t list) : t list =
4858
in
4959
(* This one is a hashtable *)
5060
let cache = Hashtbl.create 10 in
61+
let pkg_args_of pkg : pkg_args =
62+
let pages =
63+
[
64+
(pkg.Packages.name, Fpath.(output_dir // pkg.Packages.pkg_dir / "doc"));
65+
]
66+
in
67+
let libs =
68+
List.map
69+
(fun lib ->
70+
( lib.Packages.lib_name,
71+
Fpath.(output_dir // pkg.Packages.pkg_dir / "lib" / lib.lib_name) ))
72+
pkg.libraries
73+
in
74+
{ pages; libs }
75+
in
5176
let pkg_args : pkg_args =
5277
let pages, libs =
5378
List.fold_left
54-
(fun (pages, libs) pkg ->
55-
let page =
56-
( pkg.Packages.name,
57-
Fpath.(output_dir // pkg.Packages.pkg_dir / "doc") )
58-
in
59-
let new_libs =
60-
List.map
61-
(fun lib ->
62-
( lib.Packages.lib_name,
63-
Fpath.(
64-
output_dir // pkg.Packages.pkg_dir / "lib" / lib.lib_name)
65-
))
66-
pkg.libraries
67-
in
68-
(page :: pages, new_libs :: libs))
79+
(fun (all_pages, all_libs) pkg ->
80+
let { pages; libs } = pkg_args_of pkg in
81+
(pages :: all_pages, libs :: all_libs))
6982
([], []) pkgs
7083
in
84+
let pages = List.concat pages in
7185
let libs = List.concat libs in
7286
{ pages; libs }
7387
in
88+
let index_of pkg =
89+
let pkg_args = pkg_args_of pkg in
90+
let output_file = Fpath.(index_dir / pkg.name / Odoc.index_filename) in
91+
{ pkg_args; output_file; json = false; search_dir = pkg.pkg_dir }
92+
in
7493
let rec of_intf hidden pkg libname (intf : Packages.intf) : intf unit =
7594
match Hashtbl.find_opt cache intf.mif_hash with
7695
| Some unit -> unit
@@ -107,6 +126,7 @@ let of_packages ~output_dir ~linked_dir (pkgs : Packages.t list) : t list =
107126
odocl_file;
108127
include_dirs;
109128
kind;
129+
index = index_of pkg;
110130
}
111131
in
112132
let of_impl pkg libname (impl : Packages.impl) : impl unit option =
@@ -152,6 +172,7 @@ let of_packages ~output_dir ~linked_dir (pkgs : Packages.t list) : t list =
152172
pkg_args;
153173
include_dirs;
154174
kind;
175+
index = index_of pkg;
155176
}
156177
in
157178

@@ -198,6 +219,7 @@ let of_packages ~output_dir ~linked_dir (pkgs : Packages.t list) : t list =
198219
kind;
199220
pkg_args;
200221
include_dirs;
222+
index = index_of pkg;
201223
};
202224
]
203225
in

src/driver/odoc_unit.mli

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ type pkg_args = {
33
libs : (string * Fpath.t) list;
44
}
55

6+
type index = {
7+
pkg_args : pkg_args;
8+
output_file : Fpath.t;
9+
json : bool;
10+
search_dir : Fpath.t;
11+
}
12+
613
type 'a unit = {
714
parent_id : Odoc.id;
815
odoc_dir : Fpath.t;
@@ -13,6 +20,7 @@ type 'a unit = {
1320
pkg_args : pkg_args;
1421
pkgname : string;
1522
include_dirs : Fpath.t list;
23+
index : index;
1624
kind : 'a;
1725
}
1826

@@ -27,4 +35,8 @@ type mld = [ `Mld ]
2735
type t = [ impl | intf | mld ] unit
2836

2937
val of_packages :
30-
output_dir:Fpath.t -> linked_dir:Fpath.t option -> Packages.t list -> t list
38+
output_dir:Fpath.t ->
39+
linked_dir:Fpath.t option ->
40+
index_dir:Fpath.t option ->
41+
Packages.t list ->
42+
t list

src/driver/stats.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type stats = {
1313
mutable linked_units : int Atomic.t;
1414
mutable linked_impls : int Atomic.t;
1515
mutable linked_mlds : int Atomic.t;
16+
mutable generated_indexes : int Atomic.t;
1617
mutable generated_units : int Atomic.t;
1718
mutable processes : int Atomic.t;
1819
}
@@ -30,6 +31,7 @@ let stats =
3031
linked_impls = Atomic.make 0;
3132
linked_mlds = Atomic.make 0;
3233
generated_units = Atomic.make 0;
34+
generated_indexes = Atomic.make 0;
3335
processes = Atomic.make 0;
3436
}
3537

0 commit comments

Comments
 (0)