emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org ef23b4706b: org-babel-tangle: Do not allow tangling


From: ELPA Syncer
Subject: [elpa] externals/org ef23b4706b: org-babel-tangle: Do not allow tangling into self
Date: Fri, 26 Jan 2024 12:58:18 -0500 (EST)

branch: externals/org
commit ef23b4706b40401e0212716291b507a1a876d118
Author: Ihor Radchenko <yantar92@posteo.net>
Commit: Ihor Radchenko <yantar92@posteo.net>

    org-babel-tangle: Do not allow tangling into self
    
    * lisp/ob-tangle.el (org-babel-tangle): Throw an error when trying to
    tangle into the org file we tangle from.
    * etc/ORG-NEWS (It is no longer allowed to tangle into the same file
    as Org source): Document the breaking change.
    * testing/lisp/test-ob-tangle.el (ob-tangle/tangle-to-self): New test.
---
 etc/ORG-NEWS                   | 12 ++++++++++++
 lisp/ob-tangle.el              | 10 +++++++++-
 testing/lisp/test-ob-tangle.el | 14 ++++++++++++++
 3 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 6f94c4877a..1bf7eb5b42 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -13,6 +13,18 @@ Please send Org bug reports to mailto:emacs-orgmode@gnu.org.
 
 * Version 9.7 (not released yet)
 ** Important announcements and breaking changes
+*** It is no longer allowed to tangle into the same file as Org source
+
+Previously, =file.org= with the following contents
+
+: #+begin_src org :tangle file.org
+: Text
+: #+end_src
+
+would overwrite itself.
+
+Now, an error is thrown.
+
 *** iCalendar export now supports multiline =SUMMARY=, =LOCATION=, and 
=DESCRIPTION= properties
 
 Previously, it was not possible to specify multi-line location,
diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el
index 72089a9a59..281ab13d44 100644
--- a/lisp/ob-tangle.el
+++ b/lisp/ob-tangle.el
@@ -256,7 +256,8 @@ matching a regular expression."
             (when (equal arg '(16))
               (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)
+           path-collector
+            (source-file buffer-file-name))
        (mapc ;; map over file-names
         (lambda (by-fn)
           (let ((file-name (car by-fn)))
@@ -313,6 +314,13 @@ matching a regular expression."
                                       (compare-buffer-substrings
                                        nil nil nil
                                        tangle-buf nil nil)))))))
+                     (when (equal (if (file-name-absolute-p file-name)
+                                      file-name
+                                    (expand-file-name file-name))
+                                  (if (file-name-absolute-p source-file)
+                                      source-file
+                                    (expand-file-name source-file)))
+                       (error "Not allowed to tangle into the same file as 
self"))
                      ;; We do not erase, but overwrite previous file
                      ;; to preserve any existing symlinks.
                     (write-region nil nil file-name)
diff --git a/testing/lisp/test-ob-tangle.el b/testing/lisp/test-ob-tangle.el
index 22d88c38fb..7054136984 100644
--- a/testing/lisp/test-ob-tangle.el
+++ b/testing/lisp/test-ob-tangle.el
@@ -553,6 +553,20 @@ another block
                     (org-split-string (buffer-string))))
               (delete-file file))))))
 
+(ert-deftest ob-tangle/tangle-to-self ()
+  "Do not allow tangling into self."
+  (let ((file (make-temp-file "org-tangle-" nil ".org")))
+    (unwind-protect
+        (with-current-buffer (find-file-noselect file)
+          (insert
+           (format "
+#+begin_src elisp :tangle %s
+2
+#+end_src
+" file))
+          (should-error (org-babel-tangle)))
+      (delete-file file))))
+
 (ert-deftest ob-tangle/detangle-false-positive ()
   "Test handling of false positive link during detangle."
   (let (buffer)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]