Browse Source

ob-core: file-mode option in source code block arguments

* ob-core.el (org-babel-execute-src-block): Source code block header
argument `:file-mode' can set file permissions if `:file' argument is
provided.
(org-babel-common-header-args-w-values): Add `:file-mode' to common
header arguments.

TINYCHANGE
John Herrlin 5 months ago
parent
commit
ea946353aa
4 changed files with 36 additions and 1 deletions
  1. 11 0
      doc/org-manual.org
  2. 5 0
      etc/ORG-NEWS
  3. 6 1
      lisp/ob-core.el
  4. 14 0
      testing/lisp/test-ob.el

+ 11 - 0
doc/org-manual.org

@@ -17444,6 +17444,17 @@ default behavior is to automatically determine the result type.
   TAB-delimited output.  You can choose a different separator with
   the =sep= header argument.
 
+  #+cindex: @samp{file-mode}, header argument
+  The =file-mode= header argument defines the file permissions.  To
+  make it executable, use =:file-mode (identity #o755)=.
+
+  #+begin_example
+  ,#+BEGIN_SRC shell :results file :file script.sh :file-mode (identity #o755)
+    echo "#!/bin/bash"
+    echo "echo Hello World"
+  ,#+END_SRC
+  #+end_example
+
 *** Format
 :PROPERTIES:
 :UNNUMBERED: notoc

+ 5 - 0
etc/ORG-NEWS

@@ -261,6 +261,11 @@ explicitly:
 In situations where ~org-return~ calls ~newline~, multiple newlines
 can now be inserted with this prefix argument.
 
+*** New source code block header argument =:file-mode=
+
+Source code block header argument =:file-mode= can set file
+permissions if =:file= argument is provided.
+
 ** New commands
 *** ~org-table-header-line-mode~
 

+ 6 - 1
lisp/ob-core.el

@@ -403,6 +403,7 @@ then run `org-babel-switch-to-session'."
     (file	. :any)
     (file-desc  . :any)
     (file-ext   . :any)
+    (file-mode  . ((#o755 #o555 #o444 :any)))
     (hlines	. ((no yes)))
     (mkdirp	. ((yes no)))
     (no-expand)
@@ -734,7 +735,11 @@ block."
 		    (with-temp-file file
 		      (insert (org-babel-format-result
 			       result
-			       (cdr (assq :sep params))))))
+			       (cdr (assq :sep params)))))
+		    ;; Set file permissions if header argument
+		    ;; `:file-mode' is provided.
+		    (when (assq :file-mode params)
+		      (set-file-modes file (cdr (assq :file-mode params)))))
 		  (setq result file))
 		;; Possibly perform post process provided its
 		;; appropriate.  Dynamically bind "*this*" to the

+ 14 - 0
testing/lisp/test-ob.el

@@ -1746,6 +1746,20 @@ line 1
 		   (cdr (assq :file (nth 2 (org-babel-get-src-block-info t))))))
     ))
 
+(ert-deftest test-ob/file-mode ()
+  "Ensure that :file-mode results in expected permissions."
+  (should
+   (equal #o755
+          (org-test-with-temp-text-in-file "
+#+begin_src emacs-lisp :results file :file t.sh :file-mode (identity #o755)
+nil
+#+end_src"
+            (org-babel-next-src-block)
+            (org-babel-execute-src-block)
+            (unwind-protect
+                (file-modes "t.sh")
+              (delete-file "t.sh"))))))
+
 (ert-deftest test-ob-core/dir-mkdirp ()
   "Test :mkdirp with :dir header combination."
   (should-not