diff options
author | Michael Albinus <michael.albinus@gmx.de> | 2021-07-07 18:36:53 +0200 |
---|---|---|
committer | Michael Albinus <michael.albinus@gmx.de> | 2021-07-07 18:36:53 +0200 |
commit | d35868bec96718705c9bc8aaac3bc583c837033f (patch) | |
tree | a92e9b2fe0fddc4add787acb563aa798fccbe3b0 /src/filelock.c | |
parent | 90c89e8bdeca61aceae79e4c60a9a51800574914 (diff) | |
download | emacs-d35868bec96718705c9bc8aaac3bc583c837033f.tar.gz |
Implement file locks for remote files (Bug#49261)
* doc/lispref/files.texi (Magic File Names): Add file-locked-p,
lock-file and unlock-file.
* etc/NEWS: Tramp supports file locks now.
* lisp/net/tramp-adb.el (tramp-adb-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-adb-handle-write-region): Handle LOCKNAME.
* lisp/net/tramp-archive.el (tramp-archive-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
* lisp/net/tramp-crypt.el (tramp-crypt-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-crypt-handle-file-locked-p, tramp-crypt-handle-lock-file)
(tramp-crypt-handle-unlock-file): New defun.
* lisp/net/tramp-fuse.el (tramp-fuse-mounted-p): Simplify.
(tramp-fuse-unmount): New defun.
* lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-gvfs-maybe-open-connection): Set "lock-pid" connection property.
* lisp/net/tramp-rclone.el (tramp-rclone-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-rclone-maybe-open-connection): Set "lock-pid" connection property.
* lisp/net/tramp-sh.el (tramp-sh-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-sh-handle-write-region): Handle LOCKNAME.
* lisp/net/tramp-smb.el (tramp-smb-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-smb-handle-copy-directory): Use `sleep-for'.
(tramp-smb-handle-write-region): Handle LOCKNAME.
* lisp/net/tramp-sshfs.el (tramp-sshfs-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-sshfs-handle-write-region): Handle LOCKNAME.
(tramp-sshfs-maybe-open-connection): Set "lock-pid" connection property.
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-file-name-handler-alist):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-sudoedit-maybe-open-connection):
Set "lock-pid" connection property.
* lisp/net/tramp.el (tramp-file-name-for-operation):
Add `file-locked-p', `lock-file' and `unlock-file'.
(tramp-make-lock-name, tramp-get-lock-file, tramp-get-lock-pid)
(tramp-handle-file-locked-p, tramp-handle-lock-file)
(tramp-handle-unlock-file): New defuns.
(tramp-lock-file-contents-regexp): New regexp.
(tramp-handle-write-region): Handle LOCKNAME.
* src/filelock.c (lock_file, unlock_file_body, Ffile_locked_p):
Call handler if exists.
(Flock_file, Funlock_file): New defuns.
(Qlock_file, Qunlock_file, Qfile_locked_p): Declare symbols.
(Slock_file, Sunlock_file): Declare subroutines.
* test/lisp/net/tramp-archive-tests.el
(tramp-archive-test40-make-nearby-temp-file)
(tramp-archive-test43-file-system-info): Rename.
* test/lisp/net/tramp-tests.el (top): Set `create-lockfiles' to nil.
(tramp--test-fuse-p): New defun.
(tramp-test14-delete-directory): Use it.
(tramp-test39-lock-file): New test.
(tramp-test40-make-nearby-temp-file)
(tramp-test41-special-characters)
(tramp-test41-special-characters-with-stat)
(tramp-test41-special-characters-with-perl)
(tramp-test41-special-characters-with-ls, tramp-test42-utf8)
(tramp-test42-utf8-with-stat, tramp-test42-utf8-with-perl)
(tramp-test42-utf8-with-ls, tramp-test43-file-system-info)
(tramp-test44-asynchronous-requests, tramp-test45-auto-load)
(tramp-test45-delay-load, tramp-test45-recursive-load)
(tramp-test45-remote-load-path, tramp-test46-unload): Rename.
(tramp--test-special-characters, tramp--test-utf8)
(tramp--test-asynchronous-requests-timeout): Modify docstring.
Diffstat (limited to 'src/filelock.c')
-rw-r--r-- | src/filelock.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/filelock.c b/src/filelock.c index 446a262a1ce..dcdc635c25e 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -671,6 +671,16 @@ lock_file (Lisp_Object fn) if (will_dump_p ()) return; + /* If the file name has special constructs in it, + call the corresponding file name handler. */ + Lisp_Object handler; + handler = Ffind_file_name_handler (fn, Qlock_file); + if (!NILP (handler)) + { + call2 (handler, Qlock_file, fn); + return; + } + orig_fn = fn; fn = Fexpand_file_name (fn, Qnil); #ifdef WINDOWSNT @@ -725,6 +735,16 @@ unlock_file_body (Lisp_Object fn) char *lfname; USE_SAFE_ALLOCA; + /* If the file name has special constructs in it, + call the corresponding file name handler. */ + Lisp_Object handler; + handler = Ffind_file_name_handler (fn, Qunlock_file); + if (!NILP (handler)) + { + call2 (handler, Qunlock_file, fn); + return Qnil; + } + Lisp_Object filename = Fexpand_file_name (fn, Qnil); fn = ENCODE_FILE (filename); @@ -784,6 +804,27 @@ unlock_all_files (void) } } +DEFUN ("lock-file", Flock_file, Slock_file, + 0, 1, 0, + doc: /* Lock FILE. +If the option `create-lockfiles' is nil, this does nothing. */) + (Lisp_Object file) +{ + CHECK_STRING (file); + lock_file (file); + return Qnil; +} + +DEFUN ("unlock-file", Funlock_file, Sunlock_file, + 0, 1, 0, + doc: /* Unlock FILE. */) + (Lisp_Object file) +{ + CHECK_STRING (file); + unlock_file (file); + return Qnil; +} + DEFUN ("lock-buffer", Flock_buffer, Slock_buffer, 0, 1, 0, doc: /* Lock FILE, if current buffer is modified. @@ -844,6 +885,15 @@ t if it is locked by you, else a string saying which user has locked it. */) lock_info_type locker; USE_SAFE_ALLOCA; + /* If the file name has special constructs in it, + call the corresponding file name handler. */ + Lisp_Object handler; + handler = Ffind_file_name_handler (filename, Qfile_locked_p); + if (!NILP (handler)) + { + return call2 (handler, Qfile_locked_p, filename); + } + filename = Fexpand_file_name (filename, Qnil); Lisp_Object encoded_filename = ENCODE_FILE (filename); MAKE_LOCK_NAME (lfname, encoded_filename); @@ -876,7 +926,13 @@ The name of the (per-buffer) lockfile is constructed by prepending a Info node `(emacs)Interlocking'. */); create_lockfiles = true; - defsubr (&Sunlock_buffer); + DEFSYM (Qlock_file, "lock-file"); + DEFSYM (Qunlock_file, "unlock-file"); + DEFSYM (Qfile_locked_p, "file-locked-p"); + + defsubr (&Slock_file); + defsubr (&Sunlock_file); defsubr (&Slock_buffer); + defsubr (&Sunlock_buffer); defsubr (&Sfile_locked_p); } |