Function: tramp-gvfs-handle-file-attributes

tramp-gvfs-handle-file-attributes is a byte-compiled function defined in tramp-gvfs.el.gz.

Signature

(tramp-gvfs-handle-file-attributes FILENAME &optional ID-FORMAT)

Documentation

Like file-attributes for Tramp files.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-gvfs.el.gz
(defun tramp-gvfs-handle-file-attributes (filename &optional id-format)
  "Like `file-attributes' for Tramp files."
  (unless id-format (setq id-format 'integer))
  (let ((attributes (tramp-gvfs-get-file-attributes filename))
	dirp res-symlink-target res-numlinks res-uid res-gid res-access
	res-mod res-change res-size res-filemodes res-inode res-device)
    (when attributes
      ;; ... directory or symlink
      (setq dirp (if (equal "directory" (cdr (assoc "type" attributes))) t))
      (setq res-symlink-target
	    ;; Google-drive creates file blobs and links to them.  We
	    ;; don't want to see them.
	    (and
	     (not
	      (equal (cdr (assoc "standard::is-volatile" attributes)) "TRUE"))
	     (cdr (assoc "standard::symlink-target" attributes))))
      (when (stringp res-symlink-target)
	(setq res-symlink-target
	      ;; Parse unibyte codes "\xNN".  We assume they are
	      ;; non-ASCII codepoints in the range #x80 through #xff.
	      ;; Convert them to multibyte.
	      (decode-coding-string
	       (replace-regexp-in-string
		(rx "\\x" (group (= 2 xdigit)))
		(lambda (x)
		  (unibyte-string (string-to-number (match-string 1 x) 16)))
		res-symlink-target)
	       'utf-8)))
      ;; ... number links
      (setq res-numlinks
	    (string-to-number
	     (or (cdr (assoc "unix::nlink" attributes)) "0")))
      ;; ... uid and gid
      (setq res-uid
	    (if (eq id-format 'integer)
		(string-to-number
		 (or (cdr (assoc "unix::uid" attributes))
		     (number-to-string tramp-unknown-id-integer)))
	      (or (cdr (assoc "owner::user" attributes))
		  (cdr (assoc "unix::uid" attributes))
		  tramp-unknown-id-string)))
      (setq res-gid
	    (if (eq id-format 'integer)
		(string-to-number
		 (or (cdr (assoc "unix::gid" attributes))
		     (number-to-string tramp-unknown-id-integer)))
	      (or (cdr (assoc "owner::group" attributes))
		  (cdr (assoc "unix::gid" attributes))
		  tramp-unknown-id-string)))
      ;; ... last access, modification and change time
      (setq res-access
	    (seconds-to-time
	     (string-to-number
	      (or (cdr (assoc "time::access" attributes)) "0"))))
      (setq res-mod
	    (seconds-to-time
	     (string-to-number
	      (or (cdr (assoc "time::modified" attributes)) "0"))))
      (setq res-change
	    (seconds-to-time
	     (string-to-number
	      (or (cdr (assoc "time::changed" attributes)) "0"))))
      ;; ... size
      (setq res-size
	    (string-to-number
	     (or (cdr (assoc "standard::size" attributes)) "0")))
      ;; ... file mode flags
      (setq res-filemodes
	    (if-let* ((n (cdr (assoc "unix::mode" attributes))))
		(tramp-file-mode-from-int (string-to-number n))
	      (format
	       "%s%s%s%s------"
	       (if dirp "d" (if res-symlink-target "l" "-"))
	       (if (equal (cdr (assoc "access::can-read" attributes))
			  "FALSE")
		   "-" "r")
	       (if (equal (cdr (assoc "access::can-write" attributes))
			  "FALSE")
		   "-" "w")
	       (if (equal (cdr (assoc "access::can-execute" attributes))
			  "FALSE")
		   "-" "x"))))
      ;; ... inode and device
      (setq res-inode
	    (if-let* ((n (cdr (assoc "unix::inode" attributes))))
		(string-to-number n)
	      (tramp-get-inode (tramp-dissect-file-name filename))))
      (setq res-device
	    (if-let* ((n (cdr (assoc "unix::device" attributes))))
		(string-to-number n)
	      (tramp-get-device (tramp-dissect-file-name filename))))

      ;; Return data gathered.
      (list
       ;; 0. t for directory, string (name linked to) for
       ;; symbolic link, or nil.
       (or dirp res-symlink-target)
       ;; 1. Number of links to file.
       res-numlinks
       ;; 2. File uid.
       res-uid
       ;; 3. File gid.
       res-gid
       ;; 4. Last access time, as a list of integers.
       ;; 5. Last modification time, likewise.
       ;; 6. Last status change time, likewise.
       res-access res-mod res-change
       ;; 7. Size in bytes (-1, if number is out of range).
       res-size
       ;; 8. File modes.
       res-filemodes
       ;; 9. t if file's gid would change if file were deleted
       ;; and recreated.
       nil
       ;; 10. Inode number.
       res-inode
       ;; 11. Device number.
       res-device
       ))))