OK, after some debugging it looks like the primary culprit is the assignment of source-file from buffer-file-name. A quick patch seems to fix it, but I can definitely see a pattern here if org functions are trying to get the filename of the current buffer (I can submit an official patch if this looks right):

modified   lisp/ob-tangle.el
@@ -269,7 +269,7 @@ matching a regular expression."
        (or (cdr (assq :tangle (nth 2 (org-babel-get-src-block-info 'no-eval))))
    (user-error "Point is not in a source code block"))))
     path-collector
-            (source-file buffer-file-name))
+            (source-file (buffer-file-name (buffer-base-buffer))))
  (mapc ;; map over file-names
  (lambda (by-fn)
    (let ((file-name (car by-fn)))

There are 339 uses of buffer-file-name that I can find, but most are just bare (buffer-file-name). Are there any other cases besides indirect buffers that we would need to handle? Would it be worth creating a new function "org-buffer-file-name" that could properly handle indirect buffers and any other special cases, or is it just a search and replace throughout?

Cheers,

Derek

On Tue, Dec 10, 2024 at 11:05 AM Ihor Radchenko <yantar92@posteo.net> wrote:
Derek Chen-Becker <derek@chen-becker.org> writes:

> I would be happy to work with you on this if you're interested in
> collaborating on it. I'm a little concerned with the scope, given that Ihor
> said: "We should probably fix handling indirect buffers across Org mode".
> I'm not sure how extensive indirect buffer handling is across Org, or if
> it's even consistent across Org right now. I'll probably need some help
> from people more familiar with it to figure out a starting point, but I'm
> excited to take a look :)

You do not need to address the whole thing at once. Start by trying to
fix the exact bug described:

1. Try to reproduce it locally
2. Find which part of Org code is causing the problem (you can use
   edebug, M-x debug-on-entry, or modifying the code with (message ...)
   or (debug) statements directly - remember that you can re-define
   functions on the fly in Elisp)
3. Try to fix it

I wrote about "across Org mode" because my quick debugging revealed that
the problematic code might be a pattern we use in various places in
Org. So, the whole Org code base should be carefully scanned to see if
we can fix the same problem in more places.

Such scanning usually starts from trying to regexp search code similar
to the problematic piece. In this case, AFAIR, it is simply usage of
`buffer-file-name' or `buffer-file-truename' assuming that it is never
nil.

It is also good for you that the original bug reporter is around. Having
someone else familiar with the problem might make things easier when you
cooperate together.

--
Ihor Radchenko // yantar92,
Org mode maintainer,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


--
+---------------------------------------------------------------+
| Derek Chen-Becker                                             |
| GPG Key available at https://keybase.io/dchenbecker and       |
| https://pgp.mit.edu/pks/lookup?search=derek%40chen-becker.org |
| Fngrprnt: EB8A 6480 F0A3 C8EB C1E7  7F42 AFC5 AFEE 96E4 6ACC  |
+---------------------------------------------------------------+