bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#58919: 28.2; dired-copy-file-recursive fails to overwrite directory


From: Thierry Volpiatto
Subject: bug#58919: 28.2; dired-copy-file-recursive fails to overwrite directory
Date: Mon, 31 Oct 2022 08:54:28 +0000

This is a followup of this report on reddit:
https://www.reddit.com/r/emacs/comments/yha104/merging_directories_in_dired_am_i_doing_it_wrong/

When using dired-copy to copy a directory to another directory
containing a directory with the same name overwriting fails.
e.g. copy ~/tmp/test/foo/ to ~/tmp/test1/ fails when test1 contain foo/

The bug is IMHO in copy-directory 3th clause of this cond:

(cond ((not (directory-name-p newname))
       ;; If NEWNAME is not a directory name, create it;
       ;; that is where we will copy the files of DIRECTORY.
       (make-directory newname parents))
      ;; NEWNAME is a directory name.  If COPY-CONTENTS is non-nil,
      ;; create NEWNAME if it is not already a directory;
      ;; otherwise, create NEWNAME/[DIRECTORY-BASENAME].
      ((if copy-contents
           (or parents (not (file-directory-p newname)))
         (setq newname (concat newname
                               (file-name-nondirectory directory))))
       (make-directory (directory-file-name newname) parents))
      (t (setq follow t)))

This change was introduced here:

commit 047f02f00f602b9aef63ae8938e12f3f0ab481eb
Author: Paul Eggert <eggert@cs.ucla.edu>
Date:   Wed Sep 20 11:49:12 2017 -0700

    Fix new copy-directory bug with empty dirs
    
    Problem reported by Afdam Plaice (Bug#28520) and by Eli Zaretskii
    (Bug#28483#34).  This is another bug that I introduced in my
    recent copy-directory changes.
    * lisp/files.el (copy-directory): Work with empty subdirectories, too.
    * test/lisp/files-tests.el (files-tests--copy-directory):
    Test for this bug.

Reverting this change fix the bug.

Using this should also fix the bug (based on my 2012 changes), not sure
though if it fix the bug described in the above commit.

(cond ((not (directory-name-p newname))
       ;; If NEWNAME is not a directory name, create it;
       ;; that is where we will copy the files of DIRECTORY.
       (make-directory newname parents))
      ;; NEWNAME is a directory name.  If COPY-CONTENTS is non-nil,
      ;; create NEWNAME if it is not already a directory;
      ;; otherwise, create NEWNAME/[DIRECTORY-BASENAME].
      ((and copy-contents
            (or parents (not (file-directory-p newname))))
       (make-directory (directory-file-name newname) parents))
      ((not copy-contents)
       (setq newname (concat newname
                             (file-name-nondirectory directory)))
       (and (file-exists-p newname)
            (not (file-directory-p newname))
            (error "Cannot overwrite non-directory %s with a directory"
                   newname))
       (make-directory newname t))
      (t (setq follow t)))

It also make readable the clauses handling copy-contents...



In GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, Motif Version 2.3.8, cairo 
version 1.16.0)
 of 2022-09-12 built on IPad-S340
Windowing system distributor 'The X.Org Foundation', version 11.0.12013000
System Description: Linux Mint 20.3

Configured using:
 'configure CFLAGS=-O8 --with-mailutils --with-cairo --without-dbus
 --without-gconf --without-gsettings --with-x-toolkit=motif'

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

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

Major mode: ƐĽ

Minor modes in effect:
  bug-reference-prog-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  psession-mode: t
  psession-savehist-mode: t
  global-git-gutter-mode: t
  git-gutter-mode: t
  display-time-mode: t
  winner-mode: t
  helm-epa-mode: t
  helm-descbinds-mode: t
  helm-adaptive-mode: t
  helm-mode: t
  helm-minibuffer-history-mode: t
  helm-ff-icon-mode: t
  shell-dirtrack-mode: t
  helm-popup-tip-mode: t
  async-bytecomp-package-mode: t
  minibuffer-depth-indicate-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  auto-fill-function: do-auto-fill
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow epa-mail face-remap emacsbug vc-annotate sort gnus-cite w3m-form
w3m-symbol w3m doc-view jka-compr timezone w3m-hist w3m-fb bookmark-w3m
w3m-ems w3m-favicon w3m-image tab-line w3m-proc w3m-util mm-archive qp
smiley mail-extr addressbook-bookmark tv-mu4e-config mu4e-contrib eshell
esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups
esh-util mu4e-patch mu4e mu4e-org mu4e-main mu4e-view gnus-art mm-uu
mml2015 mm-view mml-smime smime dig gnus-sum gnus-group gnus-undo
gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 netrc
nnoo gnus-spec gnus-int gnus-range gnus-win mu4e-headers mu4e-compose
mu4e-draft mu4e-actions smtpmail sendmail mu4e-search mu4e-lists
mu4e-bookmarks mu4e-mark mu4e-message shr kinsoku svg flow-fill hl-line
mu4e-contacts mu4e-update mu4e-folders mu4e-server mu4e-context
mu4e-obsolete mu4e-vars mu4e-helpers mu4e-config ido helm-firefox
helm-dabbrev help-fns radix-tree debug cl-print cus-start helm-command
helm-x-files helm-for-files dired-x image-file image-converter char-fold
tramp-archive tramp-gvfs dbus bug-reference naquadah-theme view solar
cal-dst holidays hol-loaddefs tv-utils osm dom yaml-mode undo-tree diff
queue psession frameset log-view pcvs-util bash-completion cl-indent
pcase ffap thingatpt autocrypt-message message rmc puny rfc822 mml
mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader autocrypt-gnus gnus nnheader gnus-util rmail
rmail-loaddefs rfc2047 rfc2045 mail-utils mm-util mail-prsvr
autocrypt-mu4e autocrypt ietf-drums config-w3m git-gutter mule-util appt
diary-lib diary-loaddefs gud wdired dired-extension org-config
ob-gnuplot org-crypt net-utils time winner autotest-mode autoconf-mode
woman man ediff ediff-merg ediff-mult ediff-wind ediff-diff ediff-help
ediff-init ediff-util init-helm helm-ls-git vc-git diff-mode vc
vc-dispatcher helm-fd epa derived epg rfc6068 epg-config helm-epa
helm-imenu imenu helm-elisp-package helm-find helm-org org ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src ob-comint
org-pcomplete org-list org-faces org-entities noutline outline
org-version ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex ol
rx org-keys oc org-compat advice org-macs org-loaddefs cal-menu calendar
cal-loaddefs helm-external isl helm-descbinds helm-wikipedia
all-the-icons all-the-icons-faces data-material data-weathericons
data-octicons data-fileicons data-faicons data-alltheicons wfnames
cus-edit wid-edit helm-ipython helm-elisp helm-eval edebug backtrace
find-func python tramp-sh popup helm-bookmark helm-net xml helm-info
bookmark pp helm-adaptive helm-mode helm-misc helm-files image-dired
image-mode exif filenotify tramp tramp-loaddefs trampver
tramp-integration files-x tramp-compat shell pcomplete parse-time
iso8601 time-date ls-lisp helm-buffers helm-occur helm-tags helm-locate
helm-grep wgrep-helm wgrep grep compile text-property-search comint ring
helm-regexp format-spec ansi-color helm-utils helm-help helm-types
helm-extensions-autoloads helm-config helm-autoloads helm
helm-global-bindings helm-easymenu helm-core async-bytecomp helm-source
helm-multi-match helm-lib dired-async dired-aux dired dired-loaddefs
async diminish cl-extra help-mode mb-depth server edmacro kmacro avoid
cus-load use-package use-package-ensure use-package-delight
use-package-diminish use-package-bind-key bind-key easy-mmode
use-package-core finder-inf package browse-url url url-proxy url-privacy
url-expand url-methods url-history url-cookie url-domsuf url-util
mailcap url-handlers url-parse auth-source cl-seq eieio eieio-core
cl-macs eieio-loaddefs password-cache json subr-x map url-vars seq
byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib info w3m-load
iso-transl tooltip 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 cl-generic
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 simple abbrev obarray
cl-preloaded nadvice button loaddefs faces cus-face macroexp files
window text-properties overlay sha1 md5 base64 format env code-pages
mule custom widget hashtable-print-readable backquote threads inotify
lcms2 dynamic-setting font-render-setting cairo motif x-toolkit x
multi-tty make-network-process emacs)

Memory information:
((conses 16 824596 90080)
 (symbols 48 43448 5)
 (strings 32 266727 16954)
 (string-bytes 1 8033636)
 (vectors 16 86864)
 (vector-slots 8 1908060 113478)
 (floats 8 2769 951)
 (intervals 56 23817 13089)
 (buffers 992 107))
<#secure method=pgpmime mode=sign>

-- 
Thierry





reply via email to

[Prev in Thread] Current Thread [Next in Thread]