unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Ruijie Yu via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: 61326@debbugs.gnu.org
Cc: Eli Zaretskii <eliz@gnu.org>, asjo@koldfront.dk
Subject: bug#61326: [DRAFT PATCH] Work around zip's filename extension limitation (was: Adding --no-add-suffix to zip patch)
Date: Thu, 09 Feb 2023 00:48:15 +0800	[thread overview]
Message-ID: <sdv4jrwozxv.fsf@fw.net.yu> (raw)
In-Reply-To: <sdv4jrxeeq3.fsf@fw.net.yu>

[-- Attachment #1: Type: text/plain, Size: 1539 bytes --]


Ruijie Yu via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> Cc: 61326@debbugs.gnu.org
>>> Date: Tue, 7 Feb 2023 09:31:11 +0800
>>> From:  Ruijie Yu via "Bug reports for GNU Emacs,
>>>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>>>
>>> Maybe, at least in the meantime, we change it such that all write operations
>>> for zip create files in temp, and move to / overwrite the original file when
>>> done? Although I don’t have a full understanding on how that would be done and
>>> whether there are problems along with it.
>>
>> How about submitting a patch to do that, but only when the original
>> file doesn't have an extension?
>
> Will do.  Will report back in 2-3 days unless someone else gets to it
> first.
>
> Best,
>
>
> RY

Here is a preliminary patch that contains some "REVIEW" comments where I
need inputs.  I have tested with the following recipe and things seem to
work correctly:

$ touch 1 2 && zip z 1 2 && mv z.zip z
$ ls -l
.... 1
.... 2
.... z
$ src/emacs -Q
RET          ; open file "1" from within "z" archive
s C-x C-s    ; insert "s" and save file "1"
C-x C-c      ; exit
$ ls -l      # notice that no "z.zip" exists, and "z" is correctly updated
.... 1
.... 2
.... z

Patch based on 907fd1f7ff402f9d226ebb3b891ea5b54fac1d1c which is ~3 days
old.  I will amend the commit (and rebase if necessary) according to ML
reviews and further progress.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-arc-mode.el-Work-around-zip-s-filename-limitati.patch --]
[-- Type: text/x-patch, Size: 6335 bytes --]

From bc086395929520a66eb928fd5d3baf6c9fa79bb5 Mon Sep 17 00:00:00 2001
From: Ruijie Yu <ruijie+git@netyu.xyz>
Date: Thu, 9 Feb 2023 00:45:19 +0800
Subject: [PATCH] lisp/arc-mode.el Work around zip's filename limitations on
 extension

[DRAFT PATCH]

Fixes 61326.  The "zip" executable requires that the named archive must have
an extension, else it attaches ".zip" to the supplied file name, causing
incorrect behaviors.  This patch looks for such scenarios and temporarily
rename extension-less archives so that "zip" would function correctly.

TODO:

1. Address all REVIEW points.
2. Make sure other write operations, in addition to zip-write-member, are
fixed.
3. Tests? (I might need some pointers as to where existing tests are and how
to write them.)
---
 lisp/arc-mode.el | 82 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 54 insertions(+), 28 deletions(-)

diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el
index 6f3e922880d..ac8c7cefa89 100644
--- a/lisp/arc-mode.el
+++ b/lisp/arc-mode.el
@@ -1350,42 +1350,61 @@ archive-write-file-member
       (setq last-coding-system-used archive-member-coding-system))
   t)

-(defun archive-*-write-file-member (archive descr command)
+;; REVIEW: is there a better name than AVOID-EXTLESS-P?
+(defun archive-*-write-file-member (archive descr command
+                                            &optional avoid-extless-p)
   (let* ((archive (expand-file-name archive))
          (ename (archive--file-desc-ext-file-name descr))
          (tmpfile (expand-file-name ename archive-tmpdir))
          (top (directory-file-name (file-name-as-directory archive-tmpdir)))
     (default-directory (file-name-as-directory top)))
+    ;; REVIEW: the diff here is because the previous code had TAB's
+    ;; (while assuming each TAB is 4 spaces), and my Emacs replaced
+    ;; them with spaces.  What is the status quo on this kind of diff?
+    ;; I can remove them if we consider this change excessive and/or
+    ;; intrusive.
     (unwind-protect
         (progn
           (make-directory (file-name-directory tmpfile) t)
-     ;; If the member is itself an archive, write it without
-     ;; the dired-like listing we created.
-     (if (eq major-mode 'archive-mode)
-         (archive-write-file tmpfile)
-       (write-region nil nil tmpfile nil 'nomessage))
-     ;; basic-save-buffer needs last-coding-system-used to have
-     ;; the value used to write the file, so save it before any
-     ;; further processing clobbers it (we restore it in
-     ;; archive-write-file-member, above).
-     (setq archive-member-coding-system last-coding-system-used)
-     (if (archive--file-desc-mode descr)
-         ;; Set the file modes, but make sure we can read it.
-         (set-file-modes tmpfile
-                         (logior ?\400 (archive--file-desc-mode descr))))
-     (setq ename
-       (encode-coding-string ename archive-file-name-coding-system))
+          ;; If the member is itself an archive, write it without
+          ;; the dired-like listing we created.
+          (if (eq major-mode 'archive-mode)
+              (archive-write-file tmpfile)
+            (write-region nil nil tmpfile nil 'nomessage))
+          ;; basic-save-buffer needs last-coding-system-used to have
+          ;; the value used to write the file, so save it before any
+          ;; further processing clobbers it (we restore it in
+          ;; archive-write-file-member, above).
+          (setq archive-member-coding-system last-coding-system-used)
+          (if (archive--file-desc-mode descr)
+              ;; Set the file modes, but make sure we can read it.
+              (set-file-modes tmpfile
+                              (logior ?\400 (archive--file-desc-mode descr))))
+          (setq ename
+                (encode-coding-string ename archive-file-name-coding-system))
           (let* ((coding-system-for-write 'no-conversion)
-        (default-directory (file-name-as-directory archive-tmpdir))
-        (exitcode (apply #'call-process
-                 (car command)
-                 nil
-                 nil
-                 nil
-                 (append (cdr command)
-                     (list archive ename)))))
-            (or (zerop exitcode)
-       (error "Updating was unsuccessful (%S)" exitcode))))
+                 (default-directory (file-name-as-directory archive-tmpdir))
+                 (safe-archive
+                  (if avoid-extless-p
+                      (make-temp-name
+                       (expand-file-name (concat archive "_tmp.")))
+                    archive))
+                 (maybe-rename
+                  (lambda (newname)
+                    (when avoid-extless-p
+                      (with-current-buffer archive-superior-buffer
+                        (rename-visited-file newname))))))
+            ;; REVIEW: is `unwind-protect' necessary here?
+            (prog2 (funcall maybe-rename safe-archive)
+                (let ((exitcode
+                       (apply #'call-process (car command)
+                              nil nil nil
+                              (append (cdr command)
+                                      (list safe-archive ename)))))
+                  (or (zerop exitcode)
+                      (error "Updating was unsuccessful (%S)"
+                             exitcode)))
+              (funcall maybe-rename archive))))
       (archive-delete-local tmpfile))))

 (defun archive-write-file (&optional file)
@@ -2048,12 +2067,19 @@ archive--file-desc-case-fiddled
   (not (eq (archive--file-desc-int-file-name fd)
            (archive--file-desc-ext-file-name fd))))

+(defun archive--file-name-zip-extless-p (fname)
+  ;; zip's rule: if the filename contains "." anywhere in the name
+  ;; (including obscure names like ".foo" and "bar."), then this
+  ;; filename is considered to have an extension.
+  (not (seq-contains-p (file-name-nondirectory fname) ?. #'eq)))
+
 (defun archive-zip-write-file-member (archive descr)
   (archive-*-write-file-member
    archive
    descr
    (if (archive--file-desc-case-fiddled descr)
-       archive-zip-update-case archive-zip-update)))
+       archive-zip-update-case archive-zip-update)
+   (archive--file-name-zip-extless-p archive)))

 (defun archive-zip-chmod-entry (newmode files)
   (save-restriction
--
2.39.1


[-- Attachment #3: Type: text/plain, Size: 12 bytes --]


Best,


RY

  parent reply	other threads:[~2023-02-08 16:48 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-06 17:00 bug#61326: 30.0.50; Editing fil in zip file without extension save creates new file Adam Sjøgren via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-06 18:04 ` Eli Zaretskii
2023-02-06 18:15   ` Adam Sjøgren via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-06 18:57 ` bug#61326: Adding --no-add-suffix to zip patch Adam Sjøgren via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-07  1:31   ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-07  3:27     ` Eli Zaretskii
2023-02-07 13:53       ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-07 14:54         ` Eli Zaretskii
2023-02-08 16:48         ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2023-02-08 18:02           ` bug#61326: [DRAFT PATCH] Work around zip's filename extension limitation (was: Adding --no-add-suffix to zip patch) Eli Zaretskii
2023-02-10  8:40             ` bug#61326: [DRAFT PATCH v2] " Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-13 10:35               ` bug#61326: [DRAFT PATCH v3] " Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-04 11:21                 ` Eli Zaretskii
2023-03-04 14:56                   ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-04 15:12                     ` Eli Zaretskii
2023-03-05 15:23                       ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-05 15:52                         ` Eli Zaretskii
2023-03-06  4:05                           ` bug#61326: [DRAFT PATCH v4] " Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-11  8:54                             ` Eli Zaretskii
2023-03-11  8:57                               ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-17  3:19                                 ` bug#61326: [DRAFT PATCH v5] " Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-17  8:48                                   ` bug#61326: [PATCH " Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-20  7:47                                     ` Eli Zaretskii
2023-04-20  8:49                                       ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-20  9:29                                         ` Eli Zaretskii
2023-02-07 19:59     ` bug#61326: Adding --no-add-suffix to zip patch Adam Sjøgren via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-08  1:21       ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-08  3:28         ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sdv4jrwozxv.fsf@fw.net.yu \
    --to=bug-gnu-emacs@gnu.org \
    --cc=61326@debbugs.gnu.org \
    --cc=asjo@koldfront.dk \
    --cc=eliz@gnu.org \
    --cc=ruijie@netyu.xyz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).