-let rec refresh_uri_in_term =
- function
- NCic.Const (NReference.Ref (u,spec)) ->
- NCic.Const (NReference.reference_of_spec (refresh_uri u) spec)
- | t -> NCicUtils.map (fun _ _ -> ()) () (fun _ -> refresh_uri_in_term) t
+let load_db,set_global_aliases,get_global_aliases,add_deps,get_deps,remove_deps=
+ let global_aliases = ref [] in
+ let rev_includes_map = ref NUri.UriMap.empty in
+ let store_db () =
+ let ch = open_out (db_path ()) in
+ Marshal.to_channel ch (magic,(!global_aliases,!rev_includes_map)) [];
+ close_out ch in
+ let load_db () =
+ HExtlib.mkdir (Helm_registry.get "matita.basedir");
+ try
+ let ga,im = require_path (db_path ()) in
+ let ga =
+ List.map
+ (fun (uri,name,NReference.Ref (uri2,spec)) ->
+ refresh_uri uri,name,NReference.reference_of_spec (refresh_uri uri2) spec
+ ) ga in
+ let im =
+ NUri.UriMap.fold
+ (fun u l im -> NUri.UriMap.add (refresh_uri u) (List.map refresh_uri l) im
+ ) im NUri.UriMap.empty
+ in
+ global_aliases := ga;
+ rev_includes_map := im
+ with
+ Sys_error _ -> () in
+ let get_deps u =
+ let get_deps_one_step u =
+ try NUri.UriMap.find u !rev_includes_map with Not_found -> [] in
+ let rec aux res =
+ function
+ [] -> res
+ | he::tl ->
+ if List.mem he res then
+ aux res tl
+ else
+ aux (he::res) (get_deps_one_step he @ tl)
+ in
+ aux [] [u] in
+ let remove_deps u =
+ rev_includes_map := NUri.UriMap.remove u !rev_includes_map;
+ rev_includes_map :=
+ NUri.UriMap.map
+ (fun l -> List.filter (fun uri -> not (NUri.eq u uri)) l) !rev_includes_map;
+ store_db ()
+ in
+ load_db,
+ (fun ga -> global_aliases := ga; store_db ()),
+ (fun () -> !global_aliases),
+ (fun u l ->
+ rev_includes_map := NUri.UriMap.add u (l @ get_deps u) !rev_includes_map;
+ store_db ()),
+ get_deps,
+ remove_deps