]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/matita/matitaSync.ml
ocaml 3.09 transition
[helm.git] / helm / matita / matitaSync.ml
index d3ae5fdc9deee3a8ccb4f225b99c177e97bc220c..716aa04d29f2c6f34e4280cfca3bdf49c2583333 100644 (file)
@@ -34,32 +34,52 @@ let alias_diff ~from status =
       try
        let description2,_ = Map.find domain_item from.aliases in
         if description1 <> description2 then
-          Map.add domain_item codomain_item acc
+         (domain_item,codomain_item)::acc
         else
           acc
       with
        Not_found ->
-         Map.add domain_item codomain_item acc)
-    status.aliases Map.empty
+         (domain_item,codomain_item)::acc)
+    status.aliases []
 
 let alias_diff =
- let profiler = CicUtil.profile "alias_diff (conteggiato anche in include)" in
- fun ~from status -> profiler.CicUtil.profile (alias_diff ~from) status
+ let profiler = HExtlib.profile "alias_diff (conteggiato anche in include)" in
+ fun ~from status -> profiler.HExtlib.profile (alias_diff ~from) status
 
-let set_proof_aliases status aliases =
- let new_status = { status with aliases = aliases } in
- let diff = alias_diff ~from:status new_status in
+let set_proof_aliases status new_aliases =
+ let commands_of_aliases =
+   List.map
+    (fun alias -> GrafiteAst.Alias (DisambiguateTypes.dummy_floc, alias))
+ in
+ let deps_of_aliases =
+   HExtlib.filter_map
+    (function
+    | GrafiteAst.Ident_alias (_, suri) ->
+        let buri = UriManager.buri_of_uri (UriManager.uri_of_string suri) in
+        Some (GrafiteAst.Dependency buri)
+    | _ -> None)
+ in
+ let aliases =
+  List.fold_left (fun acc (d,c) -> DisambiguateTypes.Environment.add d c acc)
+   status.aliases new_aliases in
  let multi_aliases =
-  DisambiguateTypes.Environment.fold DisambiguateTypes.Environment.cons
-   diff status.multi_aliases in
- let new_status = { new_status with multi_aliases = multi_aliases } in
- if DisambiguateTypes.Environment.is_empty diff then
+  List.fold_left (fun acc (d,c) -> DisambiguateTypes.Environment.cons d c acc)
+   status.multi_aliases new_aliases in
+ let new_status =
+   { status with multi_aliases = multi_aliases ; aliases = aliases}
+ in
+ if new_aliases = [] then
    new_status
  else
-   add_moo_content (DisambiguatePp.commands_of_environment diff) new_status
-  
+   let aliases = 
+     DisambiguatePp.aliases_of_domain_and_codomain_items_list new_aliases
+   in
+   let status = add_moo_content (commands_of_aliases aliases) new_status in
+   let status = add_moo_metadata (deps_of_aliases aliases) status in
+   status
+
 (** given a uri and a type list (the contructors types) builds a list of pairs
- *  (name,uri) that is used to generate authomatic aliases **)
+ *  (name,uri) that is used to generate automatic aliases **)
 let extract_alias types uri = 
   fst(List.fold_left (
     fun (acc,i) (name, _, _, cl) -> 
@@ -72,19 +92,21 @@ let extract_alias types uri =
         ) (acc,1) cl)),i+1
   ) ([],0) types)
 
-let env_of_list l env =
- let l' = List.map (fun (name,suri) -> name,suri,CicUtil.term_of_uri (UriManager.uri_of_string suri)) l in
-  DisambiguateTypes.env_of_list l' env
+let build_aliases =
+ List.map
+  (fun (name,suri) ->
+    DisambiguateTypes.Id name,
+     (suri, fun _ _ _ -> CicUtil.term_of_uri (UriManager.uri_of_string suri)))
 
 let add_aliases_for_inductive_def status types suri = 
   let uri = UriManager.uri_of_string suri in
-  let aliases = env_of_list (extract_alias types uri) status.aliases in
-  set_proof_aliases status aliases
+  let aliases = build_aliases (extract_alias types uri) in
+   set_proof_aliases status aliases
 
 let add_alias_for_constant status suri =
  let uri = UriManager.uri_of_string suri in
  let name = UriManager.name_of_uri uri in
- let new_env = env_of_list [(name,suri)] status.aliases in
+ let new_env = build_aliases [(name,suri)] in
  set_proof_aliases status new_env
 
 let add_aliases_for_object status suri =
@@ -99,6 +121,7 @@ let paths_and_uris_of_obj uri status =
   let basedir = get_string_option status "basedir" ^ "/xml" in
   let innertypesuri = UriManager.innertypesuri_of_uri uri in
   let bodyuri = UriManager.bodyuri_of_uri uri in
+  let univgraphuri = UriManager.univgraphuri_of_uri uri in
   let innertypesfilename = Str.replace_first (Str.regexp "^cic:") ""
         (UriManager.string_of_uri innertypesuri) ^ ".xml.gz" in
   let innertypespath = basedir ^ "/" ^ innertypesfilename in
@@ -108,39 +131,37 @@ let paths_and_uris_of_obj uri status =
   let xmlbodyfilename = Str.replace_first (Str.regexp "^cic:/") ""
         (UriManager.string_of_uri uri) ^ ".body.xml.gz" in
   let xmlbodypath = basedir ^ "/" ^  xmlbodyfilename in
-  xmlpath, xmlbodypath, innertypespath, bodyuri, innertypesuri
+  let xmlunivgraphfilename = Str.replace_first (Str.regexp "^cic:/") ""
+        (UriManager.string_of_uri univgraphuri) ^ ".xml.gz" in
+  let xmlunivgraphpath = basedir ^ "/" ^ xmlunivgraphfilename in
+  xmlpath, xmlbodypath, innertypespath, bodyuri, innertypesuri, 
+  xmlunivgraphpath, univgraphuri
 
-let save_object_to_disk status uri obj =
+let save_object_to_disk status uri obj ugraph univlist =
   let ensure_path_exists path =
     let dir = Filename.dirname path in
-    MatitaMisc.mkdir dir
+    HExtlib.mkdir dir
   in
   (* generate annobj, ids_to_inner_sorts and ids_to_inner_types *)
-  let annobj,_,_,ids_to_inner_sorts,ids_to_inner_types,_,_ =
-    Cic2acic.acic_object_of_cic_object ~eta_fix:false obj
-  in 
+  let annobj = Cic2acic.plain_acic_object_of_cic_object obj in 
   (* prepare XML *)
   let xml, bodyxml =
-   Cic2Xml.print_object uri ~ids_to_inner_sorts ~ask_dtd_to_the_getter:false
-    annobj 
-  in
-  let xmlinnertypes =
-   Cic2Xml.print_inner_types uri ~ids_to_inner_sorts ~ids_to_inner_types
-    ~ask_dtd_to_the_getter:false
+   Cic2Xml.print_object
+    uri ?ids_to_inner_sorts:None ~ask_dtd_to_the_getter:false annobj 
   in
-  let xmlpath, xmlbodypath, innertypespath, bodyuri, innertypesuri = 
+  let xmlpath, xmlbodypath, innertypespath, bodyuri, innertypesuri, 
+      xmlunivgraphpath, univgraphuri = 
     paths_and_uris_of_obj uri status 
   in
   let path_scheme_of path = "file://" ^ path in
-  List.iter MatitaMisc.mkdir
-    (List.map Filename.dirname [innertypespath; xmlpath]);
+  List.iter HExtlib.mkdir (List.map Filename.dirname [xmlpath]);
   (* now write to disk *)
-  ensure_path_exists innertypespath;
-  Xml.pp ~gzip:true xmlinnertypes (Some innertypespath);
   ensure_path_exists xmlpath;
-  Xml.pp ~gzip:true xml (Some xmlpath) ;
+  Xml.pp ~gzip:true xml (Some xmlpath);
+  CicUniv.write_xml_of_ugraph xmlunivgraphpath ugraph univlist;
   (* we return a list of uri,path we registered/created *)
-  (uri,xmlpath) :: (innertypesuri,innertypespath) ::
+  (uri,xmlpath) ::
+  (univgraphuri,xmlunivgraphpath) ::
     (* now the optional body, both write and register *)
     (match bodyxml,bodyuri with
        None,None -> []
@@ -151,8 +172,13 @@ let save_object_to_disk status uri obj =
      | _-> assert false) 
 
 let typecheck_obj =
- let profiler = CicUtil.profile "add_obj.typecheck_obj" in
-  fun uri obj -> profiler.CicUtil.profile (CicTypeChecker.typecheck_obj uri) obj
+ let profiler = HExtlib.profile "add_obj.typecheck_obj" in
+  fun uri obj -> profiler.HExtlib.profile (CicTypeChecker.typecheck_obj uri) obj
+
+let index_obj =
+ let profiler = HExtlib.profile "add_obj.index_obj" in
+  fun ~dbd ~uri ->
+   profiler.HExtlib.profile (fun uri -> MetadataDb.index_obj ~dbd ~uri) uri
 
 let add_obj uri obj status =
   let dbd = MatitaDb.instance () in
@@ -161,10 +187,12 @@ let add_obj uri obj status =
     command_error (sprintf "%s already defined" suri)
   else begin
     typecheck_obj uri obj; (* 1 *)
+    let _, ugraph, univlist = 
+      CicEnvironment.get_cooked_obj_with_univlist CicUniv.empty_ugraph uri in
     try 
-      MetadataDb.index_obj ~dbd ~uri; (* 2 must be in the env *)
+      index_obj ~dbd ~uri; (* 2 must be in the env *)
       try
-        let new_stuff = save_object_to_disk status uri obj in (* 3 *)
+        let new_stuff=save_object_to_disk status uri obj ugraph univlist in(*3*)
         try 
           MatitaLog.message (sprintf "%s defined" suri);
           let status = add_aliases_for_object status suri obj in
@@ -178,12 +206,12 @@ let add_obj uri obj status =
         raise exc
     with exc ->
       CicEnvironment.remove_obj uri; (* -1 *)
-      raise exc
+    raise exc
   end
 
 let add_obj =
- let profiler = CicUtil.profile "add_obj" in
-  fun uri obj status -> profiler.CicUtil.profile (add_obj uri obj) status
+ let profiler = HExtlib.profile "add_obj" in
+  fun uri obj status -> profiler.HExtlib.profile (add_obj uri obj) status
    
 module OrderedUri =
 struct
@@ -201,13 +229,20 @@ module UriSet = Set.Make (OrderedUri)
 module IdSet  = Set.Make (OrderedId)
 
   (** @return l2 \ l1 *)
-let uri_list_diff l2 l1 =
+let urixstring_list_diff l2 l1 =
   let module S = UriSet in
   let s1 = List.fold_left (fun set uri -> S.add uri set) S.empty l1 in
   let s2 = List.fold_left (fun set uri -> S.add uri set) S.empty l2 in
   let diff = S.diff s2 s1 in
   S.fold (fun uri uris -> uri :: uris) diff []
 
+let uri_list_diff l2 l1 =
+  let module S = UriManager.UriSet in
+  let s1 = List.fold_left (fun set uri -> S.add uri set) S.empty l1 in
+  let s2 = List.fold_left (fun set uri -> S.add uri set) S.empty l2 in
+  let diff = S.diff s2 s1 in
+  S.fold (fun uri uris -> uri :: uris) diff []
+
   (** @return l2 \ l1 *)
 let id_list_diff l2 l1 =
   let module S = IdSet in
@@ -220,15 +255,16 @@ let remove_coercion uri =
   CoercDb.remove_coercion (fun (_,_,u) -> UriManager.eq u uri)
   
 let time_travel ~present ~past =
-  let objs_to_remove = uri_list_diff present.objects past.objects in
+  let objs_to_remove = urixstring_list_diff present.objects past.objects in
+  let coercions_to_remove = uri_list_diff present.coercions past.coercions in
   let notation_to_remove =
     id_list_diff present.notation_ids past.notation_ids
   in
   let debug_list = ref [] in
+  List.iter remove_coercion coercions_to_remove;
   List.iter
     (fun (uri,p) -> 
       MatitaMisc.safe_remove p;
-      remove_coercion uri;
       (try 
         CicEnvironment.remove_obj uri
       with CicEnvironment.Object_not_found _ -> 
@@ -267,12 +303,15 @@ let time_travel ~present ~past =
       List.iter MatitaLog.debug l2
       *)
     
-let remove ~verbose uri =
+let last_baseuri = ref ""
+
+let remove ?(verbose=false) uri =
   let derived_uris_of_uri uri =
     UriManager.innertypesuri_of_uri uri ::
+    UriManager.univgraphuri_of_uri uri ::
     (match UriManager.bodyuri_of_uri uri with
     | None -> []
-    | Some u -> [u])
+    | Some u -> [u]) 
   in
   let to_remove =
     uri :: 
@@ -282,9 +321,17 @@ let remove ~verbose uri =
   List.iter 
     (fun uri -> 
       (try
+        (* WARNING: non reentrant debugging code *)
         if verbose then
-         MatitaLog.debug ("Removing: " ^ UriManager.string_of_uri uri);
-        MatitaMisc.safe_remove (Http_getter.resolve' uri)
+         let baseuri = UriManager.buri_of_uri uri in
+          if !last_baseuri <> baseuri then
+           begin
+            MatitaLog.debug ("Removing: " ^ baseuri ^ "/*");
+            last_baseuri := baseuri
+           end;
+           let file = Http_getter.resolve' uri in
+           MatitaMisc.safe_remove file;
+           MatitaMisc.rmdir_descend (Filename.dirname file)
       with Http_getter_types.Key_not_found _ -> ());
       remove_coercion uri; 
       ignore (MatitaDb.remove_uri uri);