From: Hraban Luyat <hraban@0brg.net>
To: emacs-orgmode@gnu.org
Subject: Re: [PATCH] ob-tangle.el: fix ‘:comments noweb’ double linking
Date: Wed, 10 Aug 2022 20:54:55 +0000 [thread overview]
Message-ID: <c6aa8623-852c-e5ff-5f10-d0752fd6ba66@0brg.net> (raw)
In-Reply-To: <tce5pq$ucr$1@ciao.gmane.io>
[-- Attachment #1: Type: text/plain, Size: 1729 bytes --]
On 8/3/22 11:55 AM, Max Nikulin wrote:
>> + (when bare
>> + (if (and org-babel-tangle-use-relative-file-links
>> + (string-match org-link-types-re bare)
>> + (string= (match-string 1 bare) "file"))
>> + (concat "file:"
>> + (file-relative-name (substring bare (match-end 0))
>> + (file-name-directory
>> + (cdr (assq :tangle params)))))
>
> Is there any problem with the following?
>
> (alist-get :tangle params)
This bit of code was moved, I didn't write it. The original code uses a
variable `src-tfile' which isn't available here, so I reused the
definition of that variable (which is (cdr (assq yada yada))). When
creating this patch, I tried to change as little as possible, to keep
everything the same as much as I can. Don't write new code, just move
existing code around.
The (cdr (assq ..)) is used in some other places, too; maybe it's worth
a separate refactor if we want to change that? I'd rather keep this
patch as isolated as possible.
>> + bare)))))
>
> I have not read the patch care carefully, so I may miss something. It
> seems that (when bare (if (and other...) (action) bare)) may be
> simplified to
>
> (and bare other... (action))
>
>
Do you mean to rewrite
(when bare (if x y bare))
to this?
(and bare x y)
If that's what you meant, I think it would evaluate differently if bare
= truthy and x = falsy, right? Form 1 evaluates to `bare', form 2
evaluates to x (i.e. NIL). Or did I misunderstand the suggestion?
@Ihor: I have rebased the patch and attached it.
[-- Attachment #2: 0001-ob-tangle.el-fix-comments-noweb-double-linking.patch --]
[-- Type: text/plain, Size: 8021 bytes --]
From 778558a5b0d38ee79d47b0068f68c761326e5e61 Mon Sep 17 00:00:00 2001
From: Hraban Luyat <hraban@0brg.net>
Date: Thu, 28 Jul 2022 22:32:08 -0400
Subject: [PATCH] =?UTF-8?q?ob-tangle.el:=20fix=20=E2=80=98:comments=20nowe?=
=?UTF-8?q?b=E2=80=99=20double=20linking?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* lisp/ob-tangle.el: Refactor the double implementation to a single
helper function. This avoids the double link wrapping.
* testing/lisp/test-ob-tangle.el: Add unit tests.
Babel tangle allows inserting comments at the tangled site which link
back to the source in the org file. This linking was implemented
twice, to handle separate cases, but when using â:comments nowebâ it
ended up going through both codepaths. This resulted in doubly
wrapped links.
By refactoring all link generation into a single function, this double
wrapping is avoided.
Example file, /tmp/test.org:
* Inner
#+name: inner
#+begin_src emacs-lisp
2
#+end_src
* Main
#+header: :tangle test.el :comments noweb :noweb yes
#+begin_src emacs-lisp
1
<<inner>>
#+end_src
Before:
;; [[file:test.org::*Main][Main:1]]
1
;; [[[[file:/tmp/test.org::inner][inner]]][inner]]
2
;; inner ends here
;; Main:1 ends here
After:
;; [[file:test.org::*Main][Main:1]]
1
;; [[file:test.org::inner][inner]]
2
;; inner ends here
;; Main:1 ends here
---
lisp/ob-tangle.el | 54 ++++++++++++++++----------------
testing/lisp/test-ob-tangle.el | 56 ++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+), 27 deletions(-)
diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el
index fdba72278..f85f07e70 100644
--- a/lisp/ob-tangle.el
+++ b/lisp/ob-tangle.el
@@ -469,6 +469,29 @@ code blocks by target file."
(mapcar (lambda (b) (cons (car b) (nreverse (cdr b))))
(nreverse blocks))))
+(defun org-babel-tangle--unbracketed-link (params)
+ "Get a raw link to the src block at point, without brackets.
+
+The PARAMS are the 3rd element of the info for the same src block."
+ (save-match-data
+ (let* (;; The created link is transient. Using ID is not necessary,
+ ;; but could have side-effects if used. An ID property may
+ ;; be added to existing entries thus creating unexpected file
+ ;; modifications.
+ (org-id-link-to-org-use-id nil)
+ (l (org-no-properties (org-store-link nil)))
+ (bare (and (string-match org-link-bracket-re l)
+ (match-string 1 l))))
+ (when bare
+ (if (and org-babel-tangle-use-relative-file-links
+ (string-match org-link-types-re bare)
+ (string= (match-string 1 bare) "file"))
+ (concat "file:"
+ (file-relative-name (substring bare (match-end 0))
+ (file-name-directory
+ (cdr (assq :tangle params)))))
+ bare)))))
+
(defun org-babel-tangle-single-block (block-counter &optional only-this-block)
"Collect the tangled source for current block.
Return the list of block attributes needed by
@@ -485,16 +508,7 @@ non-nil, return the full association list to be used by
(extra (nth 3 info))
(coderef (nth 6 info))
(cref-regexp (org-src-coderef-regexp coderef))
- (link (let* (
- ;; The created link is transient. Using ID is
- ;; not necessary, but could have side-effects if
- ;; used. An ID property may be added to
- ;; existing entries thus creatin unexpected file
- ;; modifications.
- (org-id-link-to-org-use-id nil)
- (l (org-no-properties (org-store-link nil))))
- (and (string-match org-link-bracket-re l)
- (match-string 1 l))))
+ (link (org-babel-tangle--unbracketed-link params))
(source-name
(or (nth 4 info)
(format "%s:%d"
@@ -548,15 +562,7 @@ non-nil, return the full association list to be used by
(if org-babel-tangle-use-relative-file-links
(file-relative-name file)
file)
- (if (and org-babel-tangle-use-relative-file-links
- (string-match org-link-types-re link)
- (string= (match-string 1 link) "file")
- (stringp src-tfile))
- (concat "file:"
- (file-relative-name (substring link (match-end 0))
- (file-name-directory
- src-tfile)))
- link)
+ link
source-name
params
(if org-src-preserve-indentation
@@ -574,18 +580,12 @@ non-nil, return the full association list to be used by
INFO, when non nil, is the source block information, as returned
by `org-babel-get-src-block-info'."
(let ((link-data (pcase (or info (org-babel-get-src-block-info 'light))
- (`(,_ ,_ ,_ ,_ ,name ,start ,_)
+ (`(,_ ,_ ,params ,_ ,name ,start ,_)
`(("start-line" . ,(org-with-point-at start
(number-to-string
(line-number-at-pos))))
("file" . ,(buffer-file-name))
- ("link" . ,(let (;; The created link is transient. Using ID is
- ;; not necessary, but could have side-effects if
- ;; used. An ID property may be added to
- ;; existing entries thus creatin unexpected file
- ;; modifications.
- (org-id-link-to-org-use-id nil))
- (org-no-properties (org-store-link nil))))
+ ("link" . ,(org-babel-tangle--unbracketed-link params))
("source-name" . ,name))))))
(list (org-fill-template org-babel-tangle-comment-format-beg link-data)
(org-fill-template org-babel-tangle-comment-format-end link-data))))
diff --git a/testing/lisp/test-ob-tangle.el b/testing/lisp/test-ob-tangle.el
index 2ed4ba0da..618e118e0 100644
--- a/testing/lisp/test-ob-tangle.el
+++ b/testing/lisp/test-ob-tangle.el
@@ -159,6 +159,62 @@ echo 1
(search-forward (concat "[file:" file) nil t)))
(delete-file "test-ob-tangle.el")))))
+(ert-deftest ob-tangle/comment-noweb-relative ()
+ "Test :comments noweb tangling with relative file paths."
+ (should
+ (org-test-with-temp-text-in-file
+ "* Inner
+#+name: inner
+#+begin_src emacs-lisp
+2
+#+end_src
+
+* Main
+#+header: :tangle \"test-ob-tangle.el\" :comments noweb :noweb yes
+#+begin_src emacs-lisp
+1
+<<inner>>
+#+end_src"
+ (unwind-protect
+ (let ((org-babel-tangle-use-relative-file-links t))
+ (org-babel-tangle)
+ (with-temp-buffer
+ (insert-file-contents "test-ob-tangle.el")
+ (buffer-string)
+ (goto-char (point-min))
+ (and
+ (search-forward (concat ";; [[file:" (file-name-nondirectory file) "::inner") nil t)
+ (search-forward ";; inner ends here" nil t))))
+ (delete-file "test-ob-tangle.el")))))
+
+(ert-deftest ob-tangle/comment-noweb-absolute ()
+ "Test :comments noweb tangling with absolute file path."
+ (should
+ (org-test-with-temp-text-in-file
+ "* Inner
+#+name: inner
+#+begin_src emacs-lisp
+2
+#+end_src
+
+* Main
+#+header: :tangle \"test-ob-tangle.el\" :comments noweb :noweb yes
+#+begin_src emacs-lisp
+1
+<<inner>>
+#+end_src"
+ (unwind-protect
+ (let ((org-babel-tangle-use-relative-file-links nil))
+ (org-babel-tangle)
+ (with-temp-buffer
+ (insert-file-contents "test-ob-tangle.el")
+ (buffer-string)
+ (goto-char (point-min))
+ (and
+ (search-forward (concat ";; [[file:" file "::inner") nil t)
+ (search-forward ";; inner ends here" nil t))))
+ (delete-file "test-ob-tangle.el")))))
+
(ert-deftest ob-tangle/jump-to-org ()
"Test `org-babel-tangle-jump-to-org' specifications."
;; Standard test.
--
2.36.1
next prev parent reply other threads:[~2022-08-10 20:56 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-29 4:54 [PATCH] ob-tangle.el: fix ‘:comments noweb’ double linking Hraban Luyat
2022-07-30 4:56 ` Ihor Radchenko
2022-07-30 23:42 ` Hraban Luyat
2022-08-03 11:40 ` Ihor Radchenko
2022-08-03 15:55 ` Max Nikulin
2022-08-10 20:54 ` Hraban Luyat [this message]
2022-08-11 4:26 ` Ihor Radchenko
2022-08-12 2:21 ` Hraban Luyat
2022-08-12 13:16 ` Max Nikulin
2022-08-13 6:42 ` Ihor Radchenko
2022-08-13 8:06 ` Max Nikulin
2022-08-14 3:20 ` Ihor Radchenko
2022-08-13 6:40 ` Ihor Radchenko
2022-08-11 15:00 ` Max Nikulin
2022-08-03 11:31 ` Bastien Guerry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c6aa8623-852c-e5ff-5f10-d0752fd6ba66@0brg.net \
--to=hraban@0brg.net \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).