unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* 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 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-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-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).