aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Albinus2018-01-05 21:04:39 +0100
committerMichael Albinus2018-01-05 21:04:39 +0100
commitb74fdf4408c883d02dd5c78af2ec622d632c3b1d (patch)
tree95c17ec74d312ca14260259a37f1f28bb849664f
parent933d8fc0b70452f8a266e761231e58a759a7c80a (diff)
downloademacs-b74fdf4408c883d02dd5c78af2ec622d632c3b1d.tar.gz
emacs-b74fdf4408c883d02dd5c78af2ec622d632c3b1d.zip
Add new Tramp connection method "owncloud"
* doc/misc/tramp.texi (all): Use @acronym{GNOME} thoroughly. (Using GNOME Online Accounts based methods): Rename from "Using Google Drive". Add `owncloud'. (GVFS based methods): Add `owncloud'. * etc/NEWS: Add Tramp connection method "owncloud". * lisp/net/tramp-gvfs.el (tramp-gvfs-methods): Add "owncloud". Remove goa methods if not supported. (tramp-goa-methods, tramp-goa-service, tramp-goa-path) (tramp-goa-path-accounts, tramp-goa-interface-documents) (tramp-goa-interface-printers, tramp-goa-interface-files) (tramp-goa-interface-contacts, tramp-goa-interface-calendar) (tramp-goa-interface-oauth2based) (tramp-goa-interface-account, tramp-goa-identity-regexp) (tramp-goa-interface-mail, tramp-goa-interface-chat) (tramp-goa-interface-photos, tramp-goa-path-manager) (tramp-goa-interface-documents) (tramp-gvfs-owncloud-default-prefix) (tramp-gvfs-owncloud-default-prefix-regexp): New defconst. (tramp-goa-name): New defstruct. (tramp-gvfs-stringify-dbus-message): Handle all consp messages. (tramp-dbus-function, tramp-gvfs-get-remote-prefix) (tramp-get-goa-accounts): New defun. (with-tramp-dbus-call-method): Use it. (with-tramp-dbus-get-all-properties): New defmacro. (tramp-gvfs-url-file-name) (tramp-gvfs-handler-mounted-unmounted) (tramp-gvfs-connection-mounted-p, tramp-gvfs-mount-spec): Map between "owncloud" and "davs". (tramp-gvfs-maybe-open-connection): Set "vector" connection property. * test/lisp/net/tramp-tests.el (tramp-gvfs-handler-askquestion): Suppress run in tests. (tramp--test-owncloud-p): New defun. (tramp-test11-copy-file, tramp-test12-rename-file): Use it.
-rw-r--r--doc/misc/tramp.texi55
-rw-r--r--etc/NEWS6
-rw-r--r--lisp/net/tramp-cache.el3
-rw-r--r--lisp/net/tramp-gvfs.el388
-rw-r--r--test/lisp/net/tramp-tests.el41
5 files changed, 409 insertions, 84 deletions
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 4bfebc00af4..deaafb3d257 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -531,24 +531,33 @@ of the local file name is the share exported by the remote host,
531@cindex dav method 531@cindex dav method
532@cindex davs method 532@cindex davs method
533 533
534On systems, which have installed the virtual file system for the Gnome 534On systems, which have installed the virtual file system for the
535Desktop (GVFS), its offered methods could be used by @value{tramp}. 535@acronym{GNOME} Desktop (GVFS), its offered methods could be used by
536Examples are @file{@trampfn{sftp,user@@host,/path/to/file}}, 536@value{tramp}. Examples are
537@file{@trampfn{sftp,user@@host,/path/to/file}},
537@file{@trampfn{afp,user@@host,/path/to/file}} (accessing Apple's AFP 538@file{@trampfn{afp,user@@host,/path/to/file}} (accessing Apple's AFP
538file system), @file{@trampfn{dav,user@@host,/path/to/file}} and 539file system), @file{@trampfn{dav,user@@host,/path/to/file}} and
539@file{@trampfn{davs,user@@host,/path/to/file}} (for WebDAV shares). 540@file{@trampfn{davs,user@@host,/path/to/file}} (for WebDAV shares).
540 541
541 542
542@anchor{Quick Start Guide: Google Drive} 543@anchor{Quick Start Guide: GNOME Online Accounts based methods}
543@section Using Google Drive 544@section Using @acronym{GNOME} Online Accounts based methods
545@cindex @acronym{GNOME} Online Accounts
544@cindex method gdrive 546@cindex method gdrive
545@cindex gdrive method 547@cindex gdrive method
546@cindex google drive 548@cindex google drive
549@cindex method owncloud
550@cindex owncloud method
551@cindex nextcloud
547 552
548Another GVFS-based method allows to access a Google Drive file system. 553GVFS-based methods include also @acronym{GNOME} Online Accounts, which
549The file name syntax is here always 554support the @option{Files} service. These are the Google Drive file
550@file{@trampfn{gdrive,john.doe@@gmail.com,/path/to/file}}. 555system, and the OwnCloud/NextCloud file system. The file name syntax
551@samp{john.doe@@gmail.com} stands here for your Google Drive account. 556is here always
557@file{@trampfn{gdrive,john.doe@@gmail.com,/path/to/file}}
558(@samp{john.doe@@gmail.com} stands here for your Google Drive
559account), or @file{@trampfn{owncloud,user@@host#8081,/path/to/file}}
560(@samp{8081} stands for the port number) for OwnCloud/NextCloud files.
552 561
553 562
554@anchor{Quick Start Guide: Android} 563@anchor{Quick Start Guide: Android}
@@ -1061,7 +1070,7 @@ numbers are not applicable to Android devices connected through USB@.
1061@cindex gvfs based methods 1070@cindex gvfs based methods
1062@cindex dbus 1071@cindex dbus
1063 1072
1064GVFS is the virtual file system for the Gnome Desktop, 1073GVFS is the virtual file system for the @acronym{GNOME} Desktop,
1065@uref{https://en.wikipedia.org/wiki/GVFS}. Remote files on GVFS are 1074@uref{https://en.wikipedia.org/wiki/GVFS}. Remote files on GVFS are
1066mounted locally through FUSE and @value{tramp} uses this locally 1075mounted locally through FUSE and @value{tramp} uses this locally
1067mounted directory internally. 1076mounted directory internally.
@@ -1114,6 +1123,18 @@ directory have the same @code{display-name}, such a situation must be avoided.
1114OBEX is an FTP-like access protocol for cell phones and similar simple 1123OBEX is an FTP-like access protocol for cell phones and similar simple
1115devices. @value{tramp} supports OBEX over Bluetooth. 1124devices. @value{tramp} supports OBEX over Bluetooth.
1116 1125
1126@item @option{owncloud}
1127@cindex @acronym{GNOME} Online Accounts
1128@cindex method owncloud
1129@cindex owncloud method
1130@cindex nextcloud
1131
1132As the name indicates, the method @option{owncloud} allows you to
1133access OwnCloud or NextCloud hosted files and directories. Like the
1134@option{gdrive} method, your credentials must be populated in your
1135@command{Online Accounts} application outside Emacs. The method
1136supports port numbers.
1137
1117@item @option{sftp} 1138@item @option{sftp}
1118@cindex method sftp 1139@cindex method sftp
1119@cindex sftp method 1140@cindex sftp method
@@ -1135,11 +1156,11 @@ requires the SYNCE-GVFS plugin.
1135@defopt tramp-gvfs-methods 1156@defopt tramp-gvfs-methods
1136This user option is a list of external methods for GVFS@. By default, 1157This user option is a list of external methods for GVFS@. By default,
1137this list includes @option{afp}, @option{dav}, @option{davs}, 1158this list includes @option{afp}, @option{dav}, @option{davs},
1138@option{gdrive}, @option{obex}, @option{sftp} and @option{synce}. 1159@option{gdrive}, @option{obex}, @option{owncloud}, @option{sftp} and
1139Other methods to include are @option{ftp}, @option{http}, 1160@option{synce}. Other methods to include are @option{ftp},
1140@option{https} and @option{smb}. These methods are not intended to be 1161@option{http}, @option{https} and @option{smb}. These methods are not
1141used directly as GVFS based method. Instead, they are added here for 1162intended to be used directly as GVFS based method. Instead, they are
1142the benefit of @ref{Archive file names}. 1163added here for the benefit of @ref{Archive file names}.
1143@end defopt 1164@end defopt
1144 1165
1145 1166
@@ -2928,8 +2949,8 @@ that remote connection.
2928 2949
2929@value{tramp} offers also transparent access to files inside file 2950@value{tramp} offers also transparent access to files inside file
2930archives. This is possible only on machines which have installed the 2951archives. This is possible only on machines which have installed the
2931virtual file system for the Gnome Desktop (GVFS), @ref{GVFS based 2952virtual file system for the @acronym{GNOME} Desktop (GVFS), @ref{GVFS
2932methods}. Internally, file archives are mounted via the GVFS 2953based methods}. Internally, file archives are mounted via the GVFS
2933@option{archive} method. 2954@option{archive} method.
2934 2955
2935A file archive is a regular file of kind @file{/path/to/dir/file.EXT}. 2956A file archive is a regular file of kind @file{/path/to/dir/file.EXT}.
diff --git a/etc/NEWS b/etc/NEWS
index 3ba95c1ff61..c5a4bc3344b 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -159,6 +159,12 @@ To restore the old behavior, use
159 (add-hook 'eshell-expand-input-functions 159 (add-hook 'eshell-expand-input-functions
160 #'eshell-expand-history-references) 160 #'eshell-expand-history-references)
161 161
162** Tramp
163
164+++
165*** New connection method "owncloud", which allows to access OwnCloud
166or NextCloud hosted files and directories.
167
162 168
163* New Modes and Packages in Emacs 27.1 169* New Modes and Packages in Emacs 27.1
164 170
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index 844813936fb..97c687598f2 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -114,8 +114,7 @@ Returns DEFAULT if not set."
114 (tramp-file-name-hop key) nil) 114 (tramp-file-name-hop key) nil)
115 (let* ((hash (tramp-get-hash-table key)) 115 (let* ((hash (tramp-get-hash-table key))
116 (value (when (hash-table-p hash) (gethash property hash)))) 116 (value (when (hash-table-p hash) (gethash property hash))))
117 (if 117 (if ;; We take the value only if there is any, and
118 ;; We take the value only if there is any, and
119 ;; `remote-file-name-inhibit-cache' indicates that it is still 118 ;; `remote-file-name-inhibit-cache' indicates that it is still
120 ;; valid. Otherwise, DEFAULT is set. 119 ;; valid. Otherwise, DEFAULT is set.
121 (and (consp value) 120 (and (consp value)
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index ef354b68950..7d63118268d 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -49,10 +49,14 @@
49 49
50;; The custom option `tramp-gvfs-methods' contains the list of 50;; The custom option `tramp-gvfs-methods' contains the list of
51;; supported connection methods. Per default, these are "afp", "dav", 51;; supported connection methods. Per default, these are "afp", "dav",
52;; "davs", "gdrive", "obex", "sftp" and "synce". Note that with 52;; "davs", "gdrive", "obex", "owncloud", "sftp" and "synce". Note
53;; "obex" it might be necessary to pair with the other bluetooth 53;; that with "obex" it might be necessary to pair with the other
54;; device, if it hasn't been done already. There might be also some 54;; bluetooth device, if it hasn't been done already. There might be
55;; few seconds delay in discovering available bluetooth devices. 55;; also some few seconds delay in discovering available bluetooth
56;; devices.
57
58;; "gdrive" and "owncloud" connection methods require a respective
59;; account in GNOME Online Accounts, with enabled "Files" service.
56 60
57;; Other possible connection methods are "ftp", "http", "https" and 61;; Other possible connection methods are "ftp", "http", "https" and
58;; "smb". When one of these methods is added to the list, the remote 62;; "smb". When one of these methods is added to the list, the remote
@@ -112,7 +116,7 @@
112 116
113;;;###tramp-autoload 117;;;###tramp-autoload
114(defcustom tramp-gvfs-methods 118(defcustom tramp-gvfs-methods
115 '("afp" "dav" "davs" "gdrive" "obex" "sftp" "synce") 119 '("afp" "dav" "davs" "gdrive" "obex" "owncloud" "sftp" "synce")
116 "List of methods for remote files, accessed with GVFS." 120 "List of methods for remote files, accessed with GVFS."
117 :group 'tramp 121 :group 'tramp
118 :version "26.1" 122 :version "26.1"
@@ -124,11 +128,20 @@
124 (const "http") 128 (const "http")
125 (const "https") 129 (const "https")
126 (const "obex") 130 (const "obex")
131 (const "owncloud")
127 (const "sftp") 132 (const "sftp")
128 (const "smb") 133 (const "smb")
129 (const "synce"))) 134 (const "synce")))
130 :require 'tramp) 135 :require 'tramp)
131 136
137(defconst tramp-goa-methods '("gdrive" "owncloud")
138 "List of methods which require registration at GNOME Online Accounts.")
139
140;; Remove GNOME Online Accounts if not supported.
141(unless (member tramp-goa-service (dbus-list-known-names :session))
142 (dolist (method tramp-goa-methods)
143 (setq tramp-gvfs-methods (delete method tramp-gvfs-methods))))
144
132;; Add defaults for `tramp-default-user-alist' and `tramp-default-host-alist'. 145;; Add defaults for `tramp-default-user-alist' and `tramp-default-host-alist'.
133;;;###tramp-autoload 146;;;###tramp-autoload
134(when (string-match "\\(.+\\)@\\(\\(?:gmail\\|googlemail\\)\\.com\\)" 147(when (string-match "\\(.+\\)@\\(\\(?:gmail\\|googlemail\\)\\.com\\)"
@@ -293,6 +306,162 @@ It has been changed in GVFS 1.14.")
293(defconst tramp-gvfs-password-anonymous-supported 16 306(defconst tramp-gvfs-password-anonymous-supported 16
294 "Operation supports anonymous users.") 307 "Operation supports anonymous users.")
295 308
309;; For the time being, we just need org.goa.Account and org.goa.Files
310;; interfaces. We document the other ones, just in case.
311
312;;;###tramp-autoload
313(defconst tramp-goa-service "org.gnome.OnlineAccounts"
314 "The well known name of the GNOME Online Accounts service.")
315
316(defconst tramp-goa-path "/org/gnome/OnlineAccounts"
317 "The object path of the GNOME Online Accounts.")
318
319(defconst tramp-goa-path-accounts (concat tramp-goa-path "/Accounts")
320 "The object path of the GNOME Online Accounts accounts.")
321
322(defconst tramp-goa-interface-documents "org.gnome.OnlineAccounts.Documents"
323 "The documents interface of the GNOME Online Accounts.")
324
325;; <interface name='org.gnome.OnlineAccounts.Documents'>
326;; </interface>
327
328(defconst tramp-goa-interface-printers "org.gnome.OnlineAccounts.Printers"
329 "The printers interface of the GNOME Online Accounts.")
330
331;; <interface name='org.gnome.OnlineAccounts.Printers'>
332;; </interface>
333
334(defconst tramp-goa-interface-files "org.gnome.OnlineAccounts.Files"
335 "The files interface of the GNOME Online Accounts.")
336
337;; <interface name='org.gnome.OnlineAccounts.Files'>
338;; <property type='b' name='AcceptSslErrors' access='read'/>
339;; <property type='s' name='Uri' access='read'/>
340;; </interface>
341
342(defconst tramp-goa-interface-contacts "org.gnome.OnlineAccounts.Contacts"
343 "The contacts interface of the GNOME Online Accounts.")
344
345;; <interface name='org.gnome.OnlineAccounts.Contacts'>
346;; <property type='b' name='AcceptSslErrors' access='read'/>
347;; <property type='s' name='Uri' access='read'/>
348;; </interface>
349
350(defconst tramp-goa-interface-calendar "org.gnome.OnlineAccounts.Calendar"
351 "The calendar interface of the GNOME Online Accounts.")
352
353;; <interface name='org.gnome.OnlineAccounts.Calendar'>
354;; <property type='b' name='AcceptSslErrors' access='read'/>
355;; <property type='s' name='Uri' access='read'/>
356;; </interface>
357
358(defconst tramp-goa-interface-oauth2based "org.gnome.OnlineAccounts.OAuth2Based"
359 "The oauth2based interface of the GNOME Online Accounts.")
360
361;; <interface name='org.gnome.OnlineAccounts.OAuth2Based'>
362;; <method name='GetAccessToken'>
363;; <arg type='s' name='access_token' direction='out'/>
364;; <arg type='i' name='expires_in' direction='out'/>
365;; </method>
366;; <property type='s' name='ClientId' access='read'/>
367;; <property type='s' name='ClientSecret' access='read'/>
368;; </interface>
369
370(defconst tramp-goa-interface-account "org.gnome.OnlineAccounts.Account"
371 "The account interface of the GNOME Online Accounts.")
372
373;; <interface name='org.gnome.OnlineAccounts.Account'>
374;; <method name='Remove'/>
375;; <method name='EnsureCredentials'>
376;; <arg type='i' name='expires_in' direction='out'/>
377;; </method>
378;; <property type='s' name='ProviderType' access='read'/>
379;; <property type='s' name='ProviderName' access='read'/>
380;; <property type='s' name='ProviderIcon' access='read'/>
381;; <property type='s' name='Id' access='read'/>
382;; <property type='b' name='IsLocked' access='read'/>
383;; <property type='b' name='IsTemporary' access='readwrite'/>
384;; <property type='b' name='AttentionNeeded' access='read'/>
385;; <property type='s' name='Identity' access='read'/>
386;; <property type='s' name='PresentationIdentity' access='read'/>
387;; <property type='b' name='MailDisabled' access='readwrite'/>
388;; <property type='b' name='CalendarDisabled' access='readwrite'/>
389;; <property type='b' name='ContactsDisabled' access='readwrite'/>
390;; <property type='b' name='ChatDisabled' access='readwrite'/>
391;; <property type='b' name='DocumentsDisabled' access='readwrite'/>
392;; <property type='b' name='MapsDisabled' access='readwrite'/>
393;; <property type='b' name='MusicDisabled' access='readwrite'/>
394;; <property type='b' name='PrintersDisabled' access='readwrite'/>
395;; <property type='b' name='PhotosDisabled' access='readwrite'/>
396;; <property type='b' name='FilesDisabled' access='readwrite'/>
397;; <property type='b' name='TicketingDisabled' access='readwrite'/>
398;; <property type='b' name='TodoDisabled' access='readwrite'/>
399;; <property type='b' name='ReadLaterDisabled' access='readwrite'/>
400;; </interface>
401
402(defconst tramp-goa-identity-regexp
403 (concat "^" "\\(" tramp-user-regexp "\\)?"
404 "@" "\\(" tramp-host-regexp "\\)?"
405 "\\(?:" ":""\\(" tramp-port-regexp "\\)" "\\)?")
406 "Regexp matching GNOME Online Accounts \"PresentationIdentity\" property.")
407
408(defconst tramp-goa-interface-mail "org.gnome.OnlineAccounts.Mail"
409 "The mail interface of the GNOME Online Accounts.")
410
411;; <interface name='org.gnome.OnlineAccounts.Mail'>
412;; <property type='s' name='EmailAddress' access='read'/>
413;; <property type='s' name='Name' access='read'/>
414;; <property type='b' name='ImapSupported' access='read'/>
415;; <property type='b' name='ImapAcceptSslErrors' access='read'/>
416;; <property type='s' name='ImapHost' access='read'/>
417;; <property type='b' name='ImapUseSsl' access='read'/>
418;; <property type='b' name='ImapUseTls' access='read'/>
419;; <property type='s' name='ImapUserName' access='read'/>
420;; <property type='b' name='SmtpSupported' access='read'/>
421;; <property type='b' name='SmtpAcceptSslErrors' access='read'/>
422;; <property type='s' name='SmtpHost' access='read'/>
423;; <property type='b' name='SmtpUseAuth' access='read'/>
424;; <property type='b' name='SmtpAuthLogin' access='read'/>
425;; <property type='b' name='SmtpAuthPlain' access='read'/>
426;; <property type='b' name='SmtpAuthXoauth2' access='read'/>
427;; <property type='b' name='SmtpUseSsl' access='read'/>
428;; <property type='b' name='SmtpUseTls' access='read'/>
429;; <property type='s' name='SmtpUserName' access='read'/>
430;; </interface>
431
432(defconst tramp-goa-interface-chat "org.gnome.OnlineAccounts.Chat"
433 "The chat interface of the GNOME Online Accounts.")
434
435;; <interface name='org.gnome.OnlineAccounts.Chat'>
436;; </interface>
437
438(defconst tramp-goa-interface-photos "org.gnome.OnlineAccounts.Photos"
439 "The photos interface of the GNOME Online Accounts.")
440
441;; <interface name='org.gnome.OnlineAccounts.Photos'>
442;; </interface>
443
444(defconst tramp-goa-path-manager (concat tramp-goa-path "/Manager")
445 "The object path of the GNOME Online Accounts manager.")
446
447(defconst tramp-goa-interface-documents "org.gnome.OnlineAccounts.Manager"
448 "The manager interface of the GNOME Online Accounts.")
449
450;; <interface name='org.gnome.OnlineAccounts.Manager'>
451;; <method name='AddAccount'>
452;; <arg type='s' name='provider' direction='in'/>
453;; <arg type='s' name='identity' direction='in'/>
454;; <arg type='s' name='presentation_identity' direction='in'/>
455;; <arg type='a{sv}' name='credentials' direction='in'/>
456;; <arg type='a{ss}' name='details' direction='in'/>
457;; <arg type='o' name='account_object_path' direction='out'/>
458;; </method>
459;; </interface>
460
461;; The basic structure for GNOME Online Accounts. We use a list :type,
462;; in order to be compatible with Emacs 24 and 25.
463(cl-defstruct (tramp-goa-name (:type list) :named) method user host port)
464
296(defconst tramp-bluez-service "org.bluez" 465(defconst tramp-bluez-service "org.bluez"
297 "The well known name of the BLUEZ service.") 466 "The well known name of the BLUEZ service.")
298 467
@@ -479,6 +648,13 @@ Every entry is a list (NAME ADDRESS).")
479 ":[[:blank:]]+\\(.*\\)$") 648 ":[[:blank:]]+\\(.*\\)$")
480 "Regexp to parse GVFS file system attributes with `gvfs-info'.") 649 "Regexp to parse GVFS file system attributes with `gvfs-info'.")
481 650
651(defconst tramp-gvfs-owncloud-default-prefix "/remote.php/webdav"
652 "Default prefix for owncloud / nextcloud methods.")
653
654(defconst tramp-gvfs-owncloud-default-prefix-regexp
655 (concat (regexp-quote tramp-gvfs-owncloud-default-prefix) "$")
656 "Regexp of default prefix for owncloud / nextcloud methods.")
657
482 658
483;; New handlers should be added here. 659;; New handlers should be added here.
484;;;###tramp-autoload 660;;;###tramp-autoload
@@ -610,12 +786,24 @@ Return nil for null BYTE-ARRAY."
610 (cond 786 (cond
611 ((and (consp message) (characterp (car message))) 787 ((and (consp message) (characterp (car message)))
612 (format "%S" (tramp-gvfs-dbus-byte-array-to-string message))) 788 (format "%S" (tramp-gvfs-dbus-byte-array-to-string message)))
789 ((and (consp message) (not (consp (cdr message))))
790 (cons (tramp-gvfs-stringify-dbus-message (car message))
791 (tramp-gvfs-stringify-dbus-message (cdr message))))
613 ((consp message) 792 ((consp message)
614 (mapcar 'tramp-gvfs-stringify-dbus-message message)) 793 (mapcar 'tramp-gvfs-stringify-dbus-message message))
615 ((stringp message) 794 ((stringp message)
616 (format "%S" message)) 795 (format "%S" message))
617 (t message))) 796 (t message)))
618 797
798(defun tramp-dbus-function (vec func args)
799 "Apply a D-Bus function FUNC from dbus.el.
800The call will be traced by Tramp with trace level 6."
801 (let (result)
802 (tramp-message vec 6 "%s" (cons func args))
803 (setq result (apply func args))
804 (tramp-message vec 6 "%s" result(tramp-gvfs-stringify-dbus-message result))
805 result))
806
619(defmacro with-tramp-dbus-call-method 807(defmacro with-tramp-dbus-call-method
620 (vec synchronous bus service path interface method &rest args) 808 (vec synchronous bus service path interface method &rest args)
621 "Apply a D-Bus call on bus BUS. 809 "Apply a D-Bus call on bus BUS.
@@ -624,22 +812,34 @@ If SYNCHRONOUS is non-nil, the call is synchronously. Otherwise,
624it is an asynchronous call, with `ignore' as callback function. 812it is an asynchronous call, with `ignore' as callback function.
625 813
626The other arguments have the same meaning as with `dbus-call-method' 814The other arguments have the same meaning as with `dbus-call-method'
627or `dbus-call-method-asynchronously'. Additionally, the call 815or `dbus-call-method-asynchronously'."
628will be traced by Tramp with trace level 6."
629 `(let ((func (if ,synchronous 816 `(let ((func (if ,synchronous
630 'dbus-call-method 'dbus-call-method-asynchronously)) 817 'dbus-call-method 'dbus-call-method-asynchronously))
631 (args (append (list ,bus ,service ,path ,interface ,method) 818 (args (append (list ,bus ,service ,path ,interface ,method)
632 (if ,synchronous (list ,@args) (list 'ignore ,@args)))) 819 (if ,synchronous (list ,@args) (list 'ignore ,@args)))))
633 result) 820 (tramp-dbus-function ,vec func args)))
634 (tramp-message ,vec 6 "%s %s" func args)
635 (setq result (apply func args))
636 (tramp-message ,vec 6 "%s" (tramp-gvfs-stringify-dbus-message result))
637 result))
638 821
639(put 'with-tramp-dbus-call-method 'lisp-indent-function 2) 822(put 'with-tramp-dbus-call-method 'lisp-indent-function 2)
640(put 'with-tramp-dbus-call-method 'edebug-form-spec '(form symbolp body)) 823(put 'with-tramp-dbus-call-method 'edebug-form-spec '(form symbolp body))
641(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-call-method\\>")) 824(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-call-method\\>"))
642 825
826(defmacro with-tramp-dbus-get-all-properties
827 (vec bus service path interface)
828 "Return all properties of INTERFACE.
829The call will be traced by Tramp with trace level 6."
830 ;; Check, that interface exists at object path. Retrieve properties.
831 `(when (member
832 ,interface
833 (tramp-dbus-function
834 ,vec 'dbus-introspect-get-interface-names
835 (list ,bus ,service ,path)))
836 (tramp-dbus-function
837 ,vec 'dbus-get-all-properties (list ,bus ,service ,path ,interface))))
838
839(put 'with-tramp-dbus-get-all-properties 'lisp-indent-function 1)
840(put 'with-tramp-dbus-get-all-properties 'edebug-form-spec '(form symbolp body))
841(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-get-all-properties\\>"))
842
643(defvar tramp-gvfs-dbus-event-vector nil 843(defvar tramp-gvfs-dbus-event-vector nil
644 "Current Tramp file name to be used, as vector. 844 "Current Tramp file name to be used, as vector.
645It is needed when D-Bus signals or errors arrive, because there 845It is needed when D-Bus signals or errors arrive, because there
@@ -1293,6 +1493,10 @@ file-notify events."
1293 (with-parsed-tramp-file-name filename nil 1493 (with-parsed-tramp-file-name filename nil
1294 (when (string-equal "gdrive" method) 1494 (when (string-equal "gdrive" method)
1295 (setq method "google-drive")) 1495 (setq method "google-drive"))
1496 (when (string-equal "owncloud" method)
1497 (setq method "davs"
1498 localname
1499 (concat (tramp-gvfs-get-remote-prefix v) localname)))
1296 (when (and user domain) 1500 (when (and user domain)
1297 (setq user (concat domain ";" user))) 1501 (setq user (concat domain ";" user)))
1298 (url-parse-make-urlobj 1502 (url-parse-make-urlobj
@@ -1317,24 +1521,6 @@ file-notify events."
1317 (dbus-unescape-from-identifier 1521 (dbus-unescape-from-identifier
1318 (replace-regexp-in-string "^.*/\\([^/]+\\)$" "\\1" object-path))) 1522 (replace-regexp-in-string "^.*/\\([^/]+\\)$" "\\1" object-path)))
1319 1523
1320(defun tramp-bluez-address (device)
1321 "Return bluetooth device address from a given bluetooth DEVICE name."
1322 (when (stringp device)
1323 (if (string-match tramp-ipv6-regexp device)
1324 (match-string 0 device)
1325 (cadr (assoc device (tramp-bluez-list-devices))))))
1326
1327(defun tramp-bluez-device (address)
1328 "Return bluetooth device name from a given bluetooth device ADDRESS.
1329ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1330 (when (stringp address)
1331 (while (string-match "[][]" address)
1332 (setq address (replace-match "" t t address)))
1333 (let (result)
1334 (dolist (item (tramp-bluez-list-devices) result)
1335 (when (string-match address (cadr item))
1336 (setq result (car item)))))))
1337
1338 1524
1339;; D-Bus GVFS functions. 1525;; D-Bus GVFS functions.
1340 1526
@@ -1405,7 +1591,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1405 (tramp-get-connection-process v) message 1591 (tramp-get-connection-process v) message
1406 ;; In theory, there can be several choices. 1592 ;; In theory, there can be several choices.
1407 ;; Until now, there is only the question whether 1593 ;; Until now, there is only the question whether
1408 ;; to accept an unknown host signature. 1594 ;; to accept an unknown host signature or certificate.
1409 (with-temp-buffer 1595 (with-temp-buffer
1410 ;; Preserve message for `progress-reporter'. 1596 ;; Preserve message for `progress-reporter'.
1411 (with-temp-message "" 1597 (with-temp-message ""
@@ -1446,6 +1632,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1446 (while (stringp (car elt)) (setq elt (cdr elt))) 1632 (while (stringp (car elt)) (setq elt (cdr elt)))
1447 (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string (cadr elt))) 1633 (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string (cadr elt)))
1448 (mount-spec (cl-caddr elt)) 1634 (mount-spec (cl-caddr elt))
1635 (prefix (tramp-gvfs-dbus-byte-array-to-string (car mount-spec)))
1449 (default-location (tramp-gvfs-dbus-byte-array-to-string 1636 (default-location (tramp-gvfs-dbus-byte-array-to-string
1450 (cl-cadddr elt))) 1637 (cl-cadddr elt)))
1451 (method (tramp-gvfs-dbus-byte-array-to-string 1638 (method (tramp-gvfs-dbus-byte-array-to-string
@@ -1462,19 +1649,17 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1462 (ssl (tramp-gvfs-dbus-byte-array-to-string 1649 (ssl (tramp-gvfs-dbus-byte-array-to-string
1463 (cadr (assoc "ssl" (cadr mount-spec))))) 1650 (cadr (assoc "ssl" (cadr mount-spec)))))
1464 (uri (tramp-gvfs-dbus-byte-array-to-string 1651 (uri (tramp-gvfs-dbus-byte-array-to-string
1465 (cadr (assoc "uri" (cadr mount-spec))))) 1652 (cadr (assoc "uri" (cadr mount-spec))))))
1466 (prefix (concat
1467 (tramp-gvfs-dbus-byte-array-to-string
1468 (car mount-spec))
1469 (tramp-gvfs-dbus-byte-array-to-string
1470 (or (cadr (assoc "share" (cadr mount-spec)))
1471 (cadr (assoc "volume" (cadr mount-spec))))))))
1472 (when (string-match "^\\(afp\\|smb\\)" method) 1653 (when (string-match "^\\(afp\\|smb\\)" method)
1473 (setq method (match-string 1 method))) 1654 (setq method (match-string 1 method)))
1474 (when (string-equal "obex" method) 1655 (when (string-equal "obex" method)
1475 (setq host (tramp-bluez-device host))) 1656 (setq host (tramp-bluez-device host)))
1476 (when (and (string-equal "dav" method) (string-equal "true" ssl)) 1657 (when (and (string-equal "dav" method) (string-equal "true" ssl))
1477 (setq method "davs")) 1658 (setq method "davs"))
1659 (when (and (string-equal "davs" method)
1660 (string-match
1661 tramp-gvfs-owncloud-default-prefix-regexp prefix))
1662 (setq method "owncloud"))
1478 (when (string-equal "google-drive" method) 1663 (when (string-equal "google-drive" method)
1479 (setq method "gdrive")) 1664 (setq method "gdrive"))
1480 (when (and (string-equal "http" method) (stringp uri)) 1665 (when (and (string-equal "http" method) (stringp uri))
@@ -1491,9 +1676,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1491 (tramp-flush-file-property v "/" "list-mounts") 1676 (tramp-flush-file-property v "/" "list-mounts")
1492 (if (string-equal (downcase signal-name) "unmounted") 1677 (if (string-equal (downcase signal-name) "unmounted")
1493 (tramp-flush-file-properties v "/") 1678 (tramp-flush-file-properties v "/")
1494 ;; Set prefix, mountpoint and location. 1679 ;; Set mountpoint and location.
1495 (unless (string-equal prefix "/")
1496 (tramp-set-file-property v "/" "prefix" prefix))
1497 (tramp-set-file-property v "/" "fuse-mountpoint" fuse-mountpoint) 1680 (tramp-set-file-property v "/" "fuse-mountpoint" fuse-mountpoint)
1498 (tramp-set-connection-property 1681 (tramp-set-connection-property
1499 v "default-location" default-location))))))) 1682 v "default-location" default-location)))))))
@@ -1536,6 +1719,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1536 (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string 1719 (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string
1537 (cadr elt))) 1720 (cadr elt)))
1538 (mount-spec (cl-caddr elt)) 1721 (mount-spec (cl-caddr elt))
1722 (prefix (tramp-gvfs-dbus-byte-array-to-string (car mount-spec)))
1539 (default-location (tramp-gvfs-dbus-byte-array-to-string 1723 (default-location (tramp-gvfs-dbus-byte-array-to-string
1540 (cl-cadddr elt))) 1724 (cl-cadddr elt)))
1541 (method (tramp-gvfs-dbus-byte-array-to-string 1725 (method (tramp-gvfs-dbus-byte-array-to-string
@@ -1553,19 +1737,20 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1553 (cadr (assoc "ssl" (cadr mount-spec))))) 1737 (cadr (assoc "ssl" (cadr mount-spec)))))
1554 (uri (tramp-gvfs-dbus-byte-array-to-string 1738 (uri (tramp-gvfs-dbus-byte-array-to-string
1555 (cadr (assoc "uri" (cadr mount-spec))))) 1739 (cadr (assoc "uri" (cadr mount-spec)))))
1556 (prefix (concat 1740 (share (tramp-gvfs-dbus-byte-array-to-string
1557 (tramp-gvfs-dbus-byte-array-to-string 1741 (or
1558 (car mount-spec)) 1742 (cadr (assoc "share" (cadr mount-spec)))
1559 (tramp-gvfs-dbus-byte-array-to-string 1743 (cadr (assoc "volume" (cadr mount-spec)))))))
1560 (or
1561 (cadr (assoc "share" (cadr mount-spec)))
1562 (cadr (assoc "volume" (cadr mount-spec))))))))
1563 (when (string-match "^\\(afp\\|smb\\)" method) 1744 (when (string-match "^\\(afp\\|smb\\)" method)
1564 (setq method (match-string 1 method))) 1745 (setq method (match-string 1 method)))
1565 (when (string-equal "obex" method) 1746 (when (string-equal "obex" method)
1566 (setq host (tramp-bluez-device host))) 1747 (setq host (tramp-bluez-device host)))
1567 (when (and (string-equal "dav" method) (string-equal "true" ssl)) 1748 (when (and (string-equal "dav" method) (string-equal "true" ssl))
1568 (setq method "davs")) 1749 (setq method "davs"))
1750 (when (and (string-equal "davs" method)
1751 (string-match
1752 tramp-gvfs-owncloud-default-prefix-regexp prefix))
1753 (setq method "owncloud"))
1569 (when (string-equal "google-drive" method) 1754 (when (string-equal "google-drive" method)
1570 (setq method "gdrive")) 1755 (setq method "gdrive"))
1571 (when (and (string-equal "synce" method) (zerop (length user))) 1756 (when (and (string-equal "synce" method) (zerop (length user)))
@@ -1582,11 +1767,9 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
1582 (string-equal domain (tramp-file-name-domain vec)) 1767 (string-equal domain (tramp-file-name-domain vec))
1583 (string-equal host (tramp-file-name-host vec)) 1768 (string-equal host (tramp-file-name-host vec))
1584 (string-equal port (tramp-file-name-port vec)) 1769 (string-equal port (tramp-file-name-port vec))
1585 (string-match (concat "^" (regexp-quote prefix)) 1770 (string-match (concat "^/" (regexp-quote (or share "")))
1586 (tramp-file-name-unquote-localname vec))) 1771 (tramp-file-name-unquote-localname vec)))
1587 ;; Set prefix, mountpoint and location. 1772 ;; Set mountpoint and location.
1588 (unless (string-equal prefix "/")
1589 (tramp-set-file-property vec "/" "prefix" prefix))
1590 (tramp-set-file-property vec "/" "fuse-mountpoint" fuse-mountpoint) 1773 (tramp-set-file-property vec "/" "fuse-mountpoint" fuse-mountpoint)
1591 (tramp-set-connection-property 1774 (tramp-set-connection-property
1592 vec "default-location" default-location) 1775 vec "default-location" default-location)
@@ -1620,7 +1803,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
1620 (localname (tramp-file-name-unquote-localname vec)) 1803 (localname (tramp-file-name-unquote-localname vec))
1621 (share (when (string-match "^/?\\([^/]+\\)" localname) 1804 (share (when (string-match "^/?\\([^/]+\\)" localname)
1622 (match-string 1 localname))) 1805 (match-string 1 localname)))
1623 (ssl (if (string-match "^davs" method) "true" "false")) 1806 (ssl (if (string-match "^davs\\|^owncloud" method) "true" "false"))
1624 (mount-spec 1807 (mount-spec
1625 `(:array 1808 `(:array
1626 ,@(cond 1809 ,@(cond
@@ -1632,7 +1815,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
1632 (list (tramp-gvfs-mount-spec-entry "type" method) 1815 (list (tramp-gvfs-mount-spec-entry "type" method)
1633 (tramp-gvfs-mount-spec-entry 1816 (tramp-gvfs-mount-spec-entry
1634 "host" (concat "[" (tramp-bluez-address host) "]")))) 1817 "host" (concat "[" (tramp-bluez-address host) "]"))))
1635 ((string-match "\\`dav" method) 1818 ((string-match "^dav\\|^owncloud" method)
1636 (list (tramp-gvfs-mount-spec-entry "type" "dav") 1819 (list (tramp-gvfs-mount-spec-entry "type" "dav")
1637 (tramp-gvfs-mount-spec-entry "host" host) 1820 (tramp-gvfs-mount-spec-entry "host" host)
1638 (tramp-gvfs-mount-spec-entry "ssl" ssl))) 1821 (tramp-gvfs-mount-spec-entry "ssl" ssl)))
@@ -1643,7 +1826,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
1643 ((string-equal "gdrive" method) 1826 ((string-equal "gdrive" method)
1644 (list (tramp-gvfs-mount-spec-entry "type" "google-drive") 1827 (list (tramp-gvfs-mount-spec-entry "type" "google-drive")
1645 (tramp-gvfs-mount-spec-entry "host" host))) 1828 (tramp-gvfs-mount-spec-entry "host" host)))
1646 ((string-match "\\`http" method) 1829 ((string-match "^http" method)
1647 (list (tramp-gvfs-mount-spec-entry "type" "http") 1830 (list (tramp-gvfs-mount-spec-entry "type" "http")
1648 (tramp-gvfs-mount-spec-entry 1831 (tramp-gvfs-mount-spec-entry
1649 "uri" 1832 "uri"
@@ -1660,10 +1843,10 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
1660 ,@(when port 1843 ,@(when port
1661 (list (tramp-gvfs-mount-spec-entry "port" port))))) 1844 (list (tramp-gvfs-mount-spec-entry "port" port)))))
1662 (mount-pref 1845 (mount-pref
1663 (if (and (string-match "\\`dav" method) 1846 (if (and (string-match "^dav" method)
1664 (string-match "^/?[^/]+" localname)) 1847 (string-match "^/?[^/]+" localname))
1665 (match-string 0 localname) 1848 (match-string 0 localname)
1666 "/"))) 1849 (tramp-gvfs-get-remote-prefix vec))))
1667 1850
1668 ;; Return. 1851 ;; Return.
1669 `(:struct ,(tramp-gvfs-dbus-string-to-byte-array mount-pref) ,mount-spec))) 1852 `(:struct ,(tramp-gvfs-dbus-string-to-byte-array mount-pref) ,mount-spec)))
@@ -1715,6 +1898,21 @@ ID-FORMAT valid values are `string' and `integer'."
1715(defvar tramp-gvfs-get-remote-uid-gid-in-progress nil 1898(defvar tramp-gvfs-get-remote-uid-gid-in-progress nil
1716 "Indication, that remote uid and gid determination is in progress.") 1899 "Indication, that remote uid and gid determination is in progress.")
1717 1900
1901(defun tramp-gvfs-get-remote-prefix (vec)
1902 "The prefix of the remote connection VEC.
1903This is relevant for GNOME Online Accounts."
1904 (with-tramp-connection-property vec "prefix"
1905 ;; Ensure that GNOME Online Accounts are cached.
1906 (when (member (tramp-file-name-method vec) tramp-goa-methods)
1907 (tramp-get-goa-accounts vec))
1908 (tramp-get-connection-property
1909 (make-tramp-goa-name
1910 :method (tramp-file-name-method vec)
1911 :user (tramp-file-name-user vec)
1912 :host (tramp-file-name-host vec)
1913 :port (tramp-file-name-port vec))
1914 "prefix" "/")))
1915
1718(defun tramp-gvfs-maybe-open-connection (vec) 1916(defun tramp-gvfs-maybe-open-connection (vec)
1719 "Maybe open a connection VEC. 1917 "Maybe open a connection VEC.
1720Does not do anything if a connection is already open, but re-opens the 1918Does not do anything if a connection is already open, but re-opens the
@@ -1731,6 +1929,7 @@ connection if a previous connection has died for some reason."
1731 :name (tramp-buffer-name vec) 1929 :name (tramp-buffer-name vec)
1732 :buffer (tramp-get-connection-buffer vec) 1930 :buffer (tramp-get-connection-buffer vec)
1733 :server t :host 'local :service t :noquery t))) 1931 :server t :host 'local :service t :noquery t)))
1932 (tramp-set-connection-property p "vector" vec)
1734 (set-process-query-on-exit-flag p nil))) 1933 (set-process-query-on-exit-flag p nil)))
1735 1934
1736 (unless (tramp-gvfs-connection-mounted-p vec) 1935 (unless (tramp-gvfs-connection-mounted-p vec)
@@ -1869,8 +2068,81 @@ is applied, and it returns t if the return code is zero."
1869 (and (tramp-flush-file-properties vec "/") nil))))) 2068 (and (tramp-flush-file-properties vec "/") nil)))))
1870 2069
1871 2070
2071;; D-Bus GNOME Online Accounts functions.
2072
2073(defun tramp-get-goa-accounts (vec)
2074 "Retrieve GNOME Online Accounts, and cache them.
2075The hash key is a `tramp-goa-name' structure. The value is an
2076alist of the properties of `tramp-goa-interface-account' and
2077`tramp-goa-interface-files' of the corresponding GNOME online
2078account. Additionally, a property \"prefix\" is added.
2079VEC is used only for traces."
2080 (dolist
2081 (object-path
2082 (mapcar
2083 'car
2084 (tramp-dbus-function
2085 vec 'dbus-get-all-managed-objects
2086 `(:session ,tramp-goa-service ,tramp-goa-path))))
2087 (let* ((account-properties
2088 (with-tramp-dbus-get-all-properties vec
2089 :session tramp-goa-service object-path
2090 tramp-goa-interface-account))
2091 (files-properties
2092 (with-tramp-dbus-get-all-properties vec
2093 :session tramp-goa-service object-path
2094 tramp-goa-interface-files))
2095 (identity
2096 (or (cdr (assoc "PresentationIdentity" account-properties)) ""))
2097 key)
2098 ;; Only accounts which matter.
2099 (when (and
2100 (not (cdr (assoc "FilesDisabled" account-properties)))
2101 (member
2102 (cdr (assoc "ProviderType" account-properties))
2103 '("google" "owncloud"))
2104 (string-match tramp-goa-identity-regexp identity))
2105 (setq key (make-tramp-goa-name
2106 :method (cdr (assoc "ProviderType" account-properties))
2107 :user (match-string 1 identity)
2108 :host (match-string 2 identity)
2109 :port (match-string 3 identity)))
2110 (when (string-equal (tramp-goa-name-method key) "google")
2111 (setf (tramp-goa-name-method key) "gdrive"))
2112 ;; Cache all properties.
2113 (dolist (prop (nconc account-properties files-properties))
2114 (tramp-set-connection-property key (car prop) (cdr prop)))
2115 ;; Cache "prefix".
2116 (tramp-message
2117 vec 10 "%s prefix %s" key
2118 (tramp-set-connection-property
2119 key "prefix"
2120 (directory-file-name
2121 (url-filename
2122 (url-generic-parse-url
2123 (tramp-get-connection-property key "Uri" "file:///"))))))))))
2124
2125
1872;; D-Bus BLUEZ functions. 2126;; D-Bus BLUEZ functions.
1873 2127
2128(defun tramp-bluez-address (device)
2129 "Return bluetooth device address from a given bluetooth DEVICE name."
2130 (when (stringp device)
2131 (if (string-match tramp-ipv6-regexp device)
2132 (match-string 0 device)
2133 (cadr (assoc device (tramp-bluez-list-devices))))))
2134
2135(defun tramp-bluez-device (address)
2136 "Return bluetooth device name from a given bluetooth device ADDRESS.
2137ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
2138 (when (stringp address)
2139 (while (string-match "[][]" address)
2140 (setq address (replace-match "" t t address)))
2141 (let (result)
2142 (dolist (item (tramp-bluez-list-devices) result)
2143 (when (string-match address (cadr item))
2144 (setq result (car item)))))))
2145
1874(defun tramp-bluez-list-devices () 2146(defun tramp-bluez-list-devices ()
1875 "Return all discovered bluetooth devices as list. 2147 "Return all discovered bluetooth devices as list.
1876Every entry is a list (NAME ADDRESS). 2148Every entry is a list (NAME ADDRESS).
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 1688a166ca6..ec7e25247c7 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -58,8 +58,15 @@
58(defvar tramp-copy-size-limit) 58(defvar tramp-copy-size-limit)
59(defvar tramp-persistency-file-name) 59(defvar tramp-persistency-file-name)
60(defvar tramp-remote-process-environment) 60(defvar tramp-remote-process-environment)
61;; Suppress nasty messages. 61
62(fset 'shell-command-sentinel 'ignore) 62;; Beautify batch mode.
63(when noninteractive
64 ;; Suppress nasty messages.
65 (fset 'shell-command-sentinel 'ignore)
66 ;; We do not want to be interrupted.
67 (eval-after-load 'tramp-gvfs
68 '(fset 'tramp-gvfs-handler-askquestion
69 (lambda (_message _choices) '(t nil 0)))))
63 70
64;; There is no default value on w32 systems, which could work out of the box. 71;; There is no default value on w32 systems, which could work out of the box.
65(defconst tramp-test-temporary-file-directory 72(defconst tramp-test-temporary-file-directory
@@ -1941,7 +1948,9 @@ This checks also `file-name-as-directory', `file-name-directory',
1941 1948
1942 ;; Copy file to directory. 1949 ;; Copy file to directory.
1943 (unwind-protect 1950 (unwind-protect
1944 (progn 1951 ;; FIXME: This fails on my QNAP server, see
1952 ;; /share/Web/owncloud/data/owncloud.log
1953 (unless (tramp--test-owncloud-p)
1945 (write-region "foo" nil source) 1954 (write-region "foo" nil source)
1946 (should (file-exists-p source)) 1955 (should (file-exists-p source))
1947 (make-directory target) 1956 (make-directory target)
@@ -1962,7 +1971,11 @@ This checks also `file-name-as-directory', `file-name-directory',
1962 1971
1963 ;; Copy directory to existing directory. 1972 ;; Copy directory to existing directory.
1964 (unwind-protect 1973 (unwind-protect
1965 (progn 1974 ;; FIXME: This fails on my QNAP server, see
1975 ;; /share/Web/owncloud/data/owncloud.log
1976 (unless (and (tramp--test-owncloud-p)
1977 (or (not (file-remote-p source))
1978 (not (file-remote-p target))))
1966 (make-directory source) 1979 (make-directory source)
1967 (should (file-directory-p source)) 1980 (should (file-directory-p source))
1968 (write-region "foo" nil (expand-file-name "foo" source)) 1981 (write-region "foo" nil (expand-file-name "foo" source))
@@ -1983,7 +1996,10 @@ This checks also `file-name-as-directory', `file-name-directory',
1983 1996
1984 ;; Copy directory/file to non-existing directory. 1997 ;; Copy directory/file to non-existing directory.
1985 (unwind-protect 1998 (unwind-protect
1986 (progn 1999 ;; FIXME: This fails on my QNAP server, see
2000 ;; /share/Web/owncloud/data/owncloud.log
2001 (unless
2002 (and (tramp--test-owncloud-p) (not (file-remote-p source)))
1987 (make-directory source) 2003 (make-directory source)
1988 (should (file-directory-p source)) 2004 (should (file-directory-p source))
1989 (write-region "foo" nil (expand-file-name "foo" source)) 2005 (write-region "foo" nil (expand-file-name "foo" source))
@@ -2069,7 +2085,9 @@ This checks also `file-name-as-directory', `file-name-directory',
2069 2085
2070 ;; Rename directory to existing directory. 2086 ;; Rename directory to existing directory.
2071 (unwind-protect 2087 (unwind-protect
2072 (progn 2088 ;; FIXME: This fails on my QNAP server, see
2089 ;; /share/Web/owncloud/data/owncloud.log
2090 (unless (tramp--test-owncloud-p)
2073 (make-directory source) 2091 (make-directory source)
2074 (should (file-directory-p source)) 2092 (should (file-directory-p source))
2075 (write-region "foo" nil (expand-file-name "foo" source)) 2093 (write-region "foo" nil (expand-file-name "foo" source))
@@ -2091,7 +2109,9 @@ This checks also `file-name-as-directory', `file-name-directory',
2091 2109
2092 ;; Rename directory/file to non-existing directory. 2110 ;; Rename directory/file to non-existing directory.
2093 (unwind-protect 2111 (unwind-protect
2094 (progn 2112 ;; FIXME: This fails on my QNAP server, see
2113 ;; /share/Web/owncloud/data/owncloud.log
2114 (unless (tramp--test-owncloud-p)
2095 (make-directory source) 2115 (make-directory source)
2096 (should (file-directory-p source)) 2116 (should (file-directory-p source))
2097 (write-region "foo" nil (expand-file-name "foo" source)) 2117 (write-region "foo" nil (expand-file-name "foo" source))
@@ -4079,6 +4099,11 @@ This does not support external Emacs calls."
4079 (string-equal 4099 (string-equal
4080 "mock" (file-remote-p tramp-test-temporary-file-directory 'method))) 4100 "mock" (file-remote-p tramp-test-temporary-file-directory 'method)))
4081 4101
4102(defun tramp--test-owncloud-p ()
4103 "Check, whether the owncloud method is used."
4104 (string-equal
4105 "owncloud" (file-remote-p tramp-test-temporary-file-directory 'method)))
4106
4082(defun tramp--test-rsync-p () 4107(defun tramp--test-rsync-p ()
4083 "Check, whether the rsync method is used. 4108 "Check, whether the rsync method is used.
4084This does not support special file names." 4109This does not support special file names."
@@ -4830,6 +4855,8 @@ Since it unloads Tramp, it shall be the last test to run."
4830;; * Work on skipped tests. Make a comment, when it is impossible. 4855;; * Work on skipped tests. Make a comment, when it is impossible.
4831;; * Fix `tramp-test05-expand-file-name-relative' in `expand-file-name'. 4856;; * Fix `tramp-test05-expand-file-name-relative' in `expand-file-name'.
4832;; * Fix `tramp-test06-directory-file-name' for `ftp'. 4857;; * Fix `tramp-test06-directory-file-name' for `ftp'.
4858;; * Investigate, why `tramp-test11-copy-file' and `tramp-test12-rename-file'
4859;; do not work properly for `owncloud'.
4833;; * Fix `tramp-test29-start-file-process' on MS Windows (`process-send-eof'?). 4860;; * Fix `tramp-test29-start-file-process' on MS Windows (`process-send-eof'?).
4834;; * Fix `tramp-test30-interrupt-process', timeout doesn't work reliably. 4861;; * Fix `tramp-test30-interrupt-process', timeout doesn't work reliably.
4835;; * Fix Bug#16928 in `tramp-test41-asynchronous-requests'. 4862;; * Fix Bug#16928 in `tramp-test41-asynchronous-requests'.