From 1a4f76960cf11fb192f2bee2cdc8778c7b897f1a Mon Sep 17 00:00:00 2001 From: Evgenii Klimov Date: Wed, 12 Jul 2023 19:24:48 +0100 Subject: [PATCH v2] ob-tangle.el: Avoid relative file names when grouping blocks to tangle * lisp/ob-tangle.el (org-babel-effective-tangled-filename): Avoid using relative file names that could cause one block to overwrite the others in `org-babel-tangle-collect-blocks' if they have the same target file but in different formats. (org-babel-tangle-file, org-babel-tangle): Clarify the meaning of the TARGET-FILE argument. --- lisp/ob-tangle.el | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el index 25129616f..1274d0db7 100644 --- a/lisp/ob-tangle.el +++ b/lisp/ob-tangle.el @@ -194,11 +194,12 @@ evaluating BODY." ;;;###autoload (defun org-babel-tangle-file (file &optional target-file lang-re) - "Extract the bodies of source code blocks in FILE. + "Extract the bodies of source code blocks from FILE. Source code blocks are extracted with `org-babel-tangle'. Optional argument TARGET-FILE can be used to specify a default -export file for all source blocks. +export file for all source blocks without :tangle header +argument. Optional argument LANG-RE can be used to limit the exported source code blocks by languages matching a regular expression. @@ -230,9 +231,10 @@ With one universal prefix argument, only tangle the block at point. When two universal prefix arguments, only tangle blocks for the tangle file of the block at point. Optional argument TARGET-FILE can be used to specify a default -export file for all source blocks. Optional argument LANG-RE can -be used to limit the exported source code blocks by languages -matching a regular expression." +export file for all source blocks without :tangle header +argument. Optional argument LANG-RE can be used to limit the +exported source code blocks by languages matching a regular +expression." (interactive "P") (run-hooks 'org-babel-pre-tangle-hook) ;; Possibly Restrict the buffer to the current code block @@ -427,17 +429,23 @@ that the appropriate major-mode is set. SPEC has the form: org-babel-tangle-comment-format-end link-data))))) (defun org-babel-effective-tangled-filename (buffer-fn src-lang src-tfile) - "Return effective tangled filename of a source-code block. + "Return effective tangled absolute filename of a source-code block. BUFFER-FN is the name of the buffer, SRC-LANG the language of the block and SRC-TFILE is the value of the :tangle header argument, as computed by `org-babel-tangle-single-block'." - (let ((base-name (cond - ((string= "yes" src-tfile) - ;; Use the buffer name - (file-name-sans-extension buffer-fn)) - ((string= "no" src-tfile) nil) - ((> (length src-tfile) 0) src-tfile))) - (ext (or (cdr (assoc src-lang org-babel-tangle-lang-exts)) src-lang))) + (let* ((fnd (file-name-directory (buffer-file-name + (get-buffer buffer-fn)))) + (base-name (cond + ((string= "yes" src-tfile) + ;; Use the buffer name + (file-name-concat fnd + (file-name-sans-extension buffer-fn))) + ((string= "no" src-tfile) nil) + ((> (length src-tfile) 0) + (if (file-name-directory src-tfile) + src-tfile + (file-name-concat fnd src-tfile))))) + (ext (or (cdr (assoc src-lang org-babel-tangle-lang-exts)) src-lang))) (when base-name ;; decide if we want to add ext to base-name (if (and ext (string= "yes" src-tfile)) -- 2.34.1