Subject: 30.1; When editing a remote file owned by another user, Tramp signals an error because it cannot change the file mode

From: Michael McClennen <[email-masked]>
Date: Thu, 29 May 2025 21:09:31 +0000

Current behavior of Emacs
-------------------------

1. Use Tramp to edit any remote file owned by a different user, where the
   file mode allows you to write to it.

2. Make a change to the file, and then save it.

3. The changes are saved, but the following error is thrown:
   "Error while changing file’s mode /scp:[hostname]:[filename]"

4. Make another change to the file, and save it again.

5. Emacs asks "[filename] has changed since it was last visited or
   saved. Save anyway?". This message is incorrect, since the file
   contents have not changed and were in fact saved correctly. Presumably, this
   question is triggered because the file mode is different than expected,
   but this particular case should not trigger this question.

Expected behavior
-----------------

1. Use Tramp to edit any remote file owned by a different user, where
   the file mode allows you to write to it.

2. Make a change to the file, and then save it.

3. The changes should be saved, and no error should be thrown. Perhaps
   the Tramp code could check whether the owner is different, and ignore
   the file mode if that is the case.

4. Make another change to the file, and save it again.

5. The save should occur without any questions, provided that the contents of
   the file have not changed on the remote server since the file was last
   visited or saved.

Why this is important
---------------------

When editing collaboratively with a remote partner, it is important that
Emacs should tell me truthfully whether or not my partner has changed
the file before I save it. If Tramp always flags a file owned by my
partner as having been changed since I saved it, I have no way to know
whether that is actually true or not.

In GNU Emacs 30.1 (build 1, x86_64-apple-darwin18.7.0, NS appkit-1671.60
 Version 10.14.6 (Build 18G9323)) of 2025-02-24 built on
 builder10-14.lan
Windowing system distributor 'Apple', version 10.3.2113
System Description:  macOS 12.7.1

Configured using:
 'configure --with-ns '--enable-locallisppath=/Library/Application
 Support/Emacs/${version}/site-lisp:/Library/Application
 Support/Emacs/site-lisp' --with-modules 'CFLAGS=-DFD_SETSIZE=10000
 -DDARWIN_UNLIMITED_SELECT' --with-x-toolkit=no'

Configured features:
ACL GLIB GMP GNUTLS JPEG LIBXML2 MODULES NOTIFY KQUEUE NS PDUMPER PNG
RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER ZLIB

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

Major mode: ELisp/l

Minor modes in effect:
  delete-selection-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-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
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/Users/michaelm/.emacs.d/elpa/eglot-1.18/eglot hides /Applications/Emacs.app/Contents/Resources/lisp/progmodes/eglot

Features:
(shadow sort mail-extr emacsbug message rfc822 mml mml-sec epa derived
epg rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
jka-compr cl-print debug backtrace find-func perl-mode grep compile
novice cl-extra noutline outline ispell tabify face-remap cus-edit pp
cus-start help-fns radix-tree yank-media mhtml-mode css-mode smie eww
url-queue thingatpt shr pixel-fill kinsoku url-file svg xml puny mm-url
gnus nnheader gnus-util text-property-search mail-utils range wid-edit
mm-util mail-prsvr color sgml-mode dom misearch multi-isearch vc-hg
vc-git diff-mode track-changes easy-mmode vc-bzr vc-dispatcher js
c-ts-common treesit imenu cc-mode cc-fonts cc-guess cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs tramp-cmds tramp-cache
time-stamp tramp-sh tramp trampver tramp-integration files-x
tramp-message help-mode tramp-compat xdg shell pcomplete comint ansi-osc
ring parse-time iso8601 time-date format-spec ansi-color tramp-loaddefs
dired-aux dired dired-loaddefs cperl-mode rx facemenu elec-pair delsel
cus-load info eglot-autoloads eldoc-diffstat-autoloads 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 icons
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/ns-win ns-win ucs-normalize mule-util term/common-win 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 kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 365713 99102) (symbols 48 19681 0) (strings 32 74564 3835)
 (string-bytes 1 2064538) (vectors 16 39135)
 (vector-slots 8 1144840 191291) (floats 8 256 544)
 (intervals 56 61413 464) (buffers 992 36))