From: Timothy <tecosaur@gmail.com> To: Org Mode List <emacs-orgmode@gnu.org> Subject: [PATCH] Accept more :tangle-mode specification forms Date: Fri, 01 Oct 2021 02:14:55 +0800 [thread overview] Message-ID: <875yuh9b3t.fsf@gmail.com> (raw) [-- Attachment #1: Type: text/plain, Size: 1191 bytes --] Hello, Currently, the only way to set a file mode when tangling seems to be :tangle-mode (identity #o755) In a [prior thread], Jeremy proposed that :tangle-mode should convert octal number strings to the required decimal form. I think we should go further, and so have prepared the attached patch based on a snippet I shared in the thread. To quote the docstring of the new function I’m introducing, this patch now accepts the following :tangle-mode forms: • an integer (returned without modification) • “#o755” (elisp-style octal) • “0755” (c style octal) • “755” (chmod style octal) • “rwxrw-r–” (ls style specification) • “a=rw,u+x” (chmod style) • “rwx” (interpreted as “u=rwx”) Why be so permissive? I’d refer you to my reasoning in the prior thread: I think there are a few arguably “sensible” formats that a user could reasonably assume, and if we can support most of them without introducing ambiguity in parsing or interpretation (and I think we can), can’t we make everyone happy? All the best, Timothy [prior thread] <https://list.orgmode.org/20210928145448.245883-1-jeremy@cowgar.com/> [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-tangle-Accept-more-tangle-mode-forms.patch --] [-- Type: text/x-patch, Size: 3691 bytes --] From 5087de0d70151c33d66eb13dda84d78a361d7053 Mon Sep 17 00:00:00 2001 From: TEC <tec@tecosaur.com> Date: Fri, 1 Oct 2021 02:02:22 +0800 Subject: [PATCH] ob-tangle: Accept more :tangle-mode forms * lisp/ob-tangle.el (org-babel-tangle): Accept many more forms for :tangle-mode, including octal strings (#o755, 0755, 755), ls forms (rwx, rw-r--r--), and chmod forms (a=rw,u+x). The interpretation of the input is now handled by the new function `org-babel-interpret-file-mode' which references the new variable `org-babel-tangle-default-mode' when considering relative mode forms. --- lisp/ob-tangle.el | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el index 2dd1d031c..28a235429 100644 --- a/lisp/ob-tangle.el +++ b/lisp/ob-tangle.el @@ -140,6 +140,14 @@ (defcustom org-babel-process-comment-text 'org-remove-indentation :version "24.1" :type 'function) +(defcustom org-babel-tangle-default-mode #o544 + "The default mode used for tangled files, as an integer. +The default value 356 correspands to the octal #o544, which is +read-write permissions for the user, read-only for everyone else." + :group 'org-babel + :version "9.6" + :type 'integer) + (defun org-babel-find-file-noselect-refresh (file) "Find file ensuring that the latest changes on disk are represented in the file." @@ -255,7 +263,7 @@ (defun org-babel-tangle (&optional arg target-file lang-re) (when she-bang (unless tangle-mode (setq tangle-mode #o755))) (when tangle-mode - (add-to-list 'modes tangle-mode)) + (add-to-list 'modes (org-babel-interpret-file-mode tangle-mode))) ;; Possibly create the parent directories for file. (let ((m (funcall get-spec :mkdirp))) (and m fnd (not (string= m "no")) @@ -298,6 +306,38 @@ (defun org-babel-tangle (&optional arg target-file lang-re) path-collector)) path-collector)))) +(defun org-babel-interpret-file-mode (mode) + "Determine the integer representation of a file MODE specification. +The following forms are currently recognised: +- an integer (returned without modification) +- \"#o755\" (elisp-style octal) +- \"0755\" (c style octal) +- \"755\" (chmod style octal) +- \"rwxrw-r--\" (ls style specification) +- \"a=rw,u+x\" (chmod style) * +- \"rwx\" (interpreted as \"u=rwx\") * + +* The interpretation of these forms relies on `file-modes-symbolic-to-number', + and uses `org-babel-tangle-default-mode' as the base mode." + (cond + ((integerp mode) mode) + ((not (stringp mode)) + (error "File mode %S not recognised as a valid format." mode)) + ((string-match-p "^0?[0-7][0-7][0-7]$" mode) + (string-to-number mode 8)) + ((string-match-p "^#o[0-7][0-7][0-7]$" mode) + (string-to-number (substring mode 2) 8)) + ((string-match-p "^[ugoa]*\\(?:[+-=][rwxXstugo]*\\)+\\(,[ugoa]*\\(?:[+-=][rwxXstugo]*\\)+\\)*$" mode) + (file-modes-symbolic-to-number mode org-babel-tangle-default-mode)) + ((string-match-p "^[rwx-]\\{3\\}$" mode) + (file-modes-symbolic-to-number (concat "u=" mode) org-babel-tangle-default-mode)) + ((string-match-p "^[rwx-]\\{9\\}$" mode) + (file-modes-symbolic-to-number (concat "u=" (substring mode 0 3) + ",g=" (substring mode 3 6) + ",a=" (substring mode 6 9)) + 0)) + (t (error "File mode %S not recognised as a valid format." mode)))) + (defun org-babel-tangle-clean () "Remove comments inserted by `org-babel-tangle'. Call this function inside of a source-code file generated by -- 2.33.0
next reply other threads:[~2021-09-30 18:23 UTC|newest] Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-09-30 18:14 Timothy [this message] 2021-10-01 1:24 ` Tom Gillespie 2021-10-01 6:59 ` Timothy 2021-10-01 8:00 ` Stefan Nobis 2021-10-01 10:05 ` Eric S Fraga 2021-10-01 10:29 ` tomas 2021-10-01 18:04 ` Tom Gillespie 2021-10-01 18:14 ` Timothy 2021-10-01 8:39 ` Christian Moe 2021-10-05 14:45 ` Timothy 2021-10-05 15:54 ` unknown@email.com 2021-10-05 16:13 ` Timothy 2021-10-05 16:06 ` tomas 2021-10-06 11:59 ` Max Nikulin 2021-11-18 10:20 ` Timothy 2021-11-18 17:22 ` Timothy 2021-11-18 23:33 ` Tom Gillespie 2021-11-19 16:31 ` Tim Cross 2021-11-19 18:10 ` tomas 2021-11-20 4:31 ` Greg Minshall 2021-11-20 8:08 ` Timothy 2021-11-20 12:25 ` tomas 2021-11-20 14:50 ` Timothy 2021-11-20 16:09 ` tomas 2021-11-20 21:32 ` Tim Cross 2021-11-21 4:08 ` Greg Minshall 2021-11-21 4:27 ` Timothy 2021-11-21 5:11 ` Greg Minshall 2021-11-20 19:49 ` Tim Cross 2021-11-21 4:02 ` Timothy 2021-11-21 13:51 ` Tim Cross 2021-11-21 14:33 ` Timothy 2021-11-29 18:57 ` Timothy
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=875yuh9b3t.fsf@gmail.com \ --to=tecosaur@gmail.com \ --cc=emacs-orgmode@gnu.org \ --subject='Re: [PATCH] Accept more :tangle-mode specification forms' \ /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
Code repositories for project(s) associated with this 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).