Subject: bug#61326: 30.0.50; Editing fil in zip file without extension save creates new file

From: Adam Sjøgren <[email-masked]>
Date: Mon, 06 Feb 2023 18:00:14 +0100

If I open a zip archive in Emacs, I get a listing of files within the
archive, and I can edit the files by pressing RET, and if I then save
the file, Emacs updates the archive.

However, if the zip archive doesn't have ".zip" (or ".jar") at the end
of the filename, Emacs instead of updating the archive opened, creates a
new archive with ".zip" added.

Example:

    $ echo ABBA > a.txt
    $ zip a.zip a.txt
      adding: a.txt (stored 0%)
    $ mv a.zip extless
    $ ls
    a.txt  extless
    $ emacs -Q extless 
    $ # RET on a.txt, add to content, save
    $ ls
    a.txt  extless  extless.zip
    $ 

I was expecting the zip archive I opened, "extless" to be updated,
instead of a new file "extless.zip" appearing.

The expected behaviour is useful when editing e.g. "zipimport" binaries,
such as yt-dlp: https://github.com/yt-dlp/yt-dlp#release-files

In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.36, cairo version 1.16.0) of 2023-01-15 built on tullinup
Repository revision: b017c0453c73798c30b2f046bfa62a57cf6ea72b
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101006
System Description: Debian GNU/Linux bookworm/sid

Configured using:
 'configure -C --with-tree-sitter --with-librsvg --with-xinput2
 --without-pgtk --with-native-compilation=aot'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3
THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2
XPM GTK3 ZLIB

Important settings:
  value of $LANG: en_GB.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Group

Minor modes in effect:
  gnus-topic-mode: t
  gnus-undo-mode: t
  age-encryption-mode: t
  pixel-scroll-precision-mode: t
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  dumb-jump-mode: t
  shell-dirtrack-mode: t
  which-function-mode: t
  global-auto-complete-mode: t
  save-place-mode: t
  jabber-activity-mode: t
  winner-mode: t
  server-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  buffer-read-only: t
  line-number-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
~/elisp/let-alist/let-alist hides ~/elisp/extra/let-alist
/home/asjo/elisp/boxquote.el/boxquote hides ~/elisp/extra/boxquote
~/elisp/let-alist/let-alist hides /usr/src/emacs/lisp/emacs-lisp/let-alist

Features:
(shadow bbdb-message emacsbug shr-color executable js-mode-expansions js
c-ts-mode treesit cc-mode-expansions cc-mode cc-fonts cc-guess cc-menus
cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs flow-fill rng-xsd
xsd-regexp rng-cmpct nxml-mode-expansions rng-nxml rng-valid rng-loc
rng-uri rng-parse nxml-parse rng-match rng-dt rng-util rng-pttrn nxml-ns
nxml-mode nxml-outln nxml-rap nxml-util nxml-enc xmltok jka-compr
mm-archive bbdb-gnus-aux qp mule-util url-http url-gw url-auth
gnus-gravatar gravatar sort smiley gnus-cite textsec uni-scripts
idna-mapping ucs-normalize uni-confusable textsec-check gnus-bcklg
gnus-async gnus-dup gnus-ml disp-table gnus-topic utf-7 imap rfc2104
face-remap epa-file network-stream nsm nnml bbdb-gnus bbdb-mua nnnil
gnus-demon gnus-delay gnus-draft gnus-agent gnus-srvr gnus-score
score-mode nnvirtual nntp gnus-cache nndraft nnmh mail-extr spam
spam-stat bbdb-com gnus-uu yenc gnus-msg gnus-html url-queue help-fns
radix-tree url-cache mm-url bbdb-picture gnus-art mm-uu mml2015 mm-view
mml-smime smime dig gnus-sum shr pixel-fill kinsoku url-file svg
gnus-group gnus-undo gnus-fun hashcash gnus-start gnus-dbus gnus-cloud
nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range
gnus-win gnus nnheader range flymake-proc flymake time age pixel-scroll
cua-base litable magithub magithub-ci magithub-issue magithub-cache
magithub-core magit-submodule magit-obsolete magit-popup magit-blame
magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch
magit-clone magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset
magit-files magit-refs magit-status magit magit-repos magit-apply
magit-wip magit-log magit-diff smerge-mode diff git-commit log-edit
message sendmail yank-media rfc822 mml mml-sec epa epg rfc6068
epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils
gmm-utils mailheader pcvs-util magit-core magit-autorevert autorevert
filenotify magit-margin magit-transient magit-process with-editor
magit-mode magit-git magit-section benchmark magit-utils vc-git
diff-mode ido crm markdown-mode color noutline outline rg pcase
rg-info-hack rg-menu transient rg-ibuffer ibuf-macs rg-result wgrep-rg
rg-history rg-header ibuf-ext ibuffer ibuffer-loaddefs wgrep grep
compile text-property-search dumb-jump f dash s etags fileloop generator
xref project tramp tramp-loaddefs trampver tramp-integration cus-edit pp
cus-load files-x tramp-compat shell pcomplete parse-time iso8601 ls-lisp
auto-loads tex-site expand-region subword-mode-expansions
cperl-mode-expansions text-mode-expansions html-mode-expansions
er-basic-expansions thingatpt expand-region-core expand-region-custom
which-func cperl-mode auto-complete-config auto-complete edmacro kmacro
popup debian-changelog-mode imenu add-log dpkg-dev-el saveplace vc
vc-dispatcher bbdb bbdb-site timezone bbdb-loaddefs julia-mode
julia-mode-latexsubs boxquote rect jabber-last-message-correction
jabber-http-file-upload jabber-print-html jabber-otr jabber
jabber-notifications notifications jabber-libnotify dbus jabber-awesome
jabber-osd jabber-wmii jabber-xmessage jabber-festival jabber-sawfish
jabber-ratpoison jabber-tmux jabber-screen jabber-socks5
jabber-ft-server jabber-si-server jabber-ft-client jabber-ft-common
jabber-si-client jabber-si-common jabber-feature-neg jabber-truncate
jabber-time jabber-autoaway time-date jabber-vcard-avatars
jabber-chatstates jabber-events jabber-vcard jabber-avatar
jabber-activity jabber-watch jabber-modeline easy-mmode advice
jabber-ahc-presence jabber-ahc jabber-version jabber-ourversion
jabber-muc-nick-completion hippie-exp comint ansi-osc ansi-color
jabber-browse jabber-search jabber-register jabber-roster format-spec
jabber-presence jabber-muc jabber-bookmarks jabber-private
jabber-muc-nick-coloring hexrgb jabber-widget jabber-disco wid-edit
jabber-chat jabber-history jabber-chatbuffer jabber-alert jabber-iq
jabber-core jabber-console derived sgml-mode facemenu dom ewoc
jabber-keymap jabber-sasl sasl sasl-anonymous sasl-login sasl-plain fsm
jabber-logon jabber-conn comp comp-cstr warnings icons rx cl-extra
help-mode srv dns starttls tls jabber-xml xml jabber-menu jabber-util cl
winner ring gnutls puny find-file-from-selection find-lisp dired
dired-loaddefs cap-words superword subword server finder-inf package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache
json subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs
cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify lcms2 dynamic-setting system-font-setting
font-render-setting cairo move-toolbar gtk x-toolkit xinput2 x multi-tty
make-network-process native-compile emacs)

Memory information:
((conses 16 1135254 142749)
 (symbols 48 43507 17)
 (strings 32 298866 21178)
 (string-bytes 1 12616608)
 (vectors 16 98259)
 (vector-slots 8 3113739 175347)
 (floats 8 750 1097)
 (intervals 56 795 371)
 (buffers 984 33))

-- 
 "Den ene mands loft                                        Adam Sjøgren
  Er den anden mands gulv"                             [email-masked]