emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 080462198f 2/2: ob-gnuplot.el: Make :cache argument


From: ELPA Syncer
Subject: [elpa] externals/org 080462198f 2/2: ob-gnuplot.el: Make :cache argument work with :var assignments
Date: Mon, 4 Jul 2022 09:57:54 -0400 (EDT)

branch: externals/org
commit 080462198fa7b5ac5669ab0c760ec849e9e5456a
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Ihor Radchenko <yantar92@gmail.com>

    ob-gnuplot.el: Make :cache argument work with :var assignments
    
    * lisp/ob-core.el (org-babel-temporary-stable-directory): New variable
    holding a temporary directory name that does not change between Emacs
    sessions.
    (org-babel-remove-temporary-stable-directory): New function removing
    `org-babel-temporary-stable-directory' on Emacs shutdown.
    (org-babel-temp-stable-file): Generate stable temporary file name for
    object storage.  The file name is constant for equal objects.
    (org-babel-execute-src-block): Explicitly identify that if the result
    is cached.
    * lisp/ob-gnuplot.el (org-babel-gnuplot-process-vars): Make use of
    `org-babel-stable-file' to make expanded body stable with respect to
    :var assignments.
    
    Fixes https://orgmode.org/list/87mtn1o5mn.fsf@ucl.ac.uk
---
 lisp/ob-core.el    | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 lisp/ob-gnuplot.el |  5 ++++-
 2 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index 3d1a878499..6c379c121a 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -739,7 +739,8 @@ block."
            (forward-line)
            (skip-chars-forward " \t")
            (let ((result (org-babel-read-result)))
-             (message (replace-regexp-in-string "%" "%%" (format "%S" result)))
+             (message (format "Cached: %s"
+                               (replace-regexp-in-string "%" "%%" (format "%S" 
result))))
              result)))
         ((org-babel-confirm-evaluate info)
          (let* ((lang (nth 0 info))
@@ -3155,6 +3156,22 @@ additionally processed by `shell-quote-argument'."
 Used by `org-babel-temp-file'.  This directory will be removed on
 Emacs shutdown."))
 
+(defvar org-babel-temporary-stable-directory)
+(unless (or noninteractive (boundp 'org-babel-temporary-stable-directory))
+  (defvar org-babel-temporary-stable-directory
+    (or (and (boundp 'org-babel-temporary-stable-directory)
+            (file-exists-p org-babel-temporary-stable-directory)
+            org-babel-temporary-stable-directory)
+        (condition-case nil
+            (make-directory
+            (expand-file-name
+              "babel-stable"
+              (temporary-file-directory)))
+          (t nil)))
+    "Directory to hold temporary files created to execute code blocks.
+Used by `org-babel-temp-file'.  This directory will be removed on
+Emacs shutdown."))
+
 (defcustom org-babel-remote-temporary-directory "/tmp/"
   "Directory to hold temporary files on remote hosts."
   :group 'org-babel
@@ -3198,6 +3215,30 @@ of `org-babel-temporary-directory'."
               temporary-file-directory)))
       (make-temp-file prefix nil suffix))))
 
+(defun org-babel-temp-stable-file (data prefix &optional suffix)
+  "Create a temporary file in the 
`org-babel-remove-temporary-stable-directory'.
+The file name is stable with respect to DATA.  The file name is
+constructed like the following: PREFIXDATAhashSUFFIX."
+  (if (file-remote-p default-directory)
+      (let* ((prefix
+              (concat (file-remote-p default-directory)
+                      (expand-file-name
+                      prefix org-babel-temporary-stable-directory)))
+             (path (concat prefix (format "%s" (sxhash data)) (or suffix ""))))
+        (with-temp-file path)
+        path)
+    (let* ((temporary-file-directory
+           (or (and (boundp 'org-babel-temporary-stable-directory)
+                    (file-exists-p org-babel-temporary-stable-directory)
+                    org-babel-temporary-stable-directory)
+               temporary-file-directory))
+           (path (concat
+                  (expand-file-name
+                  prefix org-babel-temporary-stable-directory)
+                  (format "%s" (sxhash data)) (or suffix ""))))
+      (with-temp-file path)
+      path)))
+
 (defun org-babel-remove-temporary-directory ()
   "Remove `org-babel-temporary-directory' on Emacs shutdown."
   (when (and (boundp 'org-babel-temporary-directory)
@@ -3221,7 +3262,16 @@ of `org-babel-temporary-directory'."
                    org-babel-temporary-directory
                  "[directory not defined]"))))))
 
+(defun org-babel-remove-temporary-stable-directory ()
+  "Remove `org-babel-temporary-stable-directory' and on Emacs shutdown."
+  (when (and (boundp 'org-babel-temporary-stable-directory)
+            (file-exists-p org-babel-temporary-stable-directory))
+    (let ((org-babel-temporary-directory
+           org-babel-temporary-stable-directory))
+      (org-babel-remove-temporary-directory))))
+
 (add-hook 'kill-emacs-hook #'org-babel-remove-temporary-directory)
+(add-hook 'kill-emacs-hook #'org-babel-remove-temporary-stable-directory)
 
 (defun org-babel-one-header-arg-safe-p (pair safe-list)
   "Determine if the PAIR is a safe babel header arg according to SAFE-LIST.
diff --git a/lisp/ob-gnuplot.el b/lisp/ob-gnuplot.el
index 3113384794..c552986a3c 100644
--- a/lisp/ob-gnuplot.el
+++ b/lisp/ob-gnuplot.el
@@ -94,7 +94,10 @@ code."
               (let* ((first  (car val))
                      (tablep (or (listp first) (symbolp first))))
                 (if tablep val (mapcar 'list val)))
-              (org-babel-temp-file "gnuplot-") params)
+               ;; Make temporary file name stable with respect to data.
+               ;; If we do not do it, :cache argument becomes useless.
+               (org-babel-temp-stable-file params "gnuplot-")
+               params)
            (if (and (stringp val)
                     (file-remote-p val)  ;; check if val is a remote file
                     (file-exists-p val)) ;; call to file-exists-p is slow, 
maybe remove it



reply via email to

[Prev in Thread] Current Thread [Next in Thread]