[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