* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode @ 2017-08-04 12:32 Tino Calancha 2017-08-16 11:43 ` Tino Calancha 2019-06-24 20:35 ` Lars Ingebrigtsen 0 siblings, 2 replies; 18+ messages in thread From: Tino Calancha @ 2017-08-04 12:32 UTC (permalink / raw) To: 27952; +Cc: stefan monnier Severity: wishlist Tag: patch X-Debbugs-CC: Stefan Monnier <monnier@iro.umontreal.ca> These functions are almost identical; archive-int-to-mode has a FIXME suggesting merging it with tar-grind-file-mode. --8<-----------------------------cut here---------------start------------->8--- commit c6d36b04de7f6442653af7e4699bdad44ee57201 Author: Tino Calancha <tino.calancha@gmail.com> Date: Fri Aug 4 21:25:44 2017 +0900 Combine archive-int-to-mode and tar-grind-file-mode These functions are almost identical. Add a new function file-modes-number-to-symbolic; use it to define the other two. * lisp/files.el (file-modes-number-to-symbolic-1) (file-modes-number-to-symbolic): New defuns. * lisp/arc-mode.el (archive-int-to-mode): Define as a alias of file-modes-number-to-symbolic. * lisp/tar-mode.el (tar-grind-file-mode): Fix docstring. Use file-modes-number-to-symbolic. diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index bd7548b704..8f3691b337 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -549,26 +549,7 @@ archive-l-e (aref str (- len i))))) result)) -(defun archive-int-to-mode (mode) - "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------." - ;; FIXME: merge with tar-grind-file-mode. - (string - (if (zerop (logand 8192 mode)) - (if (zerop (logand 16384 mode)) ?- ?d) - ?c) ; completeness - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 64 mode)) - (if (zerop (logand 1024 mode)) ?- ?S) - (if (zerop (logand 1024 mode)) ?x ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 8 mode)) - (if (zerop (logand 2048 mode)) ?- ?S) - (if (zerop (logand 2048 mode)) ?x ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 1 mode)) ?- ?x))) +(defalias 'archive-int-to-mode 'file-modes-number-to-symbolic) (defun archive-calc-mode (oldmode newmode &optional error) "From the integer OLDMODE and the string NEWMODE calculate a new file mode. diff --git a/lisp/files.el b/lisp/files.el index 89f6f9f44d..e776b00b91 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -7188,6 +7188,65 @@ file-modes-symbolic-to-number (error "Parse error in modes near `%s'" (substring modes 0)))) num-modes))) +(defun file-modes-number-to-symbolic-1 (mode) + (string + (if (zerop (logand 8192 mode)) + (if (zerop (logand 16384 mode)) ?- ?d) + ?c) ; completeness + (if (zerop (logand 256 mode)) ?- ?r) + (if (zerop (logand 128 mode)) ?- ?w) + (if (zerop (logand 64 mode)) + (if (zerop (logand 1024 mode)) ?- ?S) + (if (zerop (logand 1024 mode)) ?x ?s)) + (if (zerop (logand 32 mode)) ?- ?r) + (if (zerop (logand 16 mode)) ?- ?w) + (if (zerop (logand 8 mode)) + (if (zerop (logand 2048 mode)) ?- ?S) + (if (zerop (logand 2048 mode)) ?x ?s)) + (if (zerop (logand 4 mode)) ?- ?r) + (if (zerop (logand 2 mode)) ?- ?w) + (if (zerop (logand 1 mode)) ?- ?x))) + +(defun file-modes-number-to-symbolic (mode &optional detailed from) + "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------. +If optional arg DETAILED is non-nil, then use the format 'u=rwx,g=,o='. +If optional argument FROM is non-nil, then it's the original file mode + to compare with MODE. FROM is ignored unless DETAILED is non-nil. + +For instance, if MODE is 448, DETAILED is non-nil, and FROM is 400, +the output is 'u+x,g-w'." + (let ((mode (file-modes-number-to-symbolic-1 mode)) + (from (and from (substring (file-modes-number-to-symbolic-1 from) 1)))) + (if (not detailed) + mode + (setq mode (substring mode 1)) + (cond (from + (let ((res "u")) + (dotimes (i (length mode)) + (let ((x (aref mode i)) + (y (aref from i))) + (when (= i 3) (setq res (concat res ",g"))) + (when (= i 6) (setq res (concat res ",o"))) + (setq res (concat res + (cond ((eq x y) "") + ((eq x ?-) (string ?- y)) + ((eq y ?-) (string ?+ x))))))) + (replace-regexp-in-string + ",\\'" "" + (replace-regexp-in-string + "u," "" + (replace-regexp-in-string + "g," "" + (replace-regexp-in-string + "o\\'" "" res)))))) + (t + (replace-regexp-in-string + "-" "" + (format "u=%s,g=%s,o=%s" + (substring mode 0 3) + (substring mode 3 6) + (substring mode 6)))))))) + (defun read-file-modes (&optional prompt orig-file) "Read file modes in octal or symbolic notation and return its numeric value. PROMPT is used as the prompt, default to \"File modes (octal or symbolic): \". diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index 1d453d2980..f41cc25532 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -469,24 +469,12 @@ tar-clip-time-string (concat " " (substring str 4 16) (format-time-string " %Y" time)))) (defun tar-grind-file-mode (mode) - "Construct a `-rw--r--r--' string indicating MODE. + "Construct a `rw-r--r--' string indicating MODE. MODE should be an integer which is a file mode value." - (string - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 2048 mode)) - (if (zerop (logand 64 mode)) ?- ?x) - (if (zerop (logand 64 mode)) ?S ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 1024 mode)) - (if (zerop (logand 8 mode)) ?- ?x) - (if (zerop (logand 8 mode)) ?S ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 512 mode)) - (if (zerop (logand 1 mode)) ?- ?x) - (if (zerop (logand 1 mode)) ?T ?t)))) + (let ((str (substring (file-modes-number-to-symbolic mode) 1))) + (unless (zerop (logand 512 mode)) + (aset mode 8 (if (zerop (logand 1 mode)) ?T ?t))) + str)) (defun tar-header-block-summarize (tar-hblock &optional mod-p) "Return a line similar to the output of `tar -vtf'." --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.11) of 2017-08-04 Repository revision: db5d38ddb0de83d8f920b7a128fe3fd5156fdf85 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-04 12:32 bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode Tino Calancha @ 2017-08-16 11:43 ` Tino Calancha 2017-08-16 12:00 ` npostavs 2017-08-16 12:08 ` Andreas Schwab 2019-06-24 20:35 ` Lars Ingebrigtsen 1 sibling, 2 replies; 18+ messages in thread From: Tino Calancha @ 2017-08-16 11:43 UTC (permalink / raw) To: 27952; +Cc: stefan monnier Tino Calancha <tino.calancha@gmail.com> writes: > These functions are almost identical; archive-int-to-mode has a FIXME > suggesting merging it with tar-grind-file-mode. *) Updated the patch after Bug#28092 has being fixed. **) Now `archive-int-to-mode' also shows the sticky bit info as `tar-grind-file-mode' does: (archive-int-to-mode 996) => "-rwxr--r-T" (archive-int-to-mode 997) => "-rwxr--r-t" (tar-grind-file-mode 996) => "rwxr--r-T" (tar-grind-file-mode 997) => "rwxr--r-t" ;; `archive-int-to-mode' already was showing the 's' bit info, so ;; the fact that wasn't showing the sticky bit must be a mistake. ***) Added new tests. Please, let me know if you want to have this patch in. Tino --8<-----------------------------cut here---------------start------------->8--- commit 74d1a07379a88f62fdb0e497111fdf4845723806 Author: Tino Calancha <tino.calancha@gmail.com> Date: Wed Aug 16 20:23:34 2017 +0900 Combine archive-int-to-mode and tar-grind-file-mode These functions are almost identical. Extract a new function 'file-modes-number-to-symbolic' from them; use it to define 'archive-int-to-mode' and 'tar-grind-file-mode' (Bug#27952). * lisp/files.el (file-modes-number-to-symbolic-1): New defun extracted from 'archive-int-to-mode' and 'tar-grind-file-mode'. (file-modes-number-to-symbolic): New defun; like `file-modes-number-to-symbolic-1' with 2 optional arguments: 'detailed' and 'from'. * lisp/tar-mode.el (tar-grind-file-mode) * lisp/arc-mode.el (archive-int-to-mode): Use file-modes-number-to-symbolic in its definition. * test/lisp/arc-mode-tests.el (arc-mode-test-archive-int-to-mode): Update test. * test/lisp/files-tests.el (file-modes-symbolic-to-number) (file-modes-number-to-symbolic) (file-modes-number-to-symbolic-inverse): Add tests. diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index 938c143b8e..c1987ee774 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -550,25 +550,10 @@ archive-l-e result)) (defun archive-int-to-mode (mode) - "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------." - ;; FIXME: merge with tar-grind-file-mode. - (string - (if (zerop (logand 8192 mode)) - (if (zerop (logand 16384 mode)) ?- ?d) - ?c) ; completeness - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 64 mode)) - (if (zerop (logand 2048 mode)) ?- ?S) - (if (zerop (logand 2048 mode)) ?x ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 8 mode)) - (if (zerop (logand 1024 mode)) ?- ?S) - (if (zerop (logand 1024 mode)) ?x ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 1 mode)) ?- ?x))) + "Construct a `-rw-r--r--' string indicating MODE. +MODE should be an integer which is a file mode value. +For instance, if mode is 448, then it produces `-rwx------'." + (file-modes-number-to-symbolic mode)) (defun archive-calc-mode (oldmode newmode &optional error) "From the integer OLDMODE and the string NEWMODE calculate a new file mode. diff --git a/lisp/files.el b/lisp/files.el index b05d453b0e..664ea943d9 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -7143,6 +7143,95 @@ file-modes-rights-to-number op char-right))) num-rights)) +(defun file-modes-number-to-symbolic-1 (mode) + (string + (if (zerop (logand 8192 mode)) + (if (zerop (logand 16384 mode)) ?- ?d) + ?c) ; completeness + (if (zerop (logand 256 mode)) ?- ?r) + (if (zerop (logand 128 mode)) ?- ?w) + (if (zerop (logand 64 mode)) + (if (zerop (logand 2048 mode)) ?- ?S) + (if (zerop (logand 2048 mode)) ?x ?s)) + (if (zerop (logand 32 mode)) ?- ?r) + (if (zerop (logand 16 mode)) ?- ?w) + (if (zerop (logand 8 mode)) + (if (zerop (logand 1024 mode)) ?- ?S) + (if (zerop (logand 1024 mode)) ?x ?s)) + (if (zerop (logand 4 mode)) ?- ?r) + (if (zerop (logand 2 mode)) ?- ?w) + (if (zerop (logand 512 mode)) + (if (zerop (logand 1 mode)) ?- ?x) + (if (zerop (logand 1 mode)) ?T ?t)))) + +(defun file-modes-number-to-symbolic (mode &optional detailed from) + "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------. +If optional arg DETAILED is non-nil, then use the format 'u=rwx,g=,o='. +If optional argument FROM is non-nil, then it's the original file mode + to compare with MODE. FROM is ignored unless DETAILED is non-nil. + +For instance, if MODE is 448, DETAILED is non-nil, and FROM is 400, +the output is 'u+x,g-w'. + +Note: This is not the inverse of `file-modes-symbolic-to-number'; +The reason is that this function might return an string containing 'S' +or 'T' i.e., not valid characters for `file-modes-symbolic-to-number'. +For example, (file-modes-symbolic-to-number \"o=t\") returns 512; +and (file-modes-number-to-symbolic 512 t) returns \"o=T\"." + (let ((mode (file-modes-number-to-symbolic-1 mode)) + (from (and from (substring (file-modes-number-to-symbolic-1 from) 1)))) + (if (not detailed) + mode + (let ((replace-fn (lambda (x) + (replace-regexp-in-string + ",\\`" "" + (replace-regexp-in-string + "u=," "" + (replace-regexp-in-string + "g=," "" + (replace-regexp-in-string + "o=\\'" "" x))))))) + (setq mode (substring mode 1)) + (cond (from + (let* ((res "u") + (special-bit-fn (lambda (x y c C &optional inv) ; c or C in (x y) + (cond ((eq x c) ; xc + (cond ((eq y ?-) (string (if inv ?- ?+) ?x c)) + ((eq y ?x) (string (if inv ?- ?+) c)) + ((eq y C) (string (if inv ?- ?+) ?x)))) + ((eq x C) ; just c + (cond ((eq y ?-) (string (if inv ?- ?+) c)) + ((eq y ?x) (if inv (string ?+ ?x c) (string ?- ?x ?+ c))) + ((eq y c) (string (if inv ?+ ?-) ?x)))) + (t nil)))) + (compare-fn (lambda (x y) + (cond ((eq x y) "") + ;; sticky bit or setuid setgid changes. + ((or (eq x ?t) (eq x ?T) (eq y ?t) (eq y ?T) + (eq x ?s) (eq x ?S) (eq y ?s) (eq y ?S)) + (if (or (eq x ?t) (eq x ?T) (eq y ?t) (eq y ?T)) + (or (funcall special-bit-fn x y ?t ?T) + (funcall special-bit-fn y x ?t ?T 'inv)) + (or (funcall special-bit-fn x y ?s ?S) + (funcall special-bit-fn y x ?s ?S 'inv)))) + ((eq x ?-) (string ?- y)) + ((eq y ?-) (string ?+ x)))))) + (dotimes (i (length mode)) + (let ((x (aref mode i)) + (y (aref from i))) + (when (= i 3) (setq res (concat res ",g"))) + (when (= i 6) (setq res (concat res ",o"))) + (setq res (concat res (funcall compare-fn x y))))) + (funcall replace-fn res))) + (t + (funcall replace-fn + (replace-regexp-in-string + "-" "" + (format "u=%s,g=%s,o=%s" + (substring mode 0 3) + (substring mode 3 6) + (substring mode 6)))))))))) + (defun file-modes-symbolic-to-number (modes &optional from) "Convert symbolic file modes to numeric file modes. MODES is the string to convert, it should match diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index b0d3177694..1843cfcc4a 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -470,23 +470,9 @@ tar-clip-time-string (defun tar-grind-file-mode (mode) "Construct a `rw-r--r--' string indicating MODE. -MODE should be an integer which is a file mode value." - (string - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 2048 mode)) - (if (zerop (logand 64 mode)) ?- ?x) - (if (zerop (logand 64 mode)) ?S ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 1024 mode)) - (if (zerop (logand 8 mode)) ?- ?x) - (if (zerop (logand 8 mode)) ?S ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 512 mode)) - (if (zerop (logand 1 mode)) ?- ?x) - (if (zerop (logand 1 mode)) ?T ?t)))) +MODE should be an integer which is a file mode value. +For instance, if mode is 448, then it produces `rwx------'." + (substring (file-modes-number-to-symbolic mode) 1)) (defun tar-header-block-summarize (tar-hblock &optional mod-p) "Return a line similar to the output of `tar -vtf'." diff --git a/test/lisp/arc-mode-tests.el b/test/lisp/arc-mode-tests.el index 8c8465d366..f136becf55 100644 --- a/test/lisp/arc-mode-tests.el +++ b/test/lisp/arc-mode-tests.el @@ -26,7 +26,7 @@ (let ((alist (list (cons 448 "-rwx------") (cons 420 "-rw-r--r--") (cons 292 "-r--r--r--") - (cons 512 "----------") + (cons 512 "---------T") (cons 1024 "------S---") ; Bug#28092 (cons 2048 "---S------")))) (dolist (x alist) diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index a2f2b74312..fc3017027d 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -344,6 +344,71 @@ files-tests--with-temp-file (cdr path-res) (insert-directory-wildcard-in-dir-p (car path-res))))))) +(ert-deftest file-modes-symbolic-to-number () + (let ((alist '(("a=rwx" . 511) + ("o=t" . 512) + ("o=xt" . 513) + ("o=tx" . 513) ; Order doesn't matter. + ("u=rwx,g=rx,o=rx" . 493) + ("u=rwx,g=,o=" . 448) + ("u=rwx" . 448) ; Empty permissions can be ignored. + ("u=rw,g=r,o=r" . 420) + ("u=rw,g=r,o=t" . 928) + ("u=rw,g=r,o=xt" . 929) + ("u=rwxs,g=rs,o=xt" . 4065) + ("u=rws,g=rs,o=t" . 4000) + ("u=rws,g=rs,o=r" . 3492) + ("a=r" . 292) + ("u=S") + ("u=T") + ("u=Z")))) + (dolist (x alist) + (if (cdr-safe x) + (equal (cdr-safe x) (file-modes-symbolic-to-number (car x))) + (should-error (file-modes-symbolic-to-number (car x))))))) + +(ert-deftest file-modes-number-to-symbolic () + (let ((from 644) + (fn #'file-modes-number-to-symbolic) + ;; Alist of the form (MODE RES1 RES2 RES3), + ;; MODE is the first argument of FN. + ;; RES1, the result of calling FN with 1 argument. + ;; RES2, the result of calling FN with 2nd arg non-nil. + ;; RES3, the result of calling FN with 2nd arg non-nil and 3rd arg FROM. + (alist '((493 "-rwxr-xr-x" "u=rwx,g=rx,o=rx" "u+r+x,g+r+x,o+xt") + (448 "-rwx------" "u=rwx,g=,o=" "u+r+x,o-r-t") + (420 "-rw-r--r--" "u=rw,g=r,o=r" "u+r,g+r,o-t") + (928 "-rw-r----T" "u=rw,g=rx,o=r" "u+r,g+r,o-r") + (929 "-rw-r----t" "u=rw,g=rx,o=rx" "u+r,g+r,o-r+x") + (4065 "-rwsr-S--t" "u=rws,g=rS,o=t" "u+r+xs,g+r+s,o-r+x") + (4000 "-rwSr-S--T" "u=rwS,g=rS,o=T" "u+r+s,g+r+s,o-r") + (3492 "-rwSr-Sr--" "u=rwS,g=rS,o=r" "u+r+s,g+r+s,o-t") + (292 "-r--r--r--" "u=r,g=r,o=r" "u+r-w,g+r,o-t") + ("u=S") + ("u=T") + ("u=Z")))) + (dolist (x alist) + (cond ((cdr-safe x) + (let ((res1 (cadr x)) (res2 (caddr x)) (res3 (cadddr x))) + (equal res1 (funcall fn (car x))) + ;; FROM is ignored when DETAILED is nil. + (equal res1 (funcall fn (car x) nil from)) + (equal res2 (funcall fn (car x) 'detailed)) + (equal res3 (funcall fn (car x) 'detailed from)))) + (t (should-error (funcall fn (car x)))))))) + +(ert-deftest file-modes-number-to-symbolic-inverse () + (dotimes (i 4096) ; from 0 to 7777 in octal. + ;; If neithr sticky bit nor set_uid not set_gid are set, then + ;; `file-modes-symbolic-to-number' is the inverse of + ;; `file-modes-number-to-symbolic'. + (when (and (zerop (logand i 512)) + (zerop (logand i 1024)) + (zerop (logand i 2048))) + (should + (= i + (file-modes-symbolic-to-number + (file-modes-number-to-symbolic i t))))))) (provide 'files-tests) ;;; files-tests.el ends here --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.11) of 2017-08-16 Repository revision: 400934b694087f4fe94755d78cbd1569efdb1fa8 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-16 11:43 ` Tino Calancha @ 2017-08-16 12:00 ` npostavs 2017-08-16 13:13 ` Tino Calancha 2017-08-16 12:08 ` Andreas Schwab 1 sibling, 1 reply; 18+ messages in thread From: npostavs @ 2017-08-16 12:00 UTC (permalink / raw) To: Tino Calancha; +Cc: 27952, stefan monnier Tino Calancha <tino.calancha@gmail.com> writes: > + (replace-regexp-in-string > + ",\\`" "" This regex doesn't match anything, did you mean \\' at the end? > (defun tar-grind-file-mode (mode) > "Construct a `rw-r--r--' string indicating MODE. > +MODE should be an integer which is a file mode value. > +For instance, if mode is 448, then it produces `rwx------'." IMO, it's clearer if you write #o700 instead of 448 here, perhaps in the code too. ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-16 12:00 ` npostavs @ 2017-08-16 13:13 ` Tino Calancha 0 siblings, 0 replies; 18+ messages in thread From: Tino Calancha @ 2017-08-16 13:13 UTC (permalink / raw) To: npostavs; +Cc: 27952, stefan monnier, Tino Calancha On Wed, 16 Aug 2017, npostavs@users.sourceforge.net wrote: > Tino Calancha <tino.calancha@gmail.com> writes: > >> + (replace-regexp-in-string >> + ",\\`" "" > > This regex doesn't match anything, did you mean \\' at the end? Yes, you are right. I wanted to drop comma at the end. >> (defun tar-grind-file-mode (mode) >> "Construct a `rw-r--r--' string indicating MODE. > >> +MODE should be an integer which is a file mode value. >> +For instance, if mode is 448, then it produces `rwx------'." > > IMO, it's clearer if you write #o700 instead of 448 here, perhaps in the > code too. Yeah, for those people not having nbc.el (num-base-converters) might be easier to follow. Opps, i am the only one having nbc.el! :-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-16 11:43 ` Tino Calancha 2017-08-16 12:00 ` npostavs @ 2017-08-16 12:08 ` Andreas Schwab 2017-08-16 13:10 ` Tino Calancha 1 sibling, 1 reply; 18+ messages in thread From: Andreas Schwab @ 2017-08-16 12:08 UTC (permalink / raw) To: Tino Calancha; +Cc: 27952, stefan monnier On Aug 16 2017, Tino Calancha <tino.calancha@gmail.com> wrote: > +Note: This is not the inverse of `file-modes-symbolic-to-number'; > +The reason is that this function might return an string containing 'S' > +or 'T' i.e., not valid characters for `file-modes-symbolic-to-number'. > +For example, (file-modes-symbolic-to-number \"o=t\") returns 512; > +and (file-modes-number-to-symbolic 512 t) returns \"o=T\"." Why would it use uppercase T in the detailed case? Uppercase is only needed when it would overlay the 'x' position in the non-detailed case. Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-16 12:08 ` Andreas Schwab @ 2017-08-16 13:10 ` Tino Calancha 0 siblings, 0 replies; 18+ messages in thread From: Tino Calancha @ 2017-08-16 13:10 UTC (permalink / raw) To: Andreas Schwab; +Cc: 27952, stefan monnier, Tino Calancha On Wed, 16 Aug 2017, Andreas Schwab wrote: > On Aug 16 2017, Tino Calancha <tino.calancha@gmail.com> wrote: > >> +Note: This is not the inverse of `file-modes-symbolic-to-number'; >> +The reason is that this function might return an string containing 'S' >> +or 'T' i.e., not valid characters for `file-modes-symbolic-to-number'. >> +For example, (file-modes-symbolic-to-number \"o=t\") returns 512; >> +and (file-modes-number-to-symbolic 512 t) returns \"o=T\"." > > Why would it use uppercase T in the detailed case? Uppercase is only > needed when it would overlay the 'x' position in the non-detailed case. Not special reason i think. To keep more similar with the case when DETAILED is nil. (file-modes-number-to-symbolic 512) => "---------T" At the end of the function that is changed into "o=T" with: (funcall replace-fn (replace-regexp-in-string "-" "" ... I liked like this when i wrote the patch. We could changed it in case is confusing. ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2017-08-04 12:32 bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode Tino Calancha 2017-08-16 11:43 ` Tino Calancha @ 2019-06-24 20:35 ` Lars Ingebrigtsen 2019-06-24 20:42 ` Tino Calancha 1 sibling, 1 reply; 18+ messages in thread From: Lars Ingebrigtsen @ 2019-06-24 20:35 UTC (permalink / raw) To: Tino Calancha; +Cc: 27952, stefan monnier Tino Calancha <tino.calancha@gmail.com> writes: > These functions are almost identical; archive-int-to-mode has a FIXME > suggesting merging it with tar-grind-file-mode. Tino, there were some suggestions about some syntactical issues, but otherwise I don't think anybody objected to the patch. Did you continue to work on it? It doesn't seem to have been applied. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2019-06-24 20:35 ` Lars Ingebrigtsen @ 2019-06-24 20:42 ` Tino Calancha 2019-11-11 3:07 ` Stefan Kangas 0 siblings, 1 reply; 18+ messages in thread From: Tino Calancha @ 2019-06-24 20:42 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: 27952, stefan monnier, Tino Calancha Probably I wasn't happy enough with my patch and that's why I forget about it (I maybe started the fishing season and that got all my attention; I cannot remember). I will work on this again since next weekend and try to prepare the simples patch as possible. Thank you for the reminder! Tino > Tino Calancha <tino.calancha@gmail.com> writes: > >> These functions are almost identical; archive-int-to-mode has a FIXME >> suggesting merging it with tar-grind-file-mode. > > Tino, there were some suggestions about some syntactical issues, but > otherwise I don't think anybody objected to the patch. Did you continue > to work on it? It doesn't seem to have been applied. > > -- > (domestic pets only, the antidote for overdose, milk.) > bloggy blog: http://lars.ingebrigtsen.no > ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2019-06-24 20:42 ` Tino Calancha @ 2019-11-11 3:07 ` Stefan Kangas 2019-11-13 16:58 ` Tino Calancha 0 siblings, 1 reply; 18+ messages in thread From: Stefan Kangas @ 2019-11-11 3:07 UTC (permalink / raw) To: Tino Calancha; +Cc: Lars Ingebrigtsen, 27952, stefan monnier Tino Calancha <tino.calancha@gmail.com> writes: > Probably I wasn't happy enough with my patch and that's why I forget > about it (I maybe started the fishing season and that got all my attention; I > cannot remember). > > I will work on this again since next weekend and try to prepare the simples > patch as possible. That was 19 weeks ago. Were you able to make any progress here? Thanks in advance. Best regards, Stefan Kangas ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2019-11-11 3:07 ` Stefan Kangas @ 2019-11-13 16:58 ` Tino Calancha 2020-05-04 11:55 ` Stefan Kangas 0 siblings, 1 reply; 18+ messages in thread From: Tino Calancha @ 2019-11-13 16:58 UTC (permalink / raw) To: Stefan Kangas; +Cc: Lars Ingebrigtsen, 27952, stefan monnier, Tino Calancha On Mon, 11 Nov 2019, Stefan Kangas wrote: > Tino Calancha <tino.calancha@gmail.com> writes: > >> I will work on this again since next weekend and try to prepare the simples >> patch as possible. > > That was 19 weeks ago. Were you able to make any progress here? I am in the process to 'recover' my copyright freedom; currently I can not submit any work > 15 lines. PD: After November 30th 2019 I will be back (as Terminator). ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2019-11-13 16:58 ` Tino Calancha @ 2020-05-04 11:55 ` Stefan Kangas 2020-05-08 19:53 ` Tino Calancha 0 siblings, 1 reply; 18+ messages in thread From: Stefan Kangas @ 2020-05-04 11:55 UTC (permalink / raw) To: Tino Calancha; +Cc: Lars Ingebrigtsen, 27952, stefan monnier Tino Calancha <tino.calancha@gmail.com> writes: > On Mon, 11 Nov 2019, Stefan Kangas wrote: > >> Tino Calancha <tino.calancha@gmail.com> writes: >> >>> I will work on this again since next weekend and try to prepare the simples >>> patch as possible. >> >> That was 19 weeks ago. Were you able to make any progress here? > > I am in the process to 'recover' my copyright freedom; currently I can not > submit any work > 15 lines. Just another friendly ping, 6 months later. Please let us know if there has been any progress here. Thanks in advance. Best regards, Stefan Kangas ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-04 11:55 ` Stefan Kangas @ 2020-05-08 19:53 ` Tino Calancha 2020-05-08 20:06 ` Stefan Monnier 0 siblings, 1 reply; 18+ messages in thread From: Tino Calancha @ 2020-05-08 19:53 UTC (permalink / raw) To: Stefan Kangas; +Cc: Lars Ingebrigtsen, 27952, stefan monnier, Tino Calancha On Mon, 4 May 2020, Stefan Kangas wrote: > Just another friendly ping, 6 months later. Please let us know if > there has been any progress here. Thanks in advance. Thank you for the reminder! As I pointed out before, I wasn't really satisfied with my original patch; the one adding a function with > 1 arguments: too complex and I suspect failing side cases. Instead, I propose the following easy one: --8<-----------------------------cut here---------------start------------->8--- commit dc126c15c181afed9d236f4c1077e2c7f02b01df Author: Tino Calancha <tino.calancha@gmail.com> Date: Fri May 8 21:29:05 2020 +0200 Combine archive-int-to-mode and tar-grind-file-mode Add a new function, file-modes-number-to-symbolic. Make archive-int-to-mode and alias of it; use it to define tar-grind-file-mode (Bug#27952). * lisp/files.el (file-modes-number-to-symbolic): New defun. * lisp/arc-mode.el (archive-int-to-mode): Make it an alias. * lisp/tar-mode.el (tar-grind-file-mode): Use file-modes-number-to-symbolic. * test/lisp/arc-mode-tests.el (arc-mode-test-archive-int-to-mode) * test/lisp/tar-mode-tests.el (tar-mode-test-tar-grind-file-mode): Update test. * test/lisp/files-tests.el (files-tests-file-modes-symbolic-to-number) (files-tests-file-modes-number-to-symbolic): New tests. * doc/lispref/files.texi (Changing Files): Document the new funtion. * etc/NEWS (Lisp Changes in Emacs 28.1): Announce it. diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index b3ad9b9964..686dbdb1ca 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -1909,6 +1909,11 @@ Changing Files all. @end defun +@defun file-modes-number-to-symbolic modes +This function converts a numeric file mode specification in +@var{modes} into the equivalent symbolic form. +@end defun + @defun set-file-times filename &optional time flag This function sets the access and modification times of @var{filename} to @var{time}. The return value is @code{t} if the times are successfully diff --git a/etc/NEWS b/etc/NEWS index ac93a76ff9..26426fc42b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -372,6 +372,10 @@ Use macro 'with-current-buffer-window' with action alist entry 'body-function'. * Lisp Changes in Emacs 28.1 ++++ +** New function 'file-modes-number-to-symbolic' to convert a numeric +file mode specification into symbolic form. + ** New macro 'dlet' to dynamically bind variables. ** The variable 'force-new-style-backquotes' has been removed. diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index c918f06c80..0c801c67a5 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -563,28 +563,7 @@ archive-l-e (aref str (- len i))))) result)) -(defun archive-int-to-mode (mode) - "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------." - ;; FIXME: merge with tar-grind-file-mode. - (if (null mode) - "??????????" - (string - (if (zerop (logand 8192 mode)) - (if (zerop (logand 16384 mode)) ?- ?d) - ?c) ; completeness - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 64 mode)) - (if (zerop (logand 2048 mode)) ?- ?S) - (if (zerop (logand 2048 mode)) ?x ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 8 mode)) - (if (zerop (logand 1024 mode)) ?- ?S) - (if (zerop (logand 1024 mode)) ?x ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 1 mode)) ?- ?x)))) +(defalias 'archive-int-to-mode 'file-modes-number-to-symbolic) (defun archive-calc-mode (oldmode newmode) "From the integer OLDMODE and the string NEWMODE calculate a new file mode. diff --git a/lisp/files.el b/lisp/files.el index c34fe00388..dba704f7a4 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -7552,6 +7552,27 @@ file-modes-rights-to-number op char-right))) num-rights)) +(defun file-modes-number-to-symbolic (mode) + (string + (if (zerop (logand 8192 mode)) + (if (zerop (logand 16384 mode)) ?- ?d) + ?c) ; completeness + (if (zerop (logand 256 mode)) ?- ?r) + (if (zerop (logand 128 mode)) ?- ?w) + (if (zerop (logand 64 mode)) + (if (zerop (logand 2048 mode)) ?- ?S) + (if (zerop (logand 2048 mode)) ?x ?s)) + (if (zerop (logand 32 mode)) ?- ?r) + (if (zerop (logand 16 mode)) ?- ?w) + (if (zerop (logand 8 mode)) + (if (zerop (logand 1024 mode)) ?- ?S) + (if (zerop (logand 1024 mode)) ?x ?s)) + (if (zerop (logand 4 mode)) ?- ?r) + (if (zerop (logand 2 mode)) ?- ?w) + (if (zerop (logand 512 mode)) + (if (zerop (logand 1 mode)) ?- ?x) + (if (zerop (logand 1 mode)) ?T ?t)))) + (defun file-modes-symbolic-to-number (modes &optional from) "Convert symbolic file modes to numeric file modes. MODES is the string to convert, it should match diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index a3c1715b1e..73978ffc4a 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -480,23 +480,9 @@ tar-clip-time-string (defun tar-grind-file-mode (mode) "Construct a `rw-r--r--' string indicating MODE. -MODE should be an integer which is a file mode value." - (string - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 2048 mode)) - (if (zerop (logand 64 mode)) ?- ?x) - (if (zerop (logand 64 mode)) ?S ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 1024 mode)) - (if (zerop (logand 8 mode)) ?- ?x) - (if (zerop (logand 8 mode)) ?S ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 512 mode)) - (if (zerop (logand 1 mode)) ?- ?x) - (if (zerop (logand 1 mode)) ?T ?t)))) +MODE should be an integer which is a file mode value. +For instance, if mode is #o700, then it produces `rwx------'." + (substring (file-modes-number-to-symbolic mode) 1)) (defun tar-header-block-summarize (tar-hblock &optional mod-p) "Return a line similar to the output of `tar -vtf'." diff --git a/test/lisp/arc-mode-tests.el b/test/lisp/arc-mode-tests.el index df658b9813..22ca7e2ec5 100644 --- a/test/lisp/arc-mode-tests.el +++ b/test/lisp/arc-mode-tests.el @@ -28,7 +28,7 @@ arc-mode-tests-data-directory (let ((alist (list (cons 448 "-rwx------") (cons 420 "-rw-r--r--") (cons 292 "-r--r--r--") - (cons 512 "----------") + (cons 512 "---------T") (cons 1024 "------S---") ; Bug#28092 (cons 2048 "---S------")))) (dolist (x alist) diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 05d9ceebf1..4b902fd82a 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -1164,6 +1164,42 @@ files-tests-file-attributes-equal (should-not (make-directory a/b t)) (delete-directory dir 'recursive))) +(ert-deftest files-tests-file-modes-symbolic-to-number () + (let ((alist (list (cons "a=rwx" #o777) + (cons "o=t" #o1000) + (cons "o=xt" #o1001) + (cons "o=tx" #o1001) ; Order doesn't matter. + (cons "u=rwx,g=rx,o=rx" #o755) + (cons "u=rwx,g=,o=" #o700) + (cons "u=rwx" #o700) ; Empty permissions can be ignored. + (cons "u=rw,g=r,o=r" #o644) + (cons "u=rw,g=r,o=t" #o1640) + (cons "u=rw,g=r,o=xt" #o1641) + (cons "u=rwxs,g=rs,o=xt" #o7741) + (cons "u=rws,g=rs,o=t" #o7640) + (cons "u=rws,g=rs,o=r" #o6644) + (cons "a=r" #o444) + (cons "u=S" nil) + (cons "u=T" nil) + (cons "u=Z" nil)))) + (dolist (x alist) + (if (cdr-safe x) + (should (equal (cdr x) (file-modes-symbolic-to-number (car x)))) + (should-error (file-modes-symbolic-to-number (car x))))))) + +(ert-deftest files-tests-file-modes-number-to-symbolic () + (let ((alist (list (cons #o755 "-rwxr-xr-x") + (cons #o700 "-rwx------") + (cons #o644 "-rw-r--r--") + (cons #o1640 "-rw-r----T") + (cons #o1641 "-rw-r----t") + (cons #o7741 "-rwsr-S--t") + (cons #o7640 "-rwSr-S--T") + (cons #o6644 "-rwSr-Sr--") + (cons #o444 "-r--r--r--")))) + (dolist (x alist) + (should (equal (cdr x) (file-modes-number-to-symbolic (car x))))))) + (ert-deftest files-tests-no-file-write-contents () "Test that `write-contents-functions' permits saving a file. Usually `basic-save-buffer' will prompt for a file name if the diff --git a/test/lisp/tar-mode-tests.el b/test/lisp/tar-mode-tests.el index bc41b863da..f05389df60 100644 --- a/test/lisp/tar-mode-tests.el +++ b/test/lisp/tar-mode-tests.el @@ -29,7 +29,8 @@ tar-mode-tests-data-directory (cons 420 "rw-r--r--") (cons 292 "r--r--r--") (cons 512 "--------T") - (cons 1024 "-----S---")))) + (cons 1024 "-----S---") + (cons 2048 "--S------")))) (dolist (x alist) (should (equal (cdr x) (tar-grind-file-mode (car x))))))) --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 28.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version 3.24.5, cairo version 1.16.0) of 2020-05-08 built on calancha-pc.dy.bbexcite.jp Repository revision: 4b8e6939bf7664fda33a7aaa03d2d8069358ff7b Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12004000 System Description: Debian GNU/Linux 10 (buster) ^ permalink raw reply related [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-08 19:53 ` Tino Calancha @ 2020-05-08 20:06 ` Stefan Monnier 2020-05-08 20:20 ` Tino Calancha 2020-05-14 16:47 ` Tino Calancha 0 siblings, 2 replies; 18+ messages in thread From: Stefan Monnier @ 2020-05-08 20:06 UTC (permalink / raw) To: Tino Calancha; +Cc: Stefan Kangas, Lars Ingebrigtsen, 27952 > +(defalias 'archive-int-to-mode 'file-modes-number-to-symbolic) Make it a `define-obsolete-function-alias`. > (defun tar-grind-file-mode (mode) > "Construct a `rw-r--r--' string indicating MODE. [...] > +MODE should be an integer which is a file mode value. > +For instance, if mode is #o700, then it produces `rwx------'." > + (substring (file-modes-number-to-symbolic mode) 1)) LGTM. A second step might be to mark this function as obsolete and update all the call sites so they are happy with the output format of `file-modes-number-to-symbolic`. Stefan ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-08 20:06 ` Stefan Monnier @ 2020-05-08 20:20 ` Tino Calancha 2020-05-14 16:47 ` Tino Calancha 1 sibling, 0 replies; 18+ messages in thread From: Tino Calancha @ 2020-05-08 20:20 UTC (permalink / raw) To: Stefan Monnier; +Cc: Stefan Kangas, Lars Ingebrigtsen, 27952, Tino Calancha On Fri, 8 May 2020, Stefan Monnier wrote: >> +(defalias 'archive-int-to-mode 'file-modes-number-to-symbolic) > > Make it a `define-obsolete-function-alias`. OK. >> (defun tar-grind-file-mode (mode) >> "Construct a `rw-r--r--' string indicating MODE. > [...] >> +MODE should be an integer which is a file mode value. >> +For instance, if mode is #o700, then it produces `rwx------'." >> + (substring (file-modes-number-to-symbolic mode) 1)) > > LGTM. Good. Then, I will merge it next week. > A second step might be to mark this function as obsolete and > update all the call sites so they are happy with the output format of > `file-modes-number-to-symbolic`. It sounds good; it's funny having those 2 defun with almost identical output. Maybe you can add a TODO in the code asking for this; people feel encouraged to contribute when they found those FIXME/TODOs. Amended patch follows: --8<-----------------------------cut here---------------start------------->8--- commit 043ecae1c0828bcad94083ef456195ae21675a1a Author: Tino Calancha <tino.calancha@gmail.com> Date: Fri May 8 22:14:03 2020 +0200 Combine archive-int-to-mode and tar-grind-file-mode Add a new function, file-modes-number-to-symbolic. Make archive-int-to-mode and obsolete alias of it; use it to define tar-grind-file-mode (Bug#27952). * lisp/files.el (file-modes-number-to-symbolic): New defun. * lisp/arc-mode.el (archive-int-to-mode): Make it an obsolete alias. * lisp/tar-mode.el (tar-grind-file-mode): Use file-modes-number-to-symbolic. * test/lisp/arc-mode-tests.el (arc-mode-test-archive-int-to-mode) * test/lisp/tar-mode-tests.el (tar-mode-test-tar-grind-file-mode): Update test. * test/lisp/files-tests.el (files-tests-file-modes-symbolic-to-number) (files-tests-file-modes-number-to-symbolic): New tests. * doc/lispref/files.texi (Changing Files): Document the new funtion. * etc/NEWS (Lisp Changes in Emacs 28.1): Announce it. diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index b3ad9b9964..686dbdb1ca 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -1909,6 +1909,11 @@ Changing Files all. @end defun +@defun file-modes-number-to-symbolic modes +This function converts a numeric file mode specification in +@var{modes} into the equivalent symbolic form. +@end defun + @defun set-file-times filename &optional time flag This function sets the access and modification times of @var{filename} to @var{time}. The return value is @code{t} if the times are successfully diff --git a/etc/NEWS b/etc/NEWS index ac93a76ff9..26426fc42b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -372,6 +372,10 @@ Use macro 'with-current-buffer-window' with action alist entry 'body-function'. * Lisp Changes in Emacs 28.1 ++++ +** New function 'file-modes-number-to-symbolic' to convert a numeric +file mode specification into symbolic form. + ** New macro 'dlet' to dynamically bind variables. ** The variable 'force-new-style-backquotes' has been removed. diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index c918f06c80..6ce64fe24b 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -563,28 +563,8 @@ archive-l-e (aref str (- len i))))) result)) -(defun archive-int-to-mode (mode) - "Turn an integer like 0700 (i.e., 448) into a mode string like -rwx------." - ;; FIXME: merge with tar-grind-file-mode. - (if (null mode) - "??????????" - (string - (if (zerop (logand 8192 mode)) - (if (zerop (logand 16384 mode)) ?- ?d) - ?c) ; completeness - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 64 mode)) - (if (zerop (logand 2048 mode)) ?- ?S) - (if (zerop (logand 2048 mode)) ?x ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 8 mode)) - (if (zerop (logand 1024 mode)) ?- ?S) - (if (zerop (logand 1024 mode)) ?x ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 1 mode)) ?- ?x)))) +(define-obsolete-function-alias 'archive-int-to-mode + 'file-modes-number-to-symbolic "28.1") (defun archive-calc-mode (oldmode newmode) "From the integer OLDMODE and the string NEWMODE calculate a new file mode. diff --git a/lisp/files.el b/lisp/files.el index c34fe00388..dba704f7a4 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -7552,6 +7552,27 @@ file-modes-rights-to-number op char-right))) num-rights)) +(defun file-modes-number-to-symbolic (mode) + (string + (if (zerop (logand 8192 mode)) + (if (zerop (logand 16384 mode)) ?- ?d) + ?c) ; completeness + (if (zerop (logand 256 mode)) ?- ?r) + (if (zerop (logand 128 mode)) ?- ?w) + (if (zerop (logand 64 mode)) + (if (zerop (logand 2048 mode)) ?- ?S) + (if (zerop (logand 2048 mode)) ?x ?s)) + (if (zerop (logand 32 mode)) ?- ?r) + (if (zerop (logand 16 mode)) ?- ?w) + (if (zerop (logand 8 mode)) + (if (zerop (logand 1024 mode)) ?- ?S) + (if (zerop (logand 1024 mode)) ?x ?s)) + (if (zerop (logand 4 mode)) ?- ?r) + (if (zerop (logand 2 mode)) ?- ?w) + (if (zerop (logand 512 mode)) + (if (zerop (logand 1 mode)) ?- ?x) + (if (zerop (logand 1 mode)) ?T ?t)))) + (defun file-modes-symbolic-to-number (modes &optional from) "Convert symbolic file modes to numeric file modes. MODES is the string to convert, it should match diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index a3c1715b1e..73978ffc4a 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -480,23 +480,9 @@ tar-clip-time-string (defun tar-grind-file-mode (mode) "Construct a `rw-r--r--' string indicating MODE. -MODE should be an integer which is a file mode value." - (string - (if (zerop (logand 256 mode)) ?- ?r) - (if (zerop (logand 128 mode)) ?- ?w) - (if (zerop (logand 2048 mode)) - (if (zerop (logand 64 mode)) ?- ?x) - (if (zerop (logand 64 mode)) ?S ?s)) - (if (zerop (logand 32 mode)) ?- ?r) - (if (zerop (logand 16 mode)) ?- ?w) - (if (zerop (logand 1024 mode)) - (if (zerop (logand 8 mode)) ?- ?x) - (if (zerop (logand 8 mode)) ?S ?s)) - (if (zerop (logand 4 mode)) ?- ?r) - (if (zerop (logand 2 mode)) ?- ?w) - (if (zerop (logand 512 mode)) - (if (zerop (logand 1 mode)) ?- ?x) - (if (zerop (logand 1 mode)) ?T ?t)))) +MODE should be an integer which is a file mode value. +For instance, if mode is #o700, then it produces `rwx------'." + (substring (file-modes-number-to-symbolic mode) 1)) (defun tar-header-block-summarize (tar-hblock &optional mod-p) "Return a line similar to the output of `tar -vtf'." diff --git a/test/lisp/arc-mode-tests.el b/test/lisp/arc-mode-tests.el index df658b9813..22ca7e2ec5 100644 --- a/test/lisp/arc-mode-tests.el +++ b/test/lisp/arc-mode-tests.el @@ -28,7 +28,7 @@ arc-mode-tests-data-directory (let ((alist (list (cons 448 "-rwx------") (cons 420 "-rw-r--r--") (cons 292 "-r--r--r--") - (cons 512 "----------") + (cons 512 "---------T") (cons 1024 "------S---") ; Bug#28092 (cons 2048 "---S------")))) (dolist (x alist) diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 05d9ceebf1..4b902fd82a 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -1164,6 +1164,42 @@ files-tests-file-attributes-equal (should-not (make-directory a/b t)) (delete-directory dir 'recursive))) +(ert-deftest files-tests-file-modes-symbolic-to-number () + (let ((alist (list (cons "a=rwx" #o777) + (cons "o=t" #o1000) + (cons "o=xt" #o1001) + (cons "o=tx" #o1001) ; Order doesn't matter. + (cons "u=rwx,g=rx,o=rx" #o755) + (cons "u=rwx,g=,o=" #o700) + (cons "u=rwx" #o700) ; Empty permissions can be ignored. + (cons "u=rw,g=r,o=r" #o644) + (cons "u=rw,g=r,o=t" #o1640) + (cons "u=rw,g=r,o=xt" #o1641) + (cons "u=rwxs,g=rs,o=xt" #o7741) + (cons "u=rws,g=rs,o=t" #o7640) + (cons "u=rws,g=rs,o=r" #o6644) + (cons "a=r" #o444) + (cons "u=S" nil) + (cons "u=T" nil) + (cons "u=Z" nil)))) + (dolist (x alist) + (if (cdr-safe x) + (should (equal (cdr x) (file-modes-symbolic-to-number (car x)))) + (should-error (file-modes-symbolic-to-number (car x))))))) + +(ert-deftest files-tests-file-modes-number-to-symbolic () + (let ((alist (list (cons #o755 "-rwxr-xr-x") + (cons #o700 "-rwx------") + (cons #o644 "-rw-r--r--") + (cons #o1640 "-rw-r----T") + (cons #o1641 "-rw-r----t") + (cons #o7741 "-rwsr-S--t") + (cons #o7640 "-rwSr-S--T") + (cons #o6644 "-rwSr-Sr--") + (cons #o444 "-r--r--r--")))) + (dolist (x alist) + (should (equal (cdr x) (file-modes-number-to-symbolic (car x))))))) + (ert-deftest files-tests-no-file-write-contents () "Test that `write-contents-functions' permits saving a file. Usually `basic-save-buffer' will prompt for a file name if the diff --git a/test/lisp/tar-mode-tests.el b/test/lisp/tar-mode-tests.el index bc41b863da..f05389df60 100644 --- a/test/lisp/tar-mode-tests.el +++ b/test/lisp/tar-mode-tests.el @@ -29,7 +29,8 @@ tar-mode-tests-data-directory (cons 420 "rw-r--r--") (cons 292 "r--r--r--") (cons 512 "--------T") - (cons 1024 "-----S---")))) + (cons 1024 "-----S---") + (cons 2048 "--S------")))) (dolist (x alist) (should (equal (cdr x) (tar-grind-file-mode (car x))))))) --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 28.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version 3.24.5, cairo version 1.16.0) of 2020-05-08 built on calancha-pc.dy.bbexcite.jp Repository revision: 4b8e6939bf7664fda33a7aaa03d2d8069358ff7b Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12004000 System Description: Debian GNU/Linux 10 (buster) ^ permalink raw reply related [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-08 20:06 ` Stefan Monnier 2020-05-08 20:20 ` Tino Calancha @ 2020-05-14 16:47 ` Tino Calancha 2020-05-14 17:23 ` Eli Zaretskii 1 sibling, 1 reply; 18+ messages in thread From: Tino Calancha @ 2020-05-14 16:47 UTC (permalink / raw) To: 27952-done Stefan Monnier <monnier@iro.umontreal.ca> writes: > LGTM. Fixed in master branch as commit 'Combine archive-int-to-mode and tar-grind-file-mode' (3a284e578625e617fdc6085ae11da2b4e41bb59b) ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-14 16:47 ` Tino Calancha @ 2020-05-14 17:23 ` Eli Zaretskii 2020-05-14 20:08 ` Tino Calancha 0 siblings, 1 reply; 18+ messages in thread From: Eli Zaretskii @ 2020-05-14 17:23 UTC (permalink / raw) To: Tino Calancha; +Cc: 27952 > From: Tino Calancha <tino.calancha@gmail.com> > Date: Thu, 14 May 2020 18:47:34 +0200 > > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > LGTM. > > Fixed in master branch as commit > 'Combine archive-int-to-mode and tar-grind-file-mode' > (3a284e578625e617fdc6085ae11da2b4e41bb59b) The fix triggers compilation warnings: In archive--summarize-descs: arc-mode.el:1509:45: Warning: `archive-int-to-mode' is an obsolete function (as of 28.1); use `file-modes-number-to-symbolic' instead. arc-mode.el:1574:70: Warning: `archive-int-to-mode' is an obsolete function (as of 28.1); use `file-modes-number-to-symbolic' instead. Would it be possible to eliminate these warnings, please? Thanks. ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-14 17:23 ` Eli Zaretskii @ 2020-05-14 20:08 ` Tino Calancha 2020-05-15 6:22 ` Eli Zaretskii 0 siblings, 1 reply; 18+ messages in thread From: Tino Calancha @ 2020-05-14 20:08 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 27952, Tino Calancha On Thu, 14 May 2020, Eli Zaretskii wrote: > The fix triggers compilation warnings: > > In archive--summarize-descs: > arc-mode.el:1509:45: Warning: `archive-int-to-mode' is an obsolete function > (as of 28.1); use `file-modes-number-to-symbolic' instead. > arc-mode.el:1574:70: Warning: `archive-int-to-mode' is an obsolete function > (as of 28.1); use `file-modes-number-to-symbolic' instead. > > Would it be possible to eliminate these warnings, please? Sorry, I missed that. Pushed a fix (065f6a1d8b5c7dc8f1bf758e22f2e9a7d17b47d4) Thank you. ^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode 2020-05-14 20:08 ` Tino Calancha @ 2020-05-15 6:22 ` Eli Zaretskii 0 siblings, 0 replies; 18+ messages in thread From: Eli Zaretskii @ 2020-05-15 6:22 UTC (permalink / raw) To: Tino Calancha; +Cc: 27952 > From: Tino Calancha <tino.calancha@gmail.com> > Date: Thu, 14 May 2020 22:08:36 +0200 (CEST) > cc: Tino Calancha <tino.calancha@gmail.com>, 27952@debbugs.gnu.org > > > In archive--summarize-descs: > > arc-mode.el:1509:45: Warning: `archive-int-to-mode' is an obsolete function > > (as of 28.1); use `file-modes-number-to-symbolic' instead. > > arc-mode.el:1574:70: Warning: `archive-int-to-mode' is an obsolete function > > (as of 28.1); use `file-modes-number-to-symbolic' instead. > > > > Would it be possible to eliminate these warnings, please? > Sorry, I missed that. Pushed a fix > (065f6a1d8b5c7dc8f1bf758e22f2e9a7d17b47d4) Thanks, compiles cleanly now. ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2020-05-15 6:22 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-04 12:32 bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode Tino Calancha 2017-08-16 11:43 ` Tino Calancha 2017-08-16 12:00 ` npostavs 2017-08-16 13:13 ` Tino Calancha 2017-08-16 12:08 ` Andreas Schwab 2017-08-16 13:10 ` Tino Calancha 2019-06-24 20:35 ` Lars Ingebrigtsen 2019-06-24 20:42 ` Tino Calancha 2019-11-11 3:07 ` Stefan Kangas 2019-11-13 16:58 ` Tino Calancha 2020-05-04 11:55 ` Stefan Kangas 2020-05-08 19:53 ` Tino Calancha 2020-05-08 20:06 ` Stefan Monnier 2020-05-08 20:20 ` Tino Calancha 2020-05-14 16:47 ` Tino Calancha 2020-05-14 17:23 ` Eli Zaretskii 2020-05-14 20:08 ` Tino Calancha 2020-05-15 6:22 ` Eli Zaretskii
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.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).