From aafdd41f7ae5f6218a2be890f58d45be443de4a9 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Sat, 2 Mar 2019 12:11:47 +0800 Subject: [PATCH] ob-core.el: Make :mkdirp work for :dir too * lisp/ob-core.el (org-babel-execute-src-block): make directory if :dir path does not exist when :mkdirp yes exist. * doc/org-manualo.rg (mkdirp): declare new change in manual. * etc/ORG-NEWS: declare changes in ORG-NEWS. * testing/lisp/test-ob.el: Add a specific testing file for ob-core.el, and add a testing for :mkdir yes work with :dir header argument usage. --- doc/org-manual.org | 7 ++++--- etc/ORG-NEWS | 6 ++++++ lisp/ob-core.el | 9 ++++++++- testing/lisp/test-ob.el | 8 ++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 00e5e1072..30c797ad7 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17476,9 +17476,10 @@ to source file(s). location. Example: =:tangle FILENAME=. #+cindex: @samp{mkdirp}, header argument -The =mkdirp= header argument creates parent directories for tangled -files if the directory does not exist. =yes= enables directory -creation and =no= inhibits directory creation. +The =mkdirp= header argument creates parent directories for =dir= +header argument specified path and tangled files if the directory does +not exist. =yes= enables directory creation and =no= inhibits +directory creation. #+cindex: @samp{comments}, header argument The =comments= header argument controls inserting comments into diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 057440a71..cd5e4d900 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -157,6 +157,12 @@ A call of ~org-set-tags-command~ with prefix argument C-u C-u avoids the fast tag selection interface and instead offers the plain interface. +*** ~:mkdirp~ now supports create directory for ~:dir~ path + +The ~:mkdirp~ header argument used to only work for ~:tangle~ tangle +files. Now ~:mkdirp~ works for ~:dir~ too. This is more convenient for +specify default directory and with ~:file~ header argument. + * Version 9.2 ** Incompatible changes *** Removal of OrgStruct mode mode and radio lists diff --git a/lisp/ob-core.el b/lisp/ob-core.el index e6f0edba5..c2b629bab 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -677,8 +677,15 @@ block." (replace-regexp-in-string (org-src-coderef-regexp coderef) "" expand nil nil 1)))) (dir (cdr (assq :dir params))) + (mkdirp (cdr (assq :mkdirp params))) (default-directory - (or (and dir (file-name-as-directory (expand-file-name dir))) + (or (and dir + ;; Possibly create the parent directories for file. + (let ((fnd (file-name-as-directory (expand-file-name dir)))) + (cond + ((member mkdirp '("yes" "t")) (make-directory fnd 'parents)) + ((member mkdirp '("no" "nil")) nil) + (t (make-directory fnd 'parents))))) default-directory)) (cmd (intern (concat "org-babel-execute:" lang))) result) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index 427c11c6d..33d6ae8f7 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -1607,6 +1607,14 @@ echo \"$data\" (cdr (assq :file (nth 2 (org-babel-get-src-block-info t)))))) )) +(ert-deftest test-ob-core/dir-mkdirp () + (org-test-with-temp-text + "#+begin_src sh :mkdirp yes :dir \"data/code\" +pwd +#+end_src" + (org-babel-execute-src-block)) + (should (file-directory-p "data/code"))) + (ert-deftest test-ob/script-escape () ;; Delimited lists of numbers (should (equal '(1 2 3) -- 2.21.0