1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-31 20:02:42 +00:00

* net/tramp-imap.el (top): Add X-Size' to imap-hash-headers'.

(tramp-imap-do-copy-or-rename-file): Don't use the inode, when
calling `tramp-imap-put-file'.  Add file size to the call.
(tramp-imap-get-file-entries): Compute also user name, file size,
and date.
(tramp-imap-handle-insert-directory): Insert uid and gid.
(tramp-imap-handle-file-attributes): Transform uid and gid
according to `id-format'.
(tramp-imap-put-file): New optional parameter SIZE.  Encode file
size in header X-Size.
This commit is contained in:
Michael Albinus 2009-10-27 10:53:06 +00:00
parent b8c5de8f13
commit 9be01a63e3
2 changed files with 57 additions and 19 deletions

View File

@ -1,3 +1,16 @@
2009-10-27 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-imap.el (top): Add `X-Size' to `imap-hash-headers'.
(tramp-imap-do-copy-or-rename-file): Don't use the inode, when
calling `tramp-imap-put-file'. Add file size to the call.
(tramp-imap-get-file-entries): Compute also user name, file size,
and date.
(tramp-imap-handle-insert-directory): Insert uid and gid.
(tramp-imap-handle-file-attributes): Transform uid and gid
according to `id-format'.
(tramp-imap-put-file): New optional parameter SIZE. Encode file
size in header X-Size.
2009-10-26 Juanma Barranquero <lekktu@gmail.com>
* simple.el (transpose-subr): Give clearer error when the mark

View File

@ -60,6 +60,9 @@
(require 'epa)
(autoload 'auth-source-user-or-password "auth-source")
;; We use the additional header "X-Size" for encoding the size of a file.
(add-to-list 'imap-hash-headers 'X-Size 'append)
;; Define Tramp IMAP method ...
(defconst tramp-imap-method "imap"
"*Method to connect via IMAP protocol.")
@ -243,8 +246,7 @@ of `copy' and `rename'."
(tramp-imap-put-file
v (current-buffer)
(tramp-imap-file-name-name v)
(tramp-imap-get-file-inode newname)
nil))
nil nil (nth 7 (file-attributes filename))))
;; One of them is not located on a IMAP mailbox.
(insert-file-contents filename)
(write-region (point-min) (point-max) newname)))
@ -319,17 +321,25 @@ SIZE MODE WEIRD INODE DEVICE)."
(imap-hash-map (lambda (uid headers body)
(let ((subject (substring
(aget headers 'Subject "")
(length tramp-imap-subject-marker))))
(length tramp-imap-subject-marker)))
(from (aget headers 'From ""))
(date (date-to-time (aget headers 'Date "")))
(size (string-to-number
(or (aget headers 'X-Size "0") "0"))))
(setq from
(if (string-match "<\\([^@]+\\)@" from)
(match-string 1 from)
"nobody"))
(list
subject
nil
-1
1
1
'(0 0)
'(0 0)
'(0 0)
1
from
"nogroup"
date
date
date
size
"-rw-rw-rw-"
nil
uid
@ -440,7 +450,8 @@ SIZE MODE WEIRD INODE DEVICE)."
"%10s %3d %-8s %-8s %8s %s "
(nth 9 x) ; mode
(nth 11 x) ; inode
"nobody" "nogroup"
(nth 3 x) ; uid
(nth 4 x) ; gid
(nth 8 x) ; size
(format-time-string
(if (tramp-time-less-p
@ -499,7 +510,11 @@ SIZE MODE WEIRD INODE DEVICE)."
(defun tramp-imap-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp-IMAP FILENAME."
(with-parsed-tramp-file-name (expand-file-name filename) nil
(cdr-safe (nth 0 (tramp-imap-get-file-entries v localname)))))
(let ((res (cdr-safe (nth 0 (tramp-imap-get-file-entries v localname)))))
(unless (or (null res) (eq id-format 'string))
(setcar (nthcdr 2 res) 1)
(setcar (nthcdr 3 res) 1))
res)))
(defun tramp-imap-get-file-inode (filename &optional id-format)
"Get inode equivalent \(actually the UID) for Tramp-IMAP FILENAME."
@ -560,10 +575,13 @@ SIZE MODE WEIRD INODE DEVICE)."
(tramp-message v 4 "Fetching %s to tmp file %s...done" filename tmpfile)
tmpfile))))
(defun tramp-imap-put-file (vec filename-or-buffer &optional subject inode encode)
(defun tramp-imap-put-file
(vec filename-or-buffer &optional subject inode encode size)
"Write contents of FILENAME-OR-BUFFER to Tramp-IMAP file VEC with name SUBJECT.
When INODE is given, delete that old remote file after writing the new one
\(normally this is the old file with the same name)."
\(normally this is the old file with the same name). A non-nil ENCODE
forces the encoding of the buffer or file. SIZE, when available, indicates
the file size; this is needed, if the file or buffer is already encoded."
;; `tramp-current-host' is used in `tramp-imap-passphrase-callback-function'.
(let ((tramp-current-host (tramp-file-name-real-host vec))
(iht (tramp-imap-make-iht vec)))
@ -573,7 +591,18 @@ When INODE is given, delete that old remote file after writing the new one
(format
"%s%s"
tramp-imap-subject-marker
(or subject "no subject"))))
(or subject "no subject")))
(cons
'X-Size
(number-to-string
(cond
((numberp size) size)
((bufferp filename-or-buffer)
(buffer-size filename-or-buffer))
((stringp filename-or-buffer)
(nth 7 (file-attributes filename-or-buffer)))
;; We don't know the size.
(t -1)))))
(cond ((bufferp filename-or-buffer)
(with-current-buffer filename-or-buffer
(if encode
@ -748,11 +777,7 @@ With NEEDED-SUBJECT, alters the imap-hash test accordingly."
;; "/imaps:imap.gmail.com:/INBOX.test/" results in error
;; "error in process filter: Internal error, tag 5 status BAD code nil text UNSELECT not allowed now."
;; * Improve `tramp-imap-handle-file-attributes'
;; - size
;; - modification time
;; - user
;; - Return info for directories.
;; * Improve `tramp-imap-handle-file-attributes' for directories.
;; * Saving a file creates a second one, instead of overwriting.