Skip to content

Commit 0804621

Browse files
committed
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
1 parent ad304fa commit 0804621

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

lisp/ob-core.el

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,8 @@ block."
739739
(forward-line)
740740
(skip-chars-forward " \t")
741741
(let ((result (org-babel-read-result)))
742-
(message (replace-regexp-in-string "%" "%%" (format "%S" result)))
742+
(message (format "Cached: %s"
743+
(replace-regexp-in-string "%" "%%" (format "%S" result))))
743744
result)))
744745
((org-babel-confirm-evaluate info)
745746
(let* ((lang (nth 0 info))
@@ -3155,6 +3156,22 @@ additionally processed by `shell-quote-argument'."
31553156
Used by `org-babel-temp-file'. This directory will be removed on
31563157
Emacs shutdown."))
31573158

3159+
(defvar org-babel-temporary-stable-directory)
3160+
(unless (or noninteractive (boundp 'org-babel-temporary-stable-directory))
3161+
(defvar org-babel-temporary-stable-directory
3162+
(or (and (boundp 'org-babel-temporary-stable-directory)
3163+
(file-exists-p org-babel-temporary-stable-directory)
3164+
org-babel-temporary-stable-directory)
3165+
(condition-case nil
3166+
(make-directory
3167+
(expand-file-name
3168+
"babel-stable"
3169+
(temporary-file-directory)))
3170+
(t nil)))
3171+
"Directory to hold temporary files created to execute code blocks.
3172+
Used by `org-babel-temp-file'. This directory will be removed on
3173+
Emacs shutdown."))
3174+
31583175
(defcustom org-babel-remote-temporary-directory "/tmp/"
31593176
"Directory to hold temporary files on remote hosts."
31603177
:group 'org-babel
@@ -3198,6 +3215,30 @@ of `org-babel-temporary-directory'."
31983215
temporary-file-directory)))
31993216
(make-temp-file prefix nil suffix))))
32003217

3218+
(defun org-babel-temp-stable-file (data prefix &optional suffix)
3219+
"Create a temporary file in the `org-babel-remove-temporary-stable-directory'.
3220+
The file name is stable with respect to DATA. The file name is
3221+
constructed like the following: PREFIXDATAhashSUFFIX."
3222+
(if (file-remote-p default-directory)
3223+
(let* ((prefix
3224+
(concat (file-remote-p default-directory)
3225+
(expand-file-name
3226+
prefix org-babel-temporary-stable-directory)))
3227+
(path (concat prefix (format "%s" (sxhash data)) (or suffix ""))))
3228+
(with-temp-file path)
3229+
path)
3230+
(let* ((temporary-file-directory
3231+
(or (and (boundp 'org-babel-temporary-stable-directory)
3232+
(file-exists-p org-babel-temporary-stable-directory)
3233+
org-babel-temporary-stable-directory)
3234+
temporary-file-directory))
3235+
(path (concat
3236+
(expand-file-name
3237+
prefix org-babel-temporary-stable-directory)
3238+
(format "%s" (sxhash data)) (or suffix ""))))
3239+
(with-temp-file path)
3240+
path)))
3241+
32013242
(defun org-babel-remove-temporary-directory ()
32023243
"Remove `org-babel-temporary-directory' on Emacs shutdown."
32033244
(when (and (boundp 'org-babel-temporary-directory)
@@ -3221,7 +3262,16 @@ of `org-babel-temporary-directory'."
32213262
org-babel-temporary-directory
32223263
"[directory not defined]"))))))
32233264

3265+
(defun org-babel-remove-temporary-stable-directory ()
3266+
"Remove `org-babel-temporary-stable-directory' and on Emacs shutdown."
3267+
(when (and (boundp 'org-babel-temporary-stable-directory)
3268+
(file-exists-p org-babel-temporary-stable-directory))
3269+
(let ((org-babel-temporary-directory
3270+
org-babel-temporary-stable-directory))
3271+
(org-babel-remove-temporary-directory))))
3272+
32243273
(add-hook 'kill-emacs-hook #'org-babel-remove-temporary-directory)
3274+
(add-hook 'kill-emacs-hook #'org-babel-remove-temporary-stable-directory)
32253275

32263276
(defun org-babel-one-header-arg-safe-p (pair safe-list)
32273277
"Determine if the PAIR is a safe babel header arg according to SAFE-LIST.

lisp/ob-gnuplot.el

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ code."
9494
(let* ((first (car val))
9595
(tablep (or (listp first) (symbolp first))))
9696
(if tablep val (mapcar 'list val)))
97-
(org-babel-temp-file "gnuplot-") params)
97+
;; Make temporary file name stable with respect to data.
98+
;; If we do not do it, :cache argument becomes useless.
99+
(org-babel-temp-stable-file params "gnuplot-")
100+
params)
98101
(if (and (stringp val)
99102
(file-remote-p val) ;; check if val is a remote file
100103
(file-exists-p val)) ;; call to file-exists-p is slow, maybe remove it

0 commit comments

Comments
 (0)