Subject: 23.1.91; Deleting directories causes unusable file layout in freedesktop trashcan

From: Tassilo Horn <[email-masked]>
Date: Thu, 21 Jan 2010 13:50:49 +0100

I have `delete-by-moving-to-trash' enabled.  When I delete a directory
with `M-x delete-directory' or using `D' in dired on a directory and say
that I want to delete it recursively, the freedesktop trashcan contains
entries for each file deleted, and not only one entry for the whole
directory.

For example, I delete the directory ~/foo with these contents:

    ~/foo/
    ~/foo/bar/
    ~/foo/bar/test.txt

After that, the freedesktop trashcan contains these Entries:

--8<---------------cut here---------------start------------->8---
  /home/horn/.local/share/Trash/files:
  total used in directory 20K available 70801444
  drwx------ 4 horn horn 4.0K Jan 21 13:42 .
  drwxr-xr-x 4 horn horn 4.0K Jan 21 13:42 ..
  drwxr-xr-x 2 horn horn 4.0K Jan 21 13:42 bar                 ###
  drwxr-xr-x 2 horn horn 4.0K Jan 21 13:42 foo
  -rw-r--r-- 1 horn horn    1 Jan 21 13:42 test.txt            ###

  /home/horn/.local/share/Trash/info:
  total used in directory 20K available 70801444
  drwx------ 2 horn horn 4.0K Jan 21 13:42 .
  drwxr-xr-x 4 horn horn 4.0K Jan 21 13:42 ..
  -rw-r--r-- 1 horn horn   74 Jan 21 13:42 bar.trashinfo       ###
  -rw-r--r-- 1 horn horn   70 Jan 21 13:42 foo.trashinfo
  -rw-r--r-- 1 horn horn   83 Jan 21 13:42 test.txt.trashinfo  ###
--8<---------------cut here---------------end--------------->8---

The lines marked with ### are wrong.  `delete-directory' should keep the
structure of the deleted directory and move it as a whole to the trash.
Else, it's nearly impossible to restore the top level dir foo including
all contents again, and that's what the trashcan if for, right?

In GNU Emacs 23.1.91.1 (x86_64-pc-linux-gnu, GTK+ Version 2.18.6)
 of 2010-01-19 on thinkpad
Windowing system distributor `The X.Org Foundation', version 11.0.10704000
configured using `configure  '--prefix=/usr' '--build=x86_64-pc-linux-gnu' '--host=x86_64-pc-linux-gnu' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc' '--localstatedir=/var/lib' '--libdir=/usr/lib64' '--program-suffix=-emacs-23-vcs' '--infodir=/usr/share/info/emacs-23-vcs' '--with-sound' '--with-x' '--without-gconf' '--without-toolkit-scroll-bars' '--with-gif' '--with-jpeg' '--with-png' '--with-rsvg' '--with-tiff' '--with-xpm' '--with-xft' '--with-libotf' '--with-m17n-flt' '--with-x-toolkit=gtk' '--without-hesiod' '--without-kerberos' '--without-kerberos5' '--with-gpm' '--with-dbus' 'build_alias=x86_64-pc-linux-gnu' 'host_alias=x86_64-pc-linux-gnu' 'CFLAGS=-march=core2 -O2 -pipe' 'LDFLAGS=-Wl,-z,now''

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Dired by name

Minor modes in effect:
  gnus-dired-mode: t
  auto-revert-mode: t
  diff-auto-refine-mode: t
  rcirc-track-minor-mode: t
  dired-omit-mode: t
  recentf-mode: t
  window-number-meta-mode: t
  window-number-mode: t
  exec-abbrev-cmd-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  global-subword-mode: t
  subword-mode: t
  global-hl-line-mode: t
  savehist-mode: t
  show-paren-mode: t
  tooltip-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
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
<down> <down> <down> <down> <down> <up> <up> <up> <up> 
<up> <up> <down> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <C-f8> <C-f8> 
<C-f8> <C-f8> <C-f8> <C-f8> <C-f8> C-h f <return> M-. 
C-g M-2 <tab> <return> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
C-x k <return> C-x C-b <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <up> <up> 
m m <down> m <up> <up> D y <down> <down> <return> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <return> <return> 
+ t e s t <return> <return> C-x C-f f o o . t x t <return> 
C-x C-s C-x k <return> g <up> g g g ^ <return> C-x 
C-f f o o . t x t <return> C-x C-s <return> C-x C-s 
C-x k <return> ^ ^ C-x d <M-backspace> . l e <tab> 
<backspace> <backspace> <backspace> <backspace> <backspace> 
<backspace> o c <tab> s <tab> <return> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <up> 
<return> m m D y y y <up> C-x x d e l e <tab> d i r 
<tab> e <tab> <return> <return> y ^ <return> C-x b 
<return> D y y C-x b <return> <return> <return> ^ <down> 
<down> <return> ^ ^ <down> <return> M-x t r q <backspace> 
<backspace> <backspace> r e b <return>

Recent messages:
Omitting...
(Nothing to omit)
Omitting...
(Nothing to omit)
Omitting...
(Nothing to omit)
Omitting...
(Nothing to omit)
Omitting...
(Nothing to omit)

Load-path shadows:
~/repos/el/org-mode/lisp/org-bbdb hides /usr/share/emacs/23.1.91/lisp/org/org-bbdb
~/repos/el/org-mode/lisp/org-habit hides /usr/share/emacs/23.1.91/lisp/org/org-habit
~/repos/el/org-mode/lisp/org-colview hides /usr/share/emacs/23.1.91/lisp/org/org-colview
~/repos/el/org-mode/lisp/org-footnote hides /usr/share/emacs/23.1.91/lisp/org/org-footnote
~/repos/el/org-mode/lisp/org-freemind hides /usr/share/emacs/23.1.91/lisp/org/org-freemind
~/repos/el/org-mode/lisp/org-compat hides /usr/share/emacs/23.1.91/lisp/org/org-compat
~/repos/el/org-mode/lisp/org-icalendar hides /usr/share/emacs/23.1.91/lisp/org/org-icalendar
~/repos/el/org-mode/lisp/org-clock hides /usr/share/emacs/23.1.91/lisp/org/org-clock
~/repos/el/org-mode/lisp/org-bibtex hides /usr/share/emacs/23.1.91/lisp/org/org-bibtex
~/repos/el/org-mode/lisp/org-indent hides /usr/share/emacs/23.1.91/lisp/org/org-indent
~/repos/el/org-mode/lisp/org-faces hides /usr/share/emacs/23.1.91/lisp/org/org-faces
~/repos/el/org-mode/lisp/org-timer hides /usr/share/emacs/23.1.91/lisp/org/org-timer
~/repos/el/org-mode/lisp/org-vm hides /usr/share/emacs/23.1.91/lisp/org/org-vm
~/repos/el/org-mode/lisp/org-list hides /usr/share/emacs/23.1.91/lisp/org/org-list
~/repos/el/org-mode/lisp/org-gnus hides /usr/share/emacs/23.1.91/lisp/org/org-gnus
~/repos/el/org-mode/lisp/org-crypt hides /usr/share/emacs/23.1.91/lisp/org/org-crypt
~/repos/el/org-mode/lisp/org-exp hides /usr/share/emacs/23.1.91/lisp/org/org-exp
~/repos/el/org-mode/lisp/org-protocol hides /usr/share/emacs/23.1.91/lisp/org/org-protocol
~/repos/el/org-mode/lisp/org-inlinetask hides /usr/share/emacs/23.1.91/lisp/org/org-inlinetask
~/repos/el/org-mode/lisp/org-wl hides /usr/share/emacs/23.1.91/lisp/org/org-wl
~/repos/el/org-mode/lisp/org-plot hides /usr/share/emacs/23.1.91/lisp/org/org-plot
~/repos/el/org-mode/lisp/org-w3m hides /usr/share/emacs/23.1.91/lisp/org/org-w3m
~/repos/el/org-mode/lisp/org-agenda hides /usr/share/emacs/23.1.91/lisp/org/org-agenda
~/repos/el/org-mode/lisp/org-archive hides /usr/share/emacs/23.1.91/lisp/org/org-archive
~/repos/el/org-mode/lisp/org-attach hides /usr/share/emacs/23.1.91/lisp/org/org-attach
~/repos/el/org-mode/lisp/org-latex hides /usr/share/emacs/23.1.91/lisp/org/org-latex
~/repos/el/org-mode/lisp/org-mhe hides /usr/share/emacs/23.1.91/lisp/org/org-mhe
~/repos/el/org-mode/lisp/org-irc hides /usr/share/emacs/23.1.91/lisp/org/org-irc
~/repos/el/org-mode/lisp/org-table hides /usr/share/emacs/23.1.91/lisp/org/org-table
~/repos/el/org-mode/lisp/org-info hides /usr/share/emacs/23.1.91/lisp/org/org-info
~/repos/el/org-mode/lisp/org-docbook hides /usr/share/emacs/23.1.91/lisp/org/org-docbook
~/repos/el/org-mode/lisp/org-ascii hides /usr/share/emacs/23.1.91/lisp/org/org-ascii
~/repos/el/org-mode/lisp/org-jsinfo hides /usr/share/emacs/23.1.91/lisp/org/org-jsinfo
~/repos/el/org-mode/lisp/org-id hides /usr/share/emacs/23.1.91/lisp/org/org-id
~/repos/el/org-mode/lisp/org-feed hides /usr/share/emacs/23.1.91/lisp/org/org-feed
~/repos/el/org-mode/lisp/org-xoxo hides /usr/share/emacs/23.1.91/lisp/org/org-xoxo
~/repos/el/org-mode/lisp/org-publish hides /usr/share/emacs/23.1.91/lisp/org/org-publish
~/repos/el/org-mode/lisp/org-exp-blocks hides /usr/share/emacs/23.1.91/lisp/org/org-exp-blocks
~/repos/el/org-mode/lisp/org-mew hides /usr/share/emacs/23.1.91/lisp/org/org-mew
~/repos/el/org-mode/lisp/org-mobile hides /usr/share/emacs/23.1.91/lisp/org/org-mobile
~/repos/el/org-mode/lisp/org-datetree hides /usr/share/emacs/23.1.91/lisp/org/org-datetree
~/repos/el/org-mode/lisp/org-remember hides /usr/share/emacs/23.1.91/lisp/org/org-remember
~/repos/el/org-mode/lisp/org-macs hides /usr/share/emacs/23.1.91/lisp/org/org-macs
~/repos/el/org-mode/lisp/org-mouse hides /usr/share/emacs/23.1.91/lisp/org/org-mouse
~/repos/el/org-mode/lisp/org-html hides /usr/share/emacs/23.1.91/lisp/org/org-html
~/repos/el/org-mode/lisp/org-install hides /usr/share/emacs/23.1.91/lisp/org/org-install
~/repos/el/org-mode/lisp/org-src hides /usr/share/emacs/23.1.91/lisp/org/org-src
~/repos/el/org-mode/lisp/org hides /usr/share/emacs/23.1.91/lisp/org/org
~/repos/el/org-mode/lisp/org-rmail hides /usr/share/emacs/23.1.91/lisp/org/org-rmail
~/repos/el/org-mode/lisp/org-mac-message hides /usr/share/emacs/23.1.91/lisp/org/org-mac-message

Features:
(shadow emacsbug ibuf-ext ibuffer gnus-dired autorevert cc-mode cc-fonts
cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs mule-util
cal-move find-func diff-mode diff org-colview mailalias arc-mode
archive-mode etags url-cache newst-plainview newst-ticker newst-reader
newst-backend gnus-fun rs-info bbdb-gui gnus-cite ansi-color flow-fill
gnus-async gnus-bcklg sort gnus-ml vc-dispatcher vc-svn newcomment
help-mode hippie-exp multi-isearch gnus-topic parse-time pop3 nnml utf-7
utf7 auth-source nnimap imap trace nndraft nnmh nnnil gnus-agent
gnus-srvr gnus-score score-mode nnvirtual nntp gnus-cache notmuch
bbdb-hooks bbdb-gnus bbdb-snarf mail-extr spam spam-stat bbdb-com
gnus-uu yenc gnus-msg smiley gnus-art mm-uu mml2015 epg-config mm-view
smime dig gnus-sum nnoo gnus-group gnus-undo nnmail mail-source
format-spec gnus-start gnus-spec gnus-int gnus-range gnus-win view solar
cal-dst holidays hol-loaddefs cal-iso garak elim warnings lui tracking
flyspell ispell incomplete rcirc-late-fix rcirc greqlscript-mode
greql-mode tg-mode generic th-latex swank-clojure clojure-mode
slime-repl slime apropos hideshow paredit wtf cus-edit cus-start
cus-load rdictcc appt diary-lib diary-loaddefs vc-git org-w3m org-irc
org-jsinfo org-infojs org-html org-exp org-exp-blocks org-info org-gnus
org-docview org-bibtex org-bbdb org-protocol org-attach org-id
org-agenda remember org-remember org-datetree org org-footnote org-src
org-list org-faces org-compat org-macs org-install cal-menu calendar
cal-loaddefs dired-x dired-aux pcomplete em-term term ehelp electric
esh-var esh-io esh-cmd esh-ext esh-proc esh-arg eldoc esh-groups eshell
esh-util esh-module esh-mode lisppaste xml-rpc xml th-boxquote boxquote
rect highlight-symbol hi-lock footnote smtpmail message idna sendmail
ecomplete rfc822 mml mml-sec password-cache mm-decode mm-bodies
mm-encode mailabbrev gmm-utils mailheader canlock sha1 hex-util hashcash
info server yasnippet dropdown-list noutline outline
highlight-parentheses browse-kill-ring derived filesets recentf
tree-widget sr-speedbar speedbar sb-image ezimage dframe ido
anything-config compile comint ring semantic/util-modes semantic/util
semantic semantic/tag semantic/lex semantic/fw eieio byte-opt bytecomp
byte-compile mode-local cedet imenu w3m-bookmark w3m browse-url doc-view
jka-compr image-mode w3m-hist w3m-fb w3m-ems w3m-ccl ccl w3m-favicon
w3m-image w3m-proc w3m-util bookmark pp ffap dired rx thingatpt anything
woman easymenu man assoc window-number uniquify exec-abbrev-cmd
undo-tree easy-mmode cl cl-19 subword hl-line saveplace savehist paren
th-private edmacro kmacro th-common mm-url gnus gnus-ems nnheader
gnus-util netrc mail-utils wid-edit url-http tls url url-proxy
url-privacy url-expand url-methods url-history mailcap url-auth
mail-parse rfc2231 rfc2047 rfc2045 qp ietf-drums time-date url-cookie
url-util url-parse url-gw url-vars mm-util mail-prsvr windmove
disp-table swank-clojure-autoloads advice help-fns advice-preload
clojure-mode-autoloads slime-repl-autoloads slime-autoloads package
reporter site-gentoo w3m-load bbdb-autoloads bbdb regexp-opt timezone
tex-site auto-loads tooltip ediff-hook vc-hooks lisp-float-type mwheel
x-win x-dnd font-setting tool-bar dnd fontset image fringe lisp-mode
register page menu-bar rfn-eshadow timer select scroll-bar mldrag mouse
jit-lock font-lock syntax facemenu font-core frame cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev
loaddefs button minibuffer faces cus-face files text-properties overlay
md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
font-render-setting gtk x-toolkit x multi-tty emacs)