X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/1f127172225467c5b5f0df08d84e1a5e18990f0e..2bfd6a0741cecfaacc83d69fb3e292c5f2053c53:/dired-async.el diff --git a/dired-async.el b/dired-async.el index 3f5349dad..41f2b7955 100644 --- a/dired-async.el +++ b/dired-async.el @@ -1,7 +1,6 @@ ;;; dired-async.el --- Copy/move/delete asynchronously in dired. -;; Copyright (C) 2012~2014 John Wiegley -;; Copyright (C) 2012~2014 Thierry Volpiatto +;; Copyright (C) 2012-2016 Free Software Foundation, Inc. ;; Authors: John Wiegley ;; Thierry Volpiatto @@ -167,7 +166,8 @@ See `dired-create-files' for the behavior of arguments." (downcase operation) from))) (if (not to) (setq skipped (cons (dired-make-relative from) skipped)) - (let* ((overwrite (file-exists-p to)) + (let* ((overwrite (and (null (eq file-creator 'backup-file)) + (file-exists-p to))) (dired-overwrite-confirmed ; for dired-handle-overwrite (and overwrite (let ((help-form '(format "\ @@ -255,9 +255,34 @@ ESC or `q' to not overwrite any of the remaining files, (require 'cl-lib) (require 'dired-aux) (require 'dired-x) ,(async-inject-variables dired-async-env-variables-regexp) (condition-case err - (let ((dired-recursive-copies (quote always))) - (cl-loop for (f . d) in (quote ,async-fn-list) - do (funcall (quote ,file-creator) f d t))) + (let ((dired-recursive-copies (quote always)) + (dired-copy-preserve-time + ,dired-copy-preserve-time)) + ;; Inline `backup-file' as long as it is not + ;; available in emacs. + (defalias 'backup-file + ;; Same feature as "cp --backup=numbered from to" + ;; Symlinks are copied as file from source unlike + ;; `dired-copy-file' which is same as cp -d. + ;; Directories are omitted. + (lambda (from to ok) + (cond ((file-directory-p from) (ignore)) + (t (let ((count 0)) + (while (let ((attrs (file-attributes to))) + (and attrs (null (nth 0 attrs)))) + (cl-incf count) + (setq to (concat (file-name-sans-versions to) + (format ".~%s~" count))))) + (condition-case err + (copy-file from to ok dired-copy-preserve-time) + (file-date-error + (push (dired-make-relative from) + dired-create-files-failures) + (dired-log "Can't set date on %s:\n%s\n" from err))))))) + ;; Now run the FILE-CREATOR function on files. + (cl-loop with fn = (quote ,file-creator) + for (from . dest) in (quote ,async-fn-list) + do (funcall fn from dest t))) (file-error (with-temp-file ,dired-async-log-file (insert (format "%S" err)))))