From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#27952: 26.0.50; Combine archive-int-to-mode and tar-grind-file-mode Date: Fri, 8 May 2020 21:53:24 +0200 (CEST) Message-ID: References: <8760e3zf6v.fsf@calancha-pc> <87h83bqfem.fsf@marxist.se> <871rnzzzgd.fsf@stefankangas.se> Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset=US-ASCII Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="17682"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Alpine 2.21 (DEB 202 2017-01-01) Cc: Lars Ingebrigtsen , 27952@debbugs.gnu.org, stefan monnier , Tino Calancha To: Stefan Kangas Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri May 08 21:54:18 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jX94b-0004U4-5l for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 08 May 2020 21:54:17 +0200 Original-Received: from localhost ([::1]:52044 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jX94a-0007tw-7Y for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 08 May 2020 15:54:16 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55692) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jX94M-0007rB-FC for bug-gnu-emacs@gnu.org; Fri, 08 May 2020 15:54:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:34831) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jX94M-0003BT-58 for bug-gnu-emacs@gnu.org; Fri, 08 May 2020 15:54:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jX94M-0003L5-4C for bug-gnu-emacs@gnu.org; Fri, 08 May 2020 15:54:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 08 May 2020 19:54:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 27952 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 27952-submit@debbugs.gnu.org id=B27952.158896761512801 (code B ref 27952); Fri, 08 May 2020 19:54:02 +0000 Original-Received: (at 27952) by debbugs.gnu.org; 8 May 2020 19:53:35 +0000 Original-Received: from localhost ([127.0.0.1]:46377 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jX93v-0003KO-4q for submit@debbugs.gnu.org; Fri, 08 May 2020 15:53:35 -0400 Original-Received: from mail-wr1-f46.google.com ([209.85.221.46]:42303) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jX93s-0003K7-LH for 27952@debbugs.gnu.org; Fri, 08 May 2020 15:53:33 -0400 Original-Received: by mail-wr1-f46.google.com with SMTP id s8so3283126wrt.9 for <27952@debbugs.gnu.org>; Fri, 08 May 2020 12:53:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:date:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=uVnK4mhY1Z20DOK6fzek64yhDqucJ46pBq+tC6uvEXk=; b=S9s1FsbhiCBBieOnyqN4D0OBpj/tZU/qqd2Rmirq/ZtRfB/gNPNJLHXKuSshDDwv26 z+ypu143DmfUu2eruLUS+BmVclE85TO1iDnV0cCkdl6M3BRBE0G7U9Af61/JCTODNVoF uvtmAgpoJSwifumqwfl0uObeg1C4X7gB+Xo99MkMa/oxiLVYtecvGsP0Y7Rvu88o/+8+ 7TphishpyizFkyeLxevOjM54dg6sJu+1voByjcDiqBGwfhwCAAJyqEnWXtVKw0358lcv n6lzQoU8Nz8muNCU7gBVSljHmRHKVV3mzMRJn84EF6QWDRja/4F0aUWiixU+3zwh8xjS 4OPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=uVnK4mhY1Z20DOK6fzek64yhDqucJ46pBq+tC6uvEXk=; b=XzE/6vd0v8GoI08uPWALb8l1Pi6nwWygs4JBiyvXZC5zr4TjarQ087n/+62eEegPyK bV54mSiBQPNh1xn3E1N49R1woPO3TkVjN+OncQDVuGfDdNqDqYj+llzP77d7F3iztUgD oiUaltlce1krfGPPkM6Fo1CdzIS7ttOPdpaBmx3jFGz3XiMCNDO/D2NEWllBSVPld3+6 5YZ947oZ91tj7tuczy0Tes0pauG5pyTxwSvPSTYAS2ZnYcYO/FvgxnS/LDySvQvQmQtf Gk1SiH1NVADu8EcnybNp+G5DYc1xKRWLczV7XUAnImyuiCZa5Vn0UJhKUs2Fnc3F4Baw Pw4w== X-Gm-Message-State: AGi0PuZS/p4+wlTteor3YT43H9iKSXKPGDHn3BZvBT0VIrSX3Ckml14R 4Sig5IxFuRsA41UknDDb2ds= X-Google-Smtp-Source: APiQypKjsbuS9QA6E6rGU/wLkOMkbL8NXaN/FgDJMIip/34CkIbEXyWDD4twf97TT7Ld3X10PN3Bvg== X-Received: by 2002:adf:f1c6:: with SMTP id z6mr4675124wro.361.1588967606460; Fri, 08 May 2020 12:53:26 -0700 (PDT) Original-Received: from calancha-pc.dy.bbexcite.jp ([31.7.242.222]) by smtp.gmail.com with ESMTPSA id d1sm4149895wrx.65.2020.05.08.12.53.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 12:53:25 -0700 (PDT) X-Google-Original-From: Tino Calancha X-X-Sender: calancha@calancha-pc.dy.bbexcite.jp In-Reply-To: <871rnzzzgd.fsf@stefankangas.se> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:179939 Archived-At: 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 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)