|
@@ -284,75 +284,78 @@ Returns a list
|
|
|
This is used by Babel to resolve references in source blocks.
|
|
|
Its value is dynamically bound during export.")
|
|
|
|
|
|
-(defmacro org-babel-check-confirm-evaluate (info &rest body)
|
|
|
- "Evaluate BODY with special execution confirmation variables set.
|
|
|
-
|
|
|
-Specifically; NOEVAL will indicate if evaluation is allowed,
|
|
|
-QUERY will indicate if a user query is required, CODE-BLOCK will
|
|
|
-hold the language of the code block, and BLOCK-NAME will hold the
|
|
|
-name of the code block."
|
|
|
- (declare (indent defun))
|
|
|
- (org-with-gensyms
|
|
|
- (lang block-body headers name head eval eval-no export eval-no-export)
|
|
|
- `(let* ((,lang (nth 0 ,info))
|
|
|
- (,block-body (nth 1 ,info))
|
|
|
- (,headers (nth 2 ,info))
|
|
|
- (,name (nth 4 ,info))
|
|
|
- (,head (nth 6 ,info))
|
|
|
- (,eval (or (cdr (assoc :eval ,headers))
|
|
|
- (when (assoc :noeval ,headers) "no")))
|
|
|
- (,eval-no (or (equal ,eval "no")
|
|
|
- (equal ,eval "never")))
|
|
|
- (,export org-babel-exp-reference-buffer)
|
|
|
- (,eval-no-export (and ,export (or (equal ,eval "no-export")
|
|
|
- (equal ,eval "never-export"))))
|
|
|
- (noeval (or ,eval-no ,eval-no-export))
|
|
|
- (query (or (equal ,eval "query")
|
|
|
- (and ,export (equal ,eval "query-export"))
|
|
|
- (if (functionp org-confirm-babel-evaluate)
|
|
|
- (save-excursion
|
|
|
- (goto-char ,head)
|
|
|
- (funcall org-confirm-babel-evaluate
|
|
|
- ,lang ,block-body))
|
|
|
- org-confirm-babel-evaluate)))
|
|
|
- (code-block (if ,info (format " %s " ,lang) " "))
|
|
|
- (block-name (if ,name (format " (%s) " ,name) " ")))
|
|
|
- ,@body)))
|
|
|
-
|
|
|
-(defsubst org-babel-check-evaluate (info)
|
|
|
+(defun org-babel-check-confirm-evaluate (info)
|
|
|
+ "Check whether INFO allows code block evaluation.
|
|
|
+
|
|
|
+Returns nil if evaluation is disallowed, t if it is
|
|
|
+unconditionally allowed, and the symbol `query' if the user
|
|
|
+should be asked whether to allow evaluation."
|
|
|
+ (let* ((headers (nth 2 info))
|
|
|
+ (eval (or (cdr (assq :eval headers))
|
|
|
+ (when (assq :noeval headers) "no")))
|
|
|
+ (eval-no (member eval '("no" "never")))
|
|
|
+ (export org-babel-exp-reference-buffer)
|
|
|
+ (eval-no-export (and export (member eval '("no-export" "never-export"))))
|
|
|
+ (noeval (or eval-no eval-no-export))
|
|
|
+ (query (or (equal eval "query")
|
|
|
+ (and export (equal eval "query-export"))
|
|
|
+ (if (functionp org-confirm-babel-evaluate)
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (nth 6 info))
|
|
|
+ (funcall org-confirm-babel-evaluate
|
|
|
+ ;; language, code block body
|
|
|
+ (nth 0 info) (nth 1 info)))
|
|
|
+ org-confirm-babel-evaluate))))
|
|
|
+ (cond
|
|
|
+ (noeval nil)
|
|
|
+ (query 'query)
|
|
|
+ (t t))))
|
|
|
+
|
|
|
+(defun org-babel-check-evaluate (info)
|
|
|
"Check if code block INFO should be evaluated.
|
|
|
-Do not query the user."
|
|
|
- (org-babel-check-confirm-evaluate info
|
|
|
- (not (when noeval
|
|
|
- (message "Evaluation of this%scode-block%sis disabled."
|
|
|
- code-block block-name)))))
|
|
|
|
|
|
- ;; dynamically scoped for asynchronous export
|
|
|
+Do not query the user, but do display an informative message if
|
|
|
+evaluation is blocked. Returns non-nil if evaluation is not blocked."
|
|
|
+ (let ((evalp (org-babel-check-confirm-evaluate info)))
|
|
|
+ (when (null evalp)
|
|
|
+ (message "Evaluation of this %s code-block%sis disabled."
|
|
|
+ (nth 0 info)
|
|
|
+ (let ((name (nth 4 info))) (if name (format " (%s) " name) ""))))
|
|
|
+ evalp))
|
|
|
+
|
|
|
+;; Dynamically scoped for asynchronous export.
|
|
|
(defvar org-babel-confirm-evaluate-answer-no)
|
|
|
|
|
|
-(defsubst org-babel-confirm-evaluate (info)
|
|
|
+(defun org-babel-confirm-evaluate (info)
|
|
|
"Confirm evaluation of the code block INFO.
|
|
|
|
|
|
-If the variable `org-babel-confirm-evaluate-answer-no' is bound
|
|
|
-to a non-nil value, auto-answer with \"no\".
|
|
|
-
|
|
|
This query can also be suppressed by setting the value of
|
|
|
`org-confirm-babel-evaluate' to nil, in which case all future
|
|
|
interactive code block evaluations will proceed without any
|
|
|
confirmation from the user.
|
|
|
|
|
|
Note disabling confirmation may result in accidental evaluation
|
|
|
-of potentially harmful code."
|
|
|
- (org-babel-check-confirm-evaluate info
|
|
|
- (not (when query
|
|
|
- (unless
|
|
|
- (and (not (org-bound-and-true-p
|
|
|
- org-babel-confirm-evaluate-answer-no))
|
|
|
- (yes-or-no-p
|
|
|
- (format "Evaluate this%scode block%son your system? "
|
|
|
- code-block block-name)))
|
|
|
- (message "Evaluation of this%scode-block%sis aborted."
|
|
|
- code-block block-name))))))
|
|
|
+of potentially harmful code.
|
|
|
+
|
|
|
+The variable `org-babel-confirm-evaluate-answer-no' is used by
|
|
|
+the async export process, which requires a non-interactive
|
|
|
+environment, to override this check."
|
|
|
+ (let* ((evalp (org-babel-check-confirm-evaluate info))
|
|
|
+ (lang (nth 0 info))
|
|
|
+ (name (nth 4 info))
|
|
|
+ (name-string (if name (format " (%s) " name) "")))
|
|
|
+ (pcase evalp
|
|
|
+ (`nil nil)
|
|
|
+ (`t t)
|
|
|
+ (`query (unless
|
|
|
+ (and (not (org-bound-and-true-p
|
|
|
+ org-babel-confirm-evaluate-answer-no))
|
|
|
+ (yes-or-no-p
|
|
|
+ (format "Evaluate this %s code block%son your system? "
|
|
|
+ lang name-string)))
|
|
|
+ (message "Evaluation of this %s code-block%sis aborted."
|
|
|
+ lang name-string)))
|
|
|
+ (x (error "Unexepcted value `%s' from `org-babel-check-confirm-evaluate'" x)))))
|
|
|
|
|
|
;;;###autoload
|
|
|
(defun org-babel-execute-safely-maybe ()
|