unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: master 3a284e5: Combine archive-int-to-mode and tar-grind-file-mode
       [not found] ` <20200514164505.2F26320A29@vcs0.savannah.gnu.org>
@ 2020-05-14 19:51   ` Stefan Monnier
  0 siblings, 0 replies; only message in thread
From: Stefan Monnier @ 2020-05-14 19:51 UTC (permalink / raw)
  To: Tino Calancha; +Cc: emacs-devel

> +(defun file-modes-number-to-symbolic (mode)
> +  (string
> +   (if (zerop (logand  8192 mode))
> +       (if (zerop (logand 16384 mode)) ?- ?d)
> +     ?c) ; completeness

BTW, I was looking at how to get rid of `tar-grind-file-mode` and along
the way I saw that this first char is really representing the file type
and there is no real standard for how a "modes" number can represent the
file type.  IOW the 8192/16484 above are fairly arbitrary (I suspect they
correspond to what happens to be used in `.zip` files and probably
won't match what's used in any other circumstance, e.g. they don't match
what Git uses, IIUC).

How 'bout the patch below?


        Stefan


diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el
index 6ce64fe24b3..82a79af8931 100644
--- a/lisp/arc-mode.el
+++ b/lisp/arc-mode.el
@@ -563,8 +563,13 @@ archive-l-e
 		      (aref str (- len i)))))
     result))
 
-(define-obsolete-function-alias 'archive-int-to-mode
-  'file-modes-number-to-symbolic "28.1")
+(defun archive-int-to-mode (mode)
+  ;; FIXME: Make this obsolete.  For this, we will need to clarify
+  ;; where those 8192/16384 come from and what to do about them.
+  (file-modes-number-to-symbolic
+   mode (if (zerop (logand  8192 mode))
+            (if (zerop (logand 16384 mode)) ?- ?d)
+          ?c)))
 
 (defun archive-calc-mode (oldmode newmode)
   "From the integer OLDMODE and the string NEWMODE calculate a new file mode.
@@ -626,7 +631,8 @@ archive-get-descr
 	(let ((item (aref archive-files no)))
 	  (if (and (archive--file-desc-p item)
 	           (let ((mode (archive--file-desc-mode item)))
-	             (zerop (logand 16384 mode))))
+	             ;; FIXME: Why 16384?  See comment in archive-int-to-mode.
+	             (or (null mode) (zerop (logand 16384 mode)))))
 	      item
 	    (if (not noerror)
 		(user-error "Entry is not a regular member of the archive"))))
@@ -2119,7 +2125,6 @@ archive-7z-write-file-member
 ;; not the GNU nor the BSD extensions.  As it turns out, this is sufficient
 ;; for .deb packages.
 
-(autoload 'tar-grind-file-mode "tar-mode")
 
 (defconst archive-ar-file-header-re
   "\\(.\\{16\\}\\)\\([ 0-9]\\{12\\}\\)\\([ 0-9]\\{6\\}\\)\\([ 0-9]\\{6\\}\\)\\([ 0-7]\\{8\\}\\)\\([ 0-9]\\{10\\}\\)`\n")
diff --git a/lisp/files.el b/lisp/files.el
index dba704f7a4b..cfbe085f9c1 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -441,6 +441,7 @@ auto-save-visited-mode
            #'save-some-buffers :no-prompt
            (lambda ()
              (and buffer-file-name
+                  auto-save-visited-mode
                   (not (and buffer-auto-save-file-name
                             auto-save-visited-file-name))))))))
 
@@ -7552,11 +7553,14 @@ file-modes-rights-to-number
 	      op char-right)))
     num-rights))
 
-(defun file-modes-number-to-symbolic (mode)
+(defun file-modes-number-to-symbolic (mode &optional filetype)
+  "Return a string describing a a file's MODE.
+For instance, if MODE is #o700, then it produces `-rwx------'.
+FILETYPE if provided should be a character denoting the type of file,
+such as `?d' for a directory, or `?l' for a symbolic link and will replace
+the leading `-' char."
   (string
-   (if (zerop (logand  8192 mode))
-       (if (zerop (logand 16384 mode)) ?- ?d)
-     ?c) ; completeness
+   (or filetype ?-)
    (if (zerop (logand   256 mode)) ?- ?r)
    (if (zerop (logand   128 mode)) ?- ?w)
    (if (zerop (logand    64 mode))
diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el
index 73978ffc4a7..75ffb5647e1 100644
--- a/lisp/tar-mode.el
+++ b/lisp/tar-mode.el
@@ -482,6 +482,7 @@ tar-grind-file-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------'."
+  (declare (obsolete file-modes-number-to-symbolic "28.1"))
   (substring (file-modes-number-to-symbolic mode) 1))
 
 (defun tar-header-block-summarize (tar-hblock &optional mod-p)
@@ -497,25 +498,26 @@ tar-header-block-summarize
 	;; (ck (tar-header-checksum tar-hblock))
 	(type (tar-header-link-type tar-hblock))
 	(link-name (tar-header-link-name tar-hblock)))
-    (format "%c%c%s %7s/%-7s %7s%s %s%s"
+    (format "%c%s %7s/%-7s %7s%s %s%s"
 	    (if mod-p ?* ? )
-	    (cond ((or (eq type nil) (eq type 0)) ?-)
-		  ((eq type 1) ?h)	; link
-		  ((eq type 2) ?l)	; symlink
-		  ((eq type 3) ?c)	; char special
-		  ((eq type 4) ?b)	; block special
-		  ((eq type 5) ?d)	; directory
-		  ((eq type 6) ?p)	; FIFO/pipe
-		  ((eq type 20) ?*)	; directory listing
-		  ((eq type 28) ?L)	; next has longname
-		  ((eq type 29) ?M)	; multivolume continuation
-		  ((eq type 35) ?S)	; sparse
-		  ((eq type 38) ?V)	; volume header
-		  ((eq type 55) ?H)	; pax global extended header
-		  ((eq type 72) ?X)	; pax extended header
-		  (t ?\s)
-		  )
-	    (tar-grind-file-mode mode)
+	    (file-modes-number-to-symbolic
+	     (tar-grind-file-mode mode)
+	     (cond ((or (eq type nil) (eq type 0)) ?-)
+		   ((eq type 1) ?h)	; link
+		   ((eq type 2) ?l)	; symlink
+		   ((eq type 3) ?c)	; char special
+		   ((eq type 4) ?b)	; block special
+		   ((eq type 5) ?d)	; directory
+		   ((eq type 6) ?p)	; FIFO/pipe
+		   ((eq type 20) ?*)	; directory listing
+		   ((eq type 28) ?L)	; next has longname
+		   ((eq type 29) ?M)	; multivolume continuation
+		   ((eq type 35) ?S)	; sparse
+		   ((eq type 38) ?V)	; volume header
+		   ((eq type 55) ?H)	; pax global extended header
+		   ((eq type 72) ?X)	; pax extended header
+		   (t ?\s)
+		   ))
 	    (if (= 0 (length uname)) uid uname)
 	    (if (= 0 (length gname)) gid gname)
 	    size




^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-05-14 19:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20200514164503.2999.1026@vcs0.savannah.gnu.org>
     [not found] ` <20200514164505.2F26320A29@vcs0.savannah.gnu.org>
2020-05-14 19:51   ` master 3a284e5: Combine archive-int-to-mode and tar-grind-file-mode Stefan Monnier

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).