[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[BUG] ob-tangle.el: Blocks overwrite each other when grouping before tan
From: |
Evgenii Klimov |
Subject: |
[BUG] ob-tangle.el: Blocks overwrite each other when grouping before tangling |
Date: |
Wed, 12 Jul 2023 21:59:01 +0100 |
Hi, I noticed that during grouping of blocks to tangle some of them can
overwrite each other if they have the same target file, but in different
format (relative vs absolute).
Consider this example (part of example.org file in the attachment):
* 1st explicit :tangle yes
#+begin_src emacs-lisp :tangle yes
"1st explicit :tangle yes"
#+end_src
* 1st implicit default
#+begin_src emacs-lisp
"1st implicit :tangle no"
#+end_src
If we call `org-babel-tangle-file' with target-file arg equal to
"/path/to/example.el" (e.g. `org-babel-load-file' does that), then
target file name for the first block will be "example.el" and
"/path/to/example.el" for the second block. It appears to be crucial in
`org-babel-tangle-collect-blocks' [1]:
;; `org-babel-map-src-blocks' runs this part on each source block
(let* ((block (org-babel-tangle-single-block counter))
(src-tfile (cdr (assq :tangle (nth 4 block))))
(file-name (org-babel-effective-tangled-filename
(nth 1 block) src-lang src-tfile))
(by-fn (assoc file-name blocks)))
(if by-fn (setcdr by-fn (cons (cons src-lang block) (cdr by-fn)))
(push (cons file-name (list (cons src-lang block))) blocks)))
Current implementation of `org-babel-effective-tangled-filename' returns
relative file name if :tangle is "yes" or relative FILENAME. But if
:tangle happened to be absolute (as `org-babel-load-file' does), then
blocks with the same file name but one name is relative while the other is
absolute, will be treated as different and won't be group (see last tree
lines of code above).
As a result when blocks are returned to `org-babel-tangle' [2] one group
will overwrite the previous one, since their absolute file names are
equal.
I noticed two scenarious where such things happen (e.g. if running
`org-babel-tangle-file'):
- if target-file arg is equal to one of :tangle FILENAMEs and some
blocks don't have :tangle argument, while other have :tangle
FILENAME. As a result one of these groups will be lost.
- if target-file arg is equal to tangled original Org file and some
blocks don't have :tangle argument, while other have :tangle
"yes". As a result one of these groups will also be lost.
I attach example Org file and scratch code to reproduce both scenarious.
[1] [[file:lisp/ob-tangle.el::(file-name
(org-babel-effective-tangled-filename][target file-name]]
[2] [[file:lisp/ob-tangle.el::org-babel-tangle-collect-blocks lang-re
tangle-file))][blocks return]]
example.org
Description: example Org file
scratch.el
Description: scratch code to reproduce the bug
- [BUG] ob-tangle.el: Blocks overwrite each other when grouping before tangling,
Evgenii Klimov <=
- [PATCH] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Evgenii Klimov, 2023/07/12
- [PATCH v2] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Evgenii Klimov, 2023/07/13
- Re: [PATCH v2] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Ihor Radchenko, 2023/07/14
- [PATCH v3] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Evgenii Klimov, 2023/07/24
- Re: [PATCH v3] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Ihor Radchenko, 2023/07/25
- [PATCH v4] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Evgenii Klimov, 2023/07/25
- Re: [PATCH v4] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Ihor Radchenko, 2023/07/26
- [PATCH v5] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Evgenii Klimov, 2023/07/26
- Re: [PATCH v5] ob-tangle.el: Blocks overwrite each other when grouping before tangling, Ihor Radchenko, 2023/07/28