let obj_file_of_baseuri writable baseuri =
try
LibraryMisc.obj_file_of_baseuri
- ~must_exist:true ~baseuri ~writable
+ ~must_exist:true ~baseuri ~writable
with
| Http_getter_types.Unresolvable_URI _
| Http_getter_types.Key_not_found _ ->
LibraryMisc.obj_file_of_baseuri
- ~must_exist:false ~baseuri ~writable:true
+ ~must_exist:false ~baseuri ~writable:true
;;
let main () =
let resolve alias current_buri =
let buri = buri alias in
if buri <> current_buri then Some buri else None in
- MatitaInit.fill_registry ();
let dot_file = ref "" in
MatitaInit.add_cmdline_spec
["-dot", Arg.Set_string dot_file,
"<file> Save dependency graph in dot format to the given file"];
- MatitaInit.parse_cmdline ();
- MatitaInit.load_configuration_file ();
+ MatitaInit.parse_cmdline_and_configuration_file ();
+ MatitaInit.initialize_environment ();
let include_paths =
Helm_registry.get_list Helm_registry.string "matita.includes" in
let args = Helm_registry.get_list Helm_registry.string "matita.args" in
exit 1
end;
let ma_files = args in
+ let bof = Hashtbl.create 10 in
+ let baseuri_of_script s =
+ try Hashtbl.find bof s
+ with Not_found ->
+ let b,_ = DependenciesParser.baseuri_of_script ~include_paths s in
+ Hashtbl.add bof s b; b
+ in
List.iter
(fun ma_file ->
let ic = open_in ma_file in
Hashtbl.add baseuri_of_inv uri ma_file
| DependenciesParser.IncludeDep path ->
try
- let baseuri,_ =
- DependenciesParser.baseuri_of_script ~include_paths path in
+ let baseuri = baseuri_of_script path in
if not (Http_getter_storage.is_legacy baseuri) then
(let moo_file = obj_file_of_baseuri false baseuri in
Hashtbl.add include_deps ma_file moo_file;
prerr_endline ("File "^ file^" has no baseuri. Use set baseuri");
exit 1)
uri_deps;
+ let gcp x y =
+ (* explode and implode from the OCaml Expert FAQ. *)
+ let explode s =
+ let rec exp i l =
+ if i < 0 then l else exp (i - 1) (s.[i] :: l) in
+ exp (String.length s - 1) []
+ in
+ let implode l =
+ let res = String.create (List.length l) in
+ let rec imp i = function
+ | [] -> res
+ | c :: l -> res.[i] <- c; imp (i + 1) l in
+ imp 0 l
+ in
+ let rec aux = function
+ | x::tl1,y::tl2 when x = y -> x::(aux (tl1,tl2))
+ | _ -> []
+ in
+ implode (aux (explode x,explode y))
+ in
+ let max_path = List.hd ma_files in
+ let max_path = List.fold_left gcp max_path ma_files in
+ let short x = Pcre.replace ~pat:("^"^max_path) x in
if !dot_file <> "" then (* generate dependency graph if required *)
begin
let oc = open_out !dot_file in
in
let deps = List.fast_sort Pervasives.compare deps in
let deps = HExtlib.list_uniq deps in
- GraphvizPp.Dot.node ma_file fmt;
- List.iter (fun dep -> GraphvizPp.Dot.edge ma_file dep fmt) deps)
+ GraphvizPp.Dot.node (short ma_file) fmt;
+ List.iter (fun dep -> GraphvizPp.Dot.edge (short ma_file) (short dep) fmt) deps)
ma_files;
GraphvizPp.Dot.trailer fmt;
close_out oc
let deps = ma_file :: deps in
let baseuri = Hashtbl.find baseuri_of ma_file in
let moo = obj_file_of_baseuri true baseuri in
- Printf.printf "%s: %s\n%s: %s\n%s: %s\n"
+ Printf.printf "%s: %s\n%s: %s\n%s: %s\n%s: %s\n"
moo (String.concat " " deps)
(Filename.basename(Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file)) moo
(Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file) moo
+ (Pcre.replace ~pat:"ma$" ~templ:"mo" (short ma_file)) moo
with Not_found ->
prerr_endline ("File "^ma_file^" has no baseuri. Use set baseuri");
exit 1)