]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/getter/http_getter.ml
ocaml 3.09 transition
[helm.git] / helm / ocaml / getter / http_getter.ml
index 9254c13f68bd02175348db578462be3109c4510c..191117a20e38c182d3af6a43824cf8c27af198af 100644 (file)
@@ -63,10 +63,11 @@ let pipe_RE               = Pcre.regexp "\\|"
 let til_slash_RE          = Pcre.regexp "^.*/"
 let no_slashes_RE         = Pcre.regexp "^[^/]*$"
 let fix_regexp_RE         = Pcre.regexp ("^" ^ (Pcre.quote "(cic|theory)"))
-let showable_file_RE      = Pcre.regexp "(\\.con|\\.ind|\\.var)$"
+let showable_file_RE      =
+  Pcre.regexp "(\\.con|\\.ind|\\.var|\\.body|\\.types|\\.proof_tree)$"
 
 let xml_suffix = ".xml"
-let theory_suffix = ".theory" ^ xml_suffix
+let theory_suffix = ".theory"
 
   (* global maps, shared by all threads *)
 
@@ -87,7 +88,7 @@ let getter_url () = Helm_registry.get "getter.url"
 
   (* <TODO> *)
 let getxml_remote uri = not_implemented "getxml_remote"
-let getxslt_remote ~patch_dtd uri = not_implemented "getxslt_remote"
+let getxslt_remote uri = not_implemented "getxslt_remote"
 let getdtd_remote uri = not_implemented "getdtd_remote"
 let clean_cache_remote () = not_implemented "clean_cache_remote"
 let list_servers_remote () = not_implemented "list_servers_remote"
@@ -128,44 +129,46 @@ let resolve_remote uri =
   | Exception e -> raise e
   | Resolved url -> url
 
+let deref_index_theory uri =
+ if Http_getter_storage.exists (uri ^ xml_suffix) then uri
+ else if is_theory_uri uri && Filename.basename uri = "index.theory" then
+    strip_trailing_slash (Filename.dirname uri) ^ theory_suffix
+ else
+    uri
+
 (* API *)
 
 let help () = Http_getter_const.usage_string (Http_getter_env.env_to_string ())
 
 let exists uri =
+(*   prerr_endline ("Http_getter.exists " ^ uri); *)
   if remote () then
     exists_remote uri
   else
+   let uri = deref_index_theory uri in
     Http_getter_storage.exists (uri ^ xml_suffix)
        
 let resolve uri =
   if remote () then
     resolve_remote uri
   else
+   let uri = deref_index_theory uri in
     try
       Http_getter_storage.resolve (uri ^ xml_suffix)
     with Http_getter_storage.Resource_not_found _ -> raise (Key_not_found uri)
 
 let getxml uri =
-  if remote () then
-    getxml_remote uri
+  if remote () then getxml_remote uri
   else begin
-    try
-      Http_getter_storage.filename (uri ^ xml_suffix)
-    with Http_getter_storage.Resource_not_found _ -> raise (Key_not_found uri)
+    let uri' = deref_index_theory uri in
+    (try
+      Http_getter_storage.filename (uri' ^ xml_suffix)
+    with Http_getter_storage.Resource_not_found _ -> raise (Key_not_found uri))
   end
 
-let getxslt ?(patch_dtd = true) uri = assert false
-(* let getxslt ?(patch_dtd = true) uri =
-  if remote () then
-    getxslt_remote ~patch_dtd uri
-  else begin
-    let url = resolve uri in
-    let (fname, outchan) = temp_file_of_uri uri in
-    Http_getter_cache.respond_xsl ~via_http:false ~url ~patch:patch_dtd outchan;
-    close_out outchan;
-    fname
-  end *)
+let getxslt uri =
+  if remote () then getxslt_remote uri
+  else Http_getter_storage.filename ~find:true ("xslt:/" ^ uri)
 
 let getdtd uri =
   if remote () then
@@ -190,6 +193,7 @@ let (++) (oldann, oldtypes, oldbody, oldtree)
    (if newtree  > oldtree   then newtree  else oldtree))
     
 let store_obj tbl o =
+(*   prerr_endline ("Http_getter.store_obj " ^ o); *)
   if Pcre.pmatch ~rex:showable_file_RE o then begin
     let basepart = Pcre.replace ~rex:basepart_RE ~templ:"$1" o in
     let no_flags = false, No, No, No in
@@ -228,8 +232,11 @@ let collect_ls_items dirs_set objs_tbl =
     objs_tbl;
   List.rev !items
 
+let contains_object = (<>) []
+
   (** non regexp-aware version of ls *)
-let dumb_ls uri_prefix =
+let rec dumb_ls uri_prefix =
+(*   prerr_endline ("Http_getter.dumb_ls " ^ uri_prefix); *)
   if is_cic_obj_uri uri_prefix then begin
     let dirs = ref StringSet.empty in
     let objs = Hashtbl.create 17 in
@@ -245,23 +252,41 @@ let dumb_ls uri_prefix =
     collect_ls_items !dirs objs
   end else if is_theory_uri uri_prefix then begin
     let items = ref [] in
+    let add_theory fname =
+      items :=
+        Ls_object {
+          uri = fname; ann = false; types = No; body = No; proof_tree = No }
+        :: !items
+    in
+    let cic_uri_prefix =
+      Pcre.replace_first ~rex:heading_theory_RE ~templ:"cic:" uri_prefix
+    in
     List.iter
       (fun fname ->
         if ends_with_slash fname then
           items := Ls_section (strip_trailing_slash fname) :: !items
         else
           try
-            let obj =
-              { uri = strip_suffix theory_suffix fname;
-                ann = false; types = No; body = No; proof_tree = No }
-            in
-            items := Ls_object obj :: !items
+            let fname = strip_suffix ~suffix:xml_suffix fname in
+            let theory_name = strip_suffix ~suffix:theory_suffix fname in
+            let sub_theory = normalize_dir cic_uri_prefix ^ theory_name ^ "/" in
+            if is_empty_theory sub_theory then add_theory fname
           with Invalid_argument _ -> ())
       (Http_getter_storage.ls uri_prefix);
+    (try
+      if contains_object (dumb_ls cic_uri_prefix)
+        && exists (strip_trailing_slash uri_prefix ^ theory_suffix)
+      then
+        add_theory "index.theory";
+    with Unresolvable_URI _ -> ());
     !items
   end else
     raise (Invalid_URI uri_prefix)
 
+and is_empty_theory uri_prefix =
+(*   prerr_endline ("is_empty_theory " ^ uri_prefix); *)
+  not (contains_object (dumb_ls uri_prefix))
+
   (* handle simple regular expressions of the form "...(..|..|..)..." on cic
    * uris, not meant to be a real implementation of regexp. The only we use is
    * "(cic|theory):/..." *)
@@ -321,7 +346,13 @@ let getxml' uri = getxml (UriManager.string_of_uri uri)
 let resolve' uri = resolve (UriManager.string_of_uri uri)
 let exists' uri = exists (UriManager.string_of_uri uri)
 
+let tilde_expand_key k =
+  try
+    Helm_registry.set k (HExtlib.tilde_expand (Helm_registry.get k))
+  with Helm_registry.Key_not_found _ -> ()
+
 let init () =
+  List.iter tilde_expand_key ["getter.cache_dir"; "getter.dtd_dir"];
   Http_getter_logger.set_log_level
     (Helm_registry.get_opt_default Helm_registry.int ~default:1
       "getter.log_level");