Lei Zhe <lzhe...@gmail.com> writes:

>> I'd rather avoid such non-deterministic return value.
>> Having different return values depending on the :tangle parameter is,
>> IMHO, not the best design. I'd rather go with my idea of adding a new
>> optional argument that will turn on the new return value convention and
>> fall back to legacy by default.

> I agree with what you suggested. However, I’m currently struggling to
> implement it in a way that cleanly addresses a couple of issues:
> 1. When `only-this-block' is nil and :tangle has multiple targets, the
> link in the return result becomes ambiguous.

It is ambiguous even when only-this-block is non-nil -
`org-babel-tangle--unbracketed-link' uses :tangle value directly,
assuming that it is a path to tangled file.

> 2. As I mentioned, I'm unsure how to handle the output of
> org-babel-tangle--unbracketed-link for its use in
> org-babel-tangle-comment-links.
> I'm open to suggestions.

`org-babel-tangle-comment-links' is used in
`org-babel-expand-noweb-references', which, in turn, is called by
`org-babel-tangle-single-block'.

That's complicated...

I think that the root problem here is
`org-babel-tangle--unbracketed-link' trying to account for
`org-babel-tangle-use-relative-file-links'. If not this,
`org-babel-tangle--unbracketed-link' would not care about :tangle
parameter.

The easiest solution is thus getting rid of the
`org-babel-tangle-use-relative-file-links' branch in
`org-babel-tangle--unbracketed-link'.

Instead, we can handle `org-babel-tangle-use-relative-file-links' in
`org-babel-tangle-single-block' itself, post-processing the link there.
Then, we can, say, store the processed link in PARAMS as
:ob-tangle--link when calling `org-babel-expand-noweb-references' and
make `org-babel-tangle-comment-links' check for :ob-tangle--link
parameter instead of calling `org-babel-tangle--unbracketed-link' to
generate the link.

Does it make sense?

> +(defun org-babel-tangle--concat-targets (buffer-fn info)
> +  "Compute the list of target file paths for tangling a source block.
> +The BUFFER-FN is the absolute file name of the buffer, INFO the source
> + block information, as returned by `org-babel-get-src-block-info'."
> +  (let* ((params (nth 2 info))
> +         (src-lang (nth 0 info))
> +         (src-tdirectories (cdr (assq :tangle-directory params)))
> +      (src-tfiles (cdr (assq :tangle params))))
> +    (unless (or (not src-tdirectories)
> +                (consp src-tdirectories))
> +      (setq src-tdirectories (list src-tdirectories)))

You can just use `ensure-list' here.

> +    (unless (consp src-tfiles)
> +      (setq src-tfiles
> +            (list (cond ((string= src-tfiles "yes")
> +                         (file-name-nondirectory
> +                          (org-babel-effective-tangled-filename buffer-fn 
> src-lang src-tfiles)))
> +                        ((string= src-tfiles "no") nil)
> +                        (t src-tfiles)))))
> +    (when (and src-tdirectories
> +               (not (equal src-tfiles '(nil))))

'(nil) looks fishy. Are you sure that it is right?

> +      (setq src-tfiles
> +            (apply 'append
> +                   (mapcar (lambda (src-tdirectory)
> +                             (mapcar (lambda (src-tfile)
> +                                       (expand-file-name src-tfile 
> src-tdirectory))
> +                                     src-tfiles))
> +                           src-tdirectories))))

This may be problematic if src-tfiles contains absolute paths.
You will get duplicates.
Also, src-tdirectory might contain duplicates.

-- 
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>

Reply via email to