]> matita.cs.unibo.it Git - helm.git/commitdiff
completed support for "-nodb", now also matitaclean and its library work with that...
authorStefano Zacchiroli <zack@upsilon.cc>
Wed, 5 Oct 2005 16:12:07 +0000 (16:12 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Wed, 5 Oct 2005 16:12:07 +0000 (16:12 +0000)
12 files changed:
helm/matita/dump_moo.ml
helm/matita/matita.ml
helm/matita/matitaEngine.ml
helm/matita/matitaMoo.ml
helm/matita/matitaMoo.mli
helm/matita/matitaSync.ml
helm/matita/matitaTypes.ml
helm/matita/matitaTypes.mli
helm/matita/matitacLib.ml
helm/matita/matitaclean.ml
helm/matita/matitacleanLib.ml
helm/matita/matitacleanLib.mli

index 43d11f9bc63ff9f8c147c59d02f147c3bfba13e7..14dea3472a96ded9519d09d9fc6e65681e0a628b 100644 (file)
@@ -45,11 +45,15 @@ let _ =
         MatitaLog.error (sprintf "Can't find moo '%s', skipping it." fname)
       else begin
         printf "%s:\n" fname; flush stdout;
-        let commands = MatitaMoo.load_moo ~fname in
+        let commands, metadata = MatitaMoo.load_moo ~fname in
         List.iter
           (fun cmd ->
             printf "  %s\n" (GrafiteAstPp.pp_command cmd); flush stdout)
-          commands
+          commands;
+        List.iter
+          (fun m ->
+            printf "  %s\n" (GrafiteAstPp.pp_metadata m); flush stdout)
+          metadata
       end)
     (List.rev !moos)
 
index 1d62cadb5be0c9dadb8a4316a5c1f32d29348987..9b3267fec8eb614fc1f7d29da38839bc125114e1 100644 (file)
@@ -139,8 +139,11 @@ let _ =
       CicNotationParser.print_l2_pattern;
     addDebugItem "dump moo to stderr" (fun _ ->
       let status = (MatitaScript.instance ())#status in
+      let moo, metadata = status.moo_content_rev in
       List.iter (fun cmd -> prerr_endline
-        (GrafiteAstPp.pp_command cmd)) (List.rev status.moo_content_rev));
+        (GrafiteAstPp.pp_command cmd)) (List.rev moo);
+      List.iter (fun m -> prerr_endline
+        (GrafiteAstPp.pp_metadata m)) metadata);
     addDebugItem "rotate light bulbs"
       (fun _ ->
          let nb = gui#main#hintNotebook in
index 4e48df8072d13a027ea5dac975936fa884d91d1f..61d69cbb9ace3b7770692205870fd840749e29b2 100644 (file)
@@ -660,13 +660,15 @@ let disambiguate_obj status obj =
   let status = MatitaSync.set_proof_aliases status diff in
   status, cic
   
-let disambiguate_command status = function
+let disambiguate_command status =
+  function
   | GrafiteAst.Alias _
   | GrafiteAst.Default _
   | GrafiteAst.Drop _
   | GrafiteAst.Dump _
   | GrafiteAst.Include _
   | GrafiteAst.Interpretation _
+  | GrafiteAst.Metadata _
   | GrafiteAst.Notation _
   | GrafiteAst.Qed _
   | GrafiteAst.Render _
@@ -714,26 +716,29 @@ let eval_command opts status cmd =
        raise (IncludedFileNotCompiled moopath);
      !eval_from_moo_ref status moopath (fun _ _ -> ());
      !status
+  | GrafiteAst.Metadata (loc, m) ->
+      (match m with
+      | GrafiteAst.Dependency uri -> MatitaTypes.add_moo_metadata [m] status
+      | GrafiteAst.Baseuri _ -> status)
   | GrafiteAst.Set (loc, name, value) -> 
-      let value = 
-        if name = "baseuri" then
-          let v = MatitaMisc.strip_trailing_slash value in
-          try
-            ignore (String.index v ' ');
-            command_error "baseuri can't contain spaces"
-          with Not_found -> v
-        else
-          value
+      let status = 
+        if name = "baseuri" then begin
+          let value = 
+            let v = MatitaMisc.strip_trailing_slash value in
+            try
+              ignore (String.index v ' ');
+              command_error "baseuri can't contain spaces"
+            with Not_found -> v
+          in
+          if not (MatitaMisc.is_empty value) && opts.clean_baseuri then begin
+            MatitaLog.warn ("baseuri " ^ value ^ " is not empty");
+            MatitaLog.message ("cleaning baseuri " ^ value);
+            MatitacleanLib.clean_baseuris [value]
+          end;
+          add_moo_metadata [GrafiteAst.Baseuri value] status
+        end else
+          status
       in
-      if not (MatitaMisc.is_empty value) then
-        begin
-          MatitaLog.warn ("baseuri " ^ value ^ " is not empty");
-          if opts.clean_baseuri then
-            begin 
-              MatitaLog.message ("cleaning baseuri " ^ value);
-              MatitacleanLib.clean_baseuris [value]
-            end
-        end;
       set_option status name value
   | GrafiteAst.Drop loc -> raise Drop
   | GrafiteAst.Qed loc ->
@@ -772,13 +777,20 @@ let eval_command opts status cmd =
       MatitaSync.set_proof_aliases status diff
   | GrafiteAst.Render _ -> assert false (* ZACK: to be removed *)
   | GrafiteAst.Dump _ -> assert false   (* ZACK: to be removed *)
-  | GrafiteAst.Interpretation (_, dsc, (symbol, _), _) as stm ->
-      let status' = add_moo_content [stm] status in
+  | GrafiteAst.Interpretation (_, dsc, (symbol, _), cic_appl_pattern) as stm ->
+      let status = add_moo_content [stm] status in
+      let uris =
+        List.map
+          (fun uri -> GrafiteAst.Dependency (UriManager.buri_of_uri uri))
+          (CicNotationUtil.find_appl_pattern_uris cic_appl_pattern)
+      in
       let diff =
        [DisambiguateTypes.Symbol (symbol, 0),
          DisambiguateChoices.lookup_symbol_by_dsc symbol dsc]
       in
-      MatitaSync.set_proof_aliases status' diff
+      let status = MatitaSync.set_proof_aliases status diff in
+      let status = MatitaTypes.add_moo_metadata uris status in
+      status
   | GrafiteAst.Notation _ as stm -> add_moo_content [stm] status
   | GrafiteAst.Obj (loc,obj) ->
      let ext,name =
@@ -871,7 +883,6 @@ let eval_executable opts status ex =
 
 let eval_comment status c = status
             
-
 let eval_ast 
   ?(do_heavy_checks=false) ?(include_paths=[]) ?(clean_baseuri=true) status st 
 =
@@ -884,21 +895,30 @@ let eval_ast
   | GrafiteAst.Executable (_,ex) -> eval_executable opts status ex
   | GrafiteAst.Comment (_,c) -> eval_comment status c
 
-let eval_from_moo ?do_heavy_checks ?include_paths ?clean_baseuri status fname
-  cb
+let eval_from_moo ?do_heavy_checks ?include_paths ?clean_baseuri status fname cb
 =
-  let moo = MatitaMoo.load_moo fname in
+  let ast_of_cmd cmd =
+    GrafiteAst.Executable (DisambiguateTypes.dummy_floc,
+      GrafiteAst.Command (DisambiguateTypes.dummy_floc,
+        (GrafiteAst.reash_cmd_uris cmd)))
+  in
+  let moo, metadata = MatitaMoo.load_moo fname in
   List.iter 
     (fun ast -> 
+      let ast = ast_of_cmd ast in
+      cb !status ast;
+      status :=
+        eval_ast ?do_heavy_checks ?include_paths ?clean_baseuri !status ast)
+    moo;
+  List.iter
+    (fun m ->
       let ast =
-        GrafiteAst.Executable (DisambiguateTypes.dummy_floc,
-          GrafiteAst.Command (DisambiguateTypes.dummy_floc,
-            (GrafiteAst.reash_cmd_uris ast)))
+        ast_of_cmd (GrafiteAst.Metadata (DisambiguateTypes.dummy_floc, m))
       in
       cb !status ast;
       status :=
         eval_ast ?do_heavy_checks ?include_paths ?clean_baseuri !status ast)
-    moo
+    metadata
 
 let eval_from_stream 
   ?do_heavy_checks ?include_paths ?clean_baseuri status str cb 
@@ -952,7 +972,7 @@ let initial_status =
   lazy {
     aliases = DisambiguateTypes.Environment.empty;
     multi_aliases = DisambiguateTypes.Environment.empty;
-    moo_content_rev = [];
+    moo_content_rev = [], [];
     proof_status = No_proof;
     options = default_options ();
     objects = [];
index ea5c748bdff6e1647c63738b3e61659c3de1af93..bdea339b7c0ab94a0227f68e1d0ad222acdb2f1d 100644 (file)
@@ -34,16 +34,19 @@ let marshal_flags = []
  *   structure. Different magic numbers stand for incompatible data structures
  * - an integer -- checksum -- denoting the hash value (computed with
  *   Hashtbl.hash) of the string representation of the dumped data structur
- * - marshalled list of GrafiteAst.command
+ * - marshalled pair: first component is a list of GrafiteAst.command (real moo
+ *   content), second component is a list of GrafiteAst.metadata
  *)
 
-let save_moo ~fname moo =
+let save_moo ~fname (moo, metadata) =
  let oc = open_out fname in
- let marshalled_moo = Marshal.to_string (List.rev moo) marshal_flags in
- let checksum = Hashtbl.hash marshalled_moo in
+ let marshalled = 
+   Marshal.to_string (List.rev moo, List.rev metadata) marshal_flags 
+ in
+ let checksum = Hashtbl.hash marshalled in
  output_binary_int oc GrafiteAst.magic;
  output_binary_int oc checksum;
- output_string oc marshalled_moo;
+ output_string oc marshalled;
  close_out oc
 
 let load_moo ~fname =
@@ -55,11 +58,11 @@ let load_moo ~fname =
         let moo_magic = input_binary_int ic in
         if moo_magic <> GrafiteAst.magic then raise (Version_mismatch fname);
         let moo_checksum = input_binary_int ic in
-        let marshalled_moo = HExtlib.input_all ic in
-        let checksum = Hashtbl.hash marshalled_moo in
+        let marshalled = HExtlib.input_all ic in
+        let checksum = Hashtbl.hash marshalled in
         if checksum <> moo_checksum then raise (Checksum_failure fname);
-        let (moo: MatitaTypes.ast_command list) =
-          Marshal.from_string marshalled_moo 0
+        let (moo: MatitaTypes.moo) =
+          Marshal.from_string marshalled 0
         in
         moo
       with End_of_file -> raise (Corrupt_moo fname))
index 3959a120a6fd148b7f5d651853ec22bbb5f3fe27..75b71a58f6efe282d092348414b1d9d1f284b9ba 100644 (file)
@@ -28,8 +28,8 @@ exception Checksum_failure of string
 exception Corrupt_moo of string
 exception Version_mismatch of string
 
-val save_moo: fname:string -> MatitaTypes.ast_command list -> unit
+val save_moo: fname:string -> MatitaTypes.moo -> unit
 
   (** @raise Corrupt_moo *)
-val load_moo: fname:string -> MatitaTypes.ast_command list
+val load_moo: fname:string -> MatitaTypes.moo
 
index 754197bb77fdc59fd6f21564ec6cb75609552f76..cbf305261eb3fbdcba374c23e4b8721192fec41d 100644 (file)
@@ -47,6 +47,18 @@ let alias_diff =
  fun ~from status -> profiler.HExtlib.profile (alias_diff ~from) status
 
 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
@@ -59,9 +71,12 @@ let set_proof_aliases status new_aliases =
  if new_aliases = [] then
    new_status
  else
-   add_moo_content
-    (DisambiguatePp.commands_of_domain_and_codomain_items_list new_aliases)
-    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 automatic aliases **)
index 5df68ea86dca84d94d0ff52b4c86c082a9081935..8b4cb1f9deeadf80ddaa69034811ec566c76bed0 100644 (file)
@@ -58,11 +58,12 @@ type options = option_value StringMap.t
 let no_options = StringMap.empty
 
 type ast_command = (CicNotationPt.term, GrafiteAst.obj) GrafiteAst.command
+type moo = ast_command list * GrafiteAst.metadata list
 
 type status = {
   aliases: DisambiguateTypes.environment;
   multi_aliases: DisambiguateTypes.multiple_environment;
-  moo_content_rev: ast_command list;
+  moo_content_rev: moo;
   proof_status: proof_status;
   options: options;
   objects: (UriManager.uri * string) list;
@@ -80,26 +81,6 @@ let set_metasenv metasenv status =
   in
   { status with proof_status = proof_status }
 
-let add_moo_content cmds status =
-  let content = status.moo_content_rev in
-  let content' =
-    List.fold_right
-      (fun cmd acc ->
-(*         prerr_endline ("adding to moo command: " ^ GrafiteAstPp.pp_command cmd); *)
-        match cmd with
-        | GrafiteAst.Interpretation _
-        | GrafiteAst.Default _ ->
-            if List.mem cmd content then acc
-            else cmd :: acc
-        | GrafiteAst.Alias _ -> (* move Alias as the last inserted one *)
-            cmd :: (List.filter ((<>) cmd) acc)
-        | _ -> cmd :: acc)
-      cmds content
-  in
-(*   prerr_endline ("new moo content: " ^ String.concat " " (List.map
-    GrafiteAstPp.pp_command content')); *)
-  { status with moo_content_rev = content' }
-
 let dump_status status = 
   MatitaLog.message "status.aliases:\n";
   MatitaLog.message
@@ -125,7 +106,6 @@ let dump_status status =
     (fun (u,_) -> 
       MatitaLog.message (UriManager.string_of_uri u)) status.objects 
   
-
 let get_option status name =
   try
     StringMap.find name status.options
@@ -166,6 +146,47 @@ let set_option status name value =
   else
     { status with options = StringMap.add name value status.options }
 
+let add_moo_content cmds status =
+  let content, metadata = status.moo_content_rev in
+  let content' =
+    List.fold_right
+      (fun cmd acc ->
+(*         prerr_endline ("adding to moo command: " ^ GrafiteAstPp.pp_command cmd); *)
+        match cmd with
+        | GrafiteAst.Interpretation _
+        | GrafiteAst.Default _ ->
+            if List.mem cmd content then acc
+            else cmd :: acc
+        | GrafiteAst.Alias _ -> (* move Alias as the last inserted one *)
+            cmd :: (List.filter ((<>) cmd) acc)
+        | _ -> cmd :: acc)
+      cmds content
+  in
+(*   prerr_endline ("new moo content: " ^ String.concat " " (List.map
+    GrafiteAstPp.pp_command content')); *)
+  { status with moo_content_rev = content', metadata }
+
+let add_moo_metadata new_metadata status =
+  let content, metadata = status.moo_content_rev in
+  let metadata' =
+    List.fold_left
+      (fun acc m ->
+        match m with
+        | GrafiteAst.Dependency buri ->
+            let is_self = (* self dependency *)
+              try
+                get_string_option status "baseuri" = buri
+              with Option_error _ -> false  (* baseuri not yet set *)
+            in
+            if is_self
+              || List.exists (GrafiteAst.eq_metadata m) metadata (* duplicate *)
+            then acc
+            else m :: acc
+        | _ -> m :: acc)
+      metadata new_metadata
+  in
+  { status with moo_content_rev = content, metadata' }
+
   (* subset of MatitaConsole.console methods needed by MatitaInterpreter *)
 class type console =
   object
index 51744f15296240242f0e5e51747e339dc551069f..144c0c1f2b6212a38d0bc4df6923f5cfa36e429f 100644 (file)
@@ -48,21 +48,23 @@ type options = option_value StringMap.t
 val no_options : 'a StringMap.t
 
 type ast_command = (CicNotationPt.term, GrafiteAst.obj) GrafiteAst.command
+type moo = ast_command list * GrafiteAst.metadata list  (** <moo, metadata> *)
 
 type status = {
-  aliases: DisambiguateTypes.environment;   (** disambiguation aliases *)
+  aliases: DisambiguateTypes.environment;         (** disambiguation aliases *)
   multi_aliases: DisambiguateTypes.multiple_environment;
-  moo_content_rev: ast_command list;
-  proof_status: proof_status;
+  moo_content_rev: moo;
+  proof_status: proof_status;                             (** logical status *)
   options: options;
   objects: (UriManager.uri * string) list;  (** in-scope objects, with paths *)
-  notation_ids: CicNotation.notation_id list; (** in-scope notation ids *)
+  notation_ids: CicNotation.notation_id list;      (** in-scope notation ids *)
 }
 
 val set_metasenv: Cic.metasenv -> status -> status
 
   (** list is not reversed, head command will be the first emitted *)
 val add_moo_content: ast_command list -> status -> status
+val add_moo_metadata: GrafiteAst.metadata list -> status -> status
 
 val dump_status : status -> unit
 val get_option : status -> StringMap.key -> option_value
index 0db34ea88012a17ef047b0ffc5ed7cd6d065fcd2..a10594ab2a68ebf3f0f909d4140ce2ae165c86c5 100644 (file)
@@ -134,9 +134,9 @@ let main ~mode =
   Sys.catch_break true;
   let origcb = MatitaLog.get_log_callback () in
   let newcb tag s =
-        match tag with
-        | `Debug | `Message -> ()
-        | `Warning | `Error -> origcb tag s
+    match tag with
+    | `Debug | `Message -> ()
+    | `Warning | `Error -> origcb tag s
   in
   if Helm_registry.get_bool "matita.quiet" then
     MatitaLog.set_log_callback newcb;
index e15f736dcafc9154510504c177aed40dab6288d6..9a5d1bf018228a995ad8a9a48d3d817dae32f1cc 100644 (file)
@@ -30,7 +30,7 @@ module TA = GrafiteAst
 
 let _ = MatitaInit.initialize_all ()
 
-let main uri_to_remove = MatitacleanLib.clean_baseuris uri_to_remove
+let main = MatitacleanLib.clean_baseuris
 
 let _ =
   let uris_to_remove = ref [] in
index 2d1cbfdef4fb1d7a39cf9649b9f10c0fcec85c99..e8a1fd29a301bf1141f4ae2739929664aa2f9426 100644 (file)
@@ -52,7 +52,8 @@ let one_step_depend suri =
         let buri = HMysql.escape buri in
         let obj_tbl = MetadataTypes.obj_tbl () in
         sprintf 
-          "SELECT source, h_occurrence FROM %s WHERE h_occurrence LIKE '%s%%'"
+        ("SELECT source, h_occurrence FROM %s WHERE " ^^ 
+         "h_occurrence REGEXP '^%s[^/]*$'")
             obj_tbl buri
       in
       try 
@@ -123,29 +124,96 @@ let close_uri_list uri_to_remove =
   in
   uri_to_remove, depend
 
-let rec close uris next =
+let rec close_using_db uris next =
   match next with
   | [] -> uris
-  | l -> let uris, next = close_uri_list l in close uris next @ uris
+  | l -> let uris, next = close_uri_list l in close_using_db uris next @ uris
   
 let cleaned_no = ref 0;;
 
+  (** TODO repellent code ... *)
+let moo_root_dir = lazy (
+  let url =
+    List.assoc "cic:/matita/"
+      (List.map
+        (fun pair ->
+          match
+            Str.split (Str.regexp "[ \t\r\n]+") (HExtlib.trim_blanks pair)
+          with
+          | [a;b] -> a, b
+          | _ -> assert false)
+        (Helm_registry.get_list Helm_registry.string "getter.prefix"))
+  in
+  String.sub url 7 (String.length url - 7)  (* remove heading "file:///" *)
+)
+
+let close_using_moos buris =
+  let rev_deps = Hashtbl.create 97 in
+  let all_moos =
+    HExtlib.find ~test:(fun name -> Filename.check_suffix name ".moo")
+      (Lazy.force moo_root_dir)
+  in
+  List.iter
+    (fun path -> 
+      let _, metadata = MatitaMoo.load_moo ~fname:path in
+      let baseuri_of_current_moo = 
+        let rec aux = function 
+          | [] -> assert false
+          | GrafiteAst.Baseuri buri::_ -> buri
+          | _ :: tl -> aux tl
+        in
+        aux metadata
+      in
+      let deps = 
+        HExtlib.filter_map 
+          (function 
+          | GrafiteAst.Dependency buri -> Some buri
+          | _ -> None ) 
+        metadata
+      in
+      List.iter 
+        (fun buri -> Hashtbl.add rev_deps buri baseuri_of_current_moo) deps)
+  all_moos;
+  let buris_to_remove = 
+    HExtlib.list_uniq  
+      (List.fast_sort Pervasives.compare 
+        (List.flatten (List.map (Hashtbl.find_all rev_deps) buris)))
+  in
+  let objects_to_remove = 
+    let objs_of_buri buri =
+      HExtlib.filter_map 
+        (function 
+        | Http_getter_types.Ls_object o ->
+            Some (buri ^ "/" ^ o.Http_getter_types.uri)
+        | _ -> None) 
+      (Http_getter.ls buri)
+    in
+    List.flatten (List.map objs_of_buri (buris @ buris_to_remove))
+  in
+  objects_to_remove
+
 let clean_baseuris ?(verbose=true) buris =
   Hashtbl.clear cache_of_processed_baseuri;
   let buris = List.map HGM.strip_trailing_slash buris in
   debug_prerr "clean_baseuris called on:";
   if debug then
     List.iter debug_prerr buris; 
-  let l = close [] buris in
+  let l = 
+    if Helm_registry.get_bool "db.nodb" then
+      close_using_moos buris
+    else
+      close_using_db [] buris 
+  in
   let l = HExtlib.list_uniq (List.fast_sort Pervasives.compare l) in
   let l = List.map UriManager.uri_of_string l in
   debug_prerr "clean_baseuri will remove:";
   if debug then
     List.iter (fun u -> debug_prerr (UriManager.string_of_uri u)) l; 
-  Hashtbl.iter
-   (fun buri ->
+  List.iter
+   (fun buri ->
      MatitaMisc.safe_remove (MatitaMisc.obj_file_of_baseuri buri)) 
-   cache_of_processed_baseuri;
+   (HExtlib.list_uniq (List.fast_sort Pervasives.compare
+     (List.map (UriManager.buri_of_uri) l)));
   List.iter (MatitaSync.remove ~verbose) l;
   cleaned_no := !cleaned_no + List.length l;
   if !cleaned_no > 30 then
index f4ce6de570925ddfd7d28542fbed46b91709b772..2d8095fb2d70acd780d0b32afc85a68af160ddc9 100644 (file)
@@ -24,3 +24,4 @@
  *)
 
 val clean_baseuris : ?verbose:bool -> string list -> unit
+