more systematic support for special directories;
authorwenzelm
Mon, 17 Aug 2020 13:16:42 +0200
changeset 72162 5894859c5c84
parent 72161 cf443b24ad90
child 72163 f5722290a4d0
more systematic support for special directories;
NEWS
etc/settings
lib/scripts/getfunctions
lib/scripts/getsettings
src/Pure/General/path.ML
src/Pure/PIDE/resources.ML
src/Tools/Code/code_target.ML
--- a/NEWS	Mon Aug 17 12:35:03 2020 +0200
+++ b/NEWS	Mon Aug 17 13:16:42 2020 +0200
@@ -138,6 +138,12 @@
 
 *** System ***
 
+* The shell function "isabelle_directory" (within etc/settings of
+components) augments the list of special directories for persistent
+symbolic path names. This improves portability of heap images and
+session databases. It used to be hard-wired for Isabelle + AFP, but
+other projects may now participate on equal terms.
+
 * ML statistics via an external Poly/ML process: this allows monitoring
 the runtime system while the ML program sleeps.
 
--- a/etc/settings	Mon Aug 17 12:35:03 2020 +0200
+++ b/etc/settings	Mon Aug 17 13:16:42 2020 +0200
@@ -74,6 +74,10 @@
 ### Misc path settings
 ###
 
+isabelle_directory '~'
+isabelle_directory '$ISABELLE_HOME_USER'
+isabelle_directory '~~'
+
 ISABELLE_COMPONENT_REPOSITORY="https://isabelle.in.tum.de/components"
 ISABELLE_COMPONENTS_BASE="$USER_HOME/.isabelle/contrib"
 
--- a/lib/scripts/getfunctions	Mon Aug 17 12:35:03 2020 +0200
+++ b/lib/scripts/getfunctions	Mon Aug 17 13:16:42 2020 +0200
@@ -160,6 +160,22 @@
 }
 export -f isabelle_scala_service
 
+#Special directories
+function isabelle_directory ()
+{
+  local X=""
+  for X in "$@"
+  do
+    if [ -z "$ISABELLE_DIRECTORIES" ]; then
+      ISABELLE_DIRECTORIES="$X"
+    else
+      ISABELLE_DIRECTORIES="$ISABELLE_DIRECTORIES:$X"
+    fi
+  done
+  export ISABELLE_DIRECTORIES
+}
+export -f isabelle_directory
+
 #administrative build
 if [ -e "$ISABELLE_HOME/Admin/build" ]; then
   function isabelle_admin_build ()
--- a/lib/scripts/getsettings	Mon Aug 17 12:35:03 2020 +0200
+++ b/lib/scripts/getsettings	Mon Aug 17 13:16:42 2020 +0200
@@ -57,6 +57,7 @@
 ISABELLE_FONTS=""
 ISABELLE_FONTS_HIDDEN=""
 ISABELLE_SCALA_SERVICES=""
+ISABELLE_DIRECTORIES=""
 
 #main executables
 ISABELLE_TOOL="$ISABELLE_HOME/bin/isabelle"
--- a/src/Pure/General/path.ML	Mon Aug 17 12:35:03 2020 +0200
+++ b/src/Pure/General/path.ML	Mon Aug 17 13:16:42 2020 +0200
@@ -36,7 +36,7 @@
   val exe: T -> T
   val expand: T -> T
   val file_name: T -> string
-  val smart_implode: T -> string
+  val implode_symbolic: T -> string
   val position: T -> Position.T
   eqtype binding
   val binding: T * Position.T -> binding
@@ -235,10 +235,11 @@
 val file_name = implode_path o base o expand;
 
 
-(* smart implode *)
+(* implode wrt. given directories *)
 
-fun smart_implode path =
+fun implode_symbolic path =
   let
+    val directories = rev (space_explode ":" (getenv "ISABELLE_DIRECTORIES"));
     val full_name = implode_path (expand path);
     fun fold_path a =
       (case try (implode_path o expand o explode_path) a of
@@ -250,12 +251,12 @@
             | NONE => NONE)
       | NONE => NONE);
   in
-    (case get_first fold_path ["$AFP", "~~", "$ISABELLE_HOME_USER", "~"] of
+    (case get_first fold_path directories of
       SOME name => name
     | NONE => implode_path path)
   end;
 
-val position = Position.file o smart_implode;
+val position = Position.file o implode_symbolic;
 
 
 (* binding: strictly monotonic path with position *)
--- a/src/Pure/PIDE/resources.ML	Mon Aug 17 12:35:03 2020 +0200
+++ b/src/Pure/PIDE/resources.ML	Mon Aug 17 13:16:42 2020 +0200
@@ -130,7 +130,7 @@
 
 fun begin_theory master_dir {name, imports, keywords} parents =
   Theory.begin_theory name parents
-  |> map_files (fn _ => (Path.explode (Path.smart_implode master_dir), imports, []))
+  |> map_files (fn _ => (Path.explode (Path.implode_symbolic master_dir), imports, []))
   |> Thy_Header.add_keywords keywords;
 
 
@@ -259,7 +259,7 @@
       | NONE => master_directory (Proof_Context.theory_of ctxt));
     val path = Path.append dir (Path.explode name) handle ERROR msg => err msg;
     val _ = Path.expand path handle ERROR msg => err msg;
-    val _ = Context_Position.report ctxt pos (Markup.path (Path.smart_implode path));
+    val _ = Context_Position.report ctxt pos (Markup.path (Path.implode_symbolic path));
     val _ = check_file path handle ERROR msg => err msg;
   in path end;
 
--- a/src/Tools/Code/code_target.ML	Mon Aug 17 12:35:03 2020 +0200
+++ b/src/Tools/Code/code_target.ML	Mon Aug 17 13:16:42 2020 +0200
@@ -536,7 +536,7 @@
             Markup.markup Markup.keyword2 "file" ^ " argument" ^ Position.here pos);
       val _ = Position.report pos Markup.language_path;
       val path = #1 (Path.explode_pos (s, pos));
-      val _ = Position.report pos (Markup.path (Path.smart_implode path));
+      val _ = Position.report pos (Markup.path (Path.implode_symbolic path));
     in (location, (path, pos)) end;
 
 fun export_code all_public cs seris lthy =