[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r116991: Merge from emacs-24; up to r116982
From: |
Juanma Barranquero |
Subject: |
[Emacs-diffs] trunk r116991: Merge from emacs-24; up to r116982 |
Date: |
Fri, 18 Apr 2014 23:37:36 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 116991 [merge]
revision-id: address@hidden
parent: address@hidden
parent: address@hidden
committer: Juanma Barranquero <address@hidden>
branch nick: trunk
timestamp: Sat 2014-04-19 01:36:51 +0200
message:
Merge from emacs-24; up to r116982
modified:
admin/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-2226
admin/notes/bzr bzr-20100518025134-ebvhi2w74h1r56u7-1
lisp/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1432
lisp/net/tramp-adb.el trampadb.el-20121204164216-03wyr5miam215d7f-1
lisp/net/tramp-compat.el
trampcompat.el-20091113204419-o5vbwnq5f7feedwu-7298
lisp/net/tramp.el tramp.el-20091113204419-o5vbwnq5f7feedwu-2427
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/emacs.c emacs.c-20091113204419-o5vbwnq5f7feedwu-241
src/insdel.c insdel.c-20091113204419-o5vbwnq5f7feedwu-175
src/xdisp.c xdisp.c-20091113204419-o5vbwnq5f7feedwu-240
src/xterm.c xterm.c-20091113204419-o5vbwnq5f7feedwu-244
test/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-8588
test/automated/tramp-tests.el tramptests.el-20131105142319-d9zp3oprkpxj5v1e-1
=== modified file 'admin/ChangeLog'
--- a/admin/ChangeLog 2014-04-11 06:51:49 +0000
+++ b/admin/ChangeLog 2014-04-18 23:36:51 +0000
@@ -1,3 +1,9 @@
+2014-04-18 Paul Eggert <address@hidden>
+
+ * notes/bzr: Update instructions for merging from gnulib.
+ Remove obsolete note about tramp.el and tramp-sh.el.
+ Change "emacs-23" to "emacs-24".
+
2014-04-11 Glenn Morris <address@hidden>
* grammars/Makefile.in (EMACSDATA, EMACSDOC, EMACSPATH): Unexport.
=== modified file 'admin/notes/bzr'
--- a/admin/notes/bzr 2014-01-10 10:43:18 +0000
+++ b/admin/notes/bzr 2014-04-17 21:20:51 +0000
@@ -3,9 +3,9 @@
* Install changes only on one branch, let them get merged elsewhere if needed.
In particular, install bug-fixes only on the release branch (if there
is one) and let them get synced to the trunk; do not install them by
-hand on the trunk as well. E.g. if there is an active "emacs-23" branch
-and you have a bug-fix appropriate for the next Emacs-23.x release,
-install it only on the emacs-23 branch, not on the trunk as well.
+hand on the trunk as well. E.g. if there is an active "emacs-24" branch
+and you have a bug-fix appropriate for the next emacs-24.x release,
+install it only on the emacs-24 branch, not on the trunk as well.
Installing things manually into more than one branch makes merges more
difficult.
@@ -18,7 +18,7 @@
and branch yourself (when committing the branch change, indicate
in the commit log that it should not be merged to the trunk; see below).
-* Backporting a bug-fix from the trunk to a branch (e.g. "emacs-23").
+* Backporting a bug-fix from the trunk to a branch (e.g. "emacs-24").
Indicate in the commit log that there is no need to merge the commit
to the trunk. Anything that matches `bzrmerge-skip-regexp' will do;
eg start the commit message with "Backport:". This is helpful for the
@@ -49,7 +49,7 @@
* Installing changes from gnulib
Some of the files in Emacs are copied from gnulib. To synchronize
these files from the version of gnulib that you have checked out into
-a sibling directory of your branch, type "make sync-from-gnulib"; this
+a sibling directory of your branch, type "admin/merge-gnulib"; this
will check out the latest version of gnulib if there is no sibling
directory already. It is a good idea to run "bzr status" afterwards,
so that if a gnulib module added a file, you can record the new file
@@ -57,17 +57,12 @@
usual way.
To change the set of gnulib modules, change the GNULIB_MODULES
-variable in the top-level Makefile.in, and then run:
-
- ./config.status
- make sync-from-gnulib
- bzr status
-
-The last command will mention files that may need to be added using
-"bzr add". If you remove a gnulib module, or if a gnulib module
+variable in admin/merge-gnulib before running it.
+
+If you remove a gnulib module, or if a gnulib module
removes a file, then remove the corresponding files by hand.
-* How to merge changes from emacs-23 to trunk
+* How to merge changes from emacs-24 to trunk
The following description uses bound branches, presumably it works in
a similar way with unbound ones.
@@ -90,7 +85,7 @@
Maybe the default Emacs behavior without this plugin is better,
though, it's not clear yet.
-1) Get clean, up-to-date copies of the emacs-23 and trunk branches.
+1) Get clean, up-to-date copies of the emacs-24 and trunk branches.
Check for any uncommitted changes with bzr status.
2) M-x cd /path/to/trunk
@@ -102,7 +97,7 @@
3) load admin/bzrmerge.el
-4) M-x bzrmerge RET /path/to/emacs-23 RET
+4) M-x bzrmerge RET /path/to/emacs-24 RET
It will prompt about revisions that should be skipped, based on the
regexp in bzrmerge-missing. If there are more revisions that you know
@@ -119,7 +114,7 @@
Before committing, check bzr status and bzr diff output.
If you have run bzrmerge enough times, the "pending merge tip" in bzr
-status should be the last revision from the emacs-23 branch, and
+status should be the last revision from the emacs-24 branch, and
bzr status -v should show all the revisions you expect to merge.
(Note that it will also show "skipped" revisions. This is expected,
@@ -141,18 +136,13 @@
Notes:
-1) A lot that was in tramp.el in emacs-23 has moved to tramp-sh.el in
-the trunk. If you end up with a conflict in tramp.el, the changes may
-need to go to tramp-sh.el instead. Remember to update the file name in
-the ChangeLog.
-
-2) If a file is modified in emacs-23, and deleted in the trunk, you
+1) If a file is modified in emacs-24, and deleted in the trunk, you
get a "contents conflict". Assuming the changes don't need to be in
the trunk at all, use `bzr resolve path/to/file --take-this' to keep the
trunk version. Prior to bzr 2.2.3, this may fail. You can just
delete the .OTHER etc files by hand and use bzr resolve path/to/file.
-3) Conflicts in autoload md5sums in comments. Strictly speaking, the
+2) Conflicts in autoload md5sums in comments. Strictly speaking, the
right thing to do is merge everything else, resolve the conflict by
choosing either the trunk or branch version, then run `make -C lisp
autoloads' to update the md5sums to the correct trunk value before
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog 2014-04-17 07:54:23 +0000
+++ b/lisp/ChangeLog 2014-04-18 23:36:51 +0000
@@ -1,3 +1,20 @@
+2014-04-18 Michael Albinus <address@hidden>
+
+ * net/tramp.el (tramp-run-real-handler, tramp-file-name-handler):
+ Do not autoload.
+ (tramp-file-name-handler, tramp-completion-file-name-handler):
+ Revert patch from 2014-04-10, it isn't necessary anymore.
+ (tramp-autoload-file-name-handler)
+ (tramp-register-autoload-file-name-handlers): New defuns.
+ (top): Autoload call of `tramp-register-autoload-file-name-handlers'.
+ (tramp-register-file-name-handlers): Remove also
+ `tramp-autoload-file-name-handler' from `file-name-handler-list'.
+ Do not autoload its invocation, but eval it after loading of 'tramp.
+
+ * net/tramp-adb.el (tramp-unload-hook): Unload `tramp-adb'.
+
+ * net/tramp-compat.el (tramp-unload-hook): Unload `tramp-loaddefs'.
+
2014-04-17 Daniel Colascione <address@hidden>
Add support for bracketed paste mode; add infrastructure for
=== modified file 'lisp/net/tramp-adb.el'
--- a/lisp/net/tramp-adb.el 2014-02-28 08:41:24 +0000
+++ b/lisp/net/tramp-adb.el 2014-04-18 18:57:04 +0000
@@ -1183,5 +1183,9 @@
(read (current-buffer)))
":" 'omit-nulls))))))))
+(add-hook 'tramp-unload-hook
+ (lambda ()
+ (unload-feature 'tramp-adb 'force)))
+
(provide 'tramp-adb)
;;; tramp-adb.el ends here
=== modified file 'lisp/net/tramp-compat.el'
--- a/lisp/net/tramp-compat.el 2014-01-01 07:43:34 +0000
+++ b/lisp/net/tramp-compat.el 2014-04-18 18:57:04 +0000
@@ -587,6 +587,7 @@
(add-hook 'tramp-unload-hook
(lambda ()
+ (unload-feature 'tramp-loaddefs 'force)
(unload-feature 'tramp-compat 'force)))
(provide 'tramp-compat)
=== modified file 'lisp/net/tramp.el'
--- a/lisp/net/tramp.el 2014-04-10 07:17:40 +0000
+++ b/lisp/net/tramp.el 2014-04-18 18:57:04 +0000
@@ -1943,8 +1943,7 @@
(add-to-list
'result (cons (regexp-quote tmpname) (cdr elt)) 'append)))))
-;;;###autoload
-(progn (defun tramp-run-real-handler (operation args)
+(defun tramp-run-real-handler (operation args)
"Invoke normal file name handler for OPERATION.
First arg specifies the OPERATION, second arg is a list of arguments to
pass to the OPERATION."
@@ -1958,7 +1957,7 @@
,(and (eq inhibit-file-name-operation operation)
inhibit-file-name-handlers)))
(inhibit-file-name-operation operation))
- (apply operation args))))
+ (apply operation args)))
;;;###autoload
(progn (defun tramp-completion-run-real-handler (operation args)
@@ -2100,22 +2099,12 @@
(tramp-compat-condition-case-unless-debug ,var ,bodyform ,@handlers)))
;; Main function.
-;;;###autoload
(defun tramp-file-name-handler (operation &rest args)
"Invoke Tramp file name handler.
Falls back to normal file name handler if no Tramp file name handler exists."
(if tramp-mode
(save-match-data
- (let* ((default-directory
- ;; Some packages set the default directory to a
- ;; remote path, before tramp.el has been loaded.
- ;; This results in recursive loading. Therefore, we
- ;; set `default-directory' to a local path. `args'
- ;; could also be remote when loading tramp.el, but
- ;; that would be such perverse we don't care about.
- (if load-in-progress
- temporary-file-directory default-directory))
- (filename
+ (let* ((filename
(tramp-replace-environment-variables
(apply 'tramp-file-name-for-operation operation args)))
(completion (tramp-completion-mode-p))
@@ -2227,11 +2216,8 @@
"Invoke Tramp file name completion handler.
Falls back to normal file name handler if no Tramp file name handler exists."
;; We bind `directory-sep-char' here for XEmacs on Windows, which
- ;; would otherwise use backslash. For `default-directory', see
- ;; comment in `tramp-file-name-handler'.
+ ;; would otherwise use backslash.
(let ((directory-sep-char ?/)
- (default-directory
- (if load-in-progress temporary-file-directory default-directory))
(fn (assoc operation tramp-completion-file-name-handler-alist)))
(if (and
;; When `tramp-mode' is not enabled, we don't do anything.
@@ -2255,15 +2241,43 @@
(tramp-completion-run-real-handler operation args)))))
;;;###autoload
-(progn (defun tramp-register-file-name-handlers ()
+(progn (defun tramp-autoload-file-name-handler (operation &rest args)
+ "Load Tramp file name handler, and perform OPERATION."
+ ;; Avoid recursive loading of tramp.el.
+ (let ((default-directory temporary-file-directory))
+ (load "tramp" nil t))
+ (apply operation args)))
+
+;; `tramp-autoload-file-name-handler' must be registered before
+;; evaluation of site-start and init files, because there might exist
+;; remote files already, f.e. files kept via recentf-mode. We cannot
+;; autoload `tramp-file-name-handler', because it would result in
+;; recursive loading of tramp.el when `default-directory' is set to
+;; remote.
+;;;###autoload
+(progn (defun tramp-register-autoload-file-name-handlers ()
+ "Add Tramp file name handlers to `file-name-handler-alist' during autoload."
+ (add-to-list 'file-name-handler-alist
+ (cons tramp-file-name-regexp
+ 'tramp-autoload-file-name-handler))
+ (put 'tramp-autoload-file-name-handler 'safe-magic t)
+ (add-to-list 'file-name-handler-alist
+ (cons tramp-completion-file-name-regexp
+ 'tramp-completion-file-name-handler))
+ (put 'tramp-completion-file-name-handler 'safe-magic t)))
+
+;;;###autoload
+(tramp-register-autoload-file-name-handlers)
+
+(defun tramp-register-file-name-handlers ()
"Add Tramp file name handlers to `file-name-handler-alist'."
;; Remove autoloaded handlers from file name handler alist. Useful,
;; if `tramp-syntax' has been changed.
- (let ((a1 (rassq 'tramp-file-name-handler file-name-handler-alist)))
- (setq file-name-handler-alist (delq a1 file-name-handler-alist)))
- (let ((a1 (rassq
- 'tramp-completion-file-name-handler file-name-handler-alist)))
- (setq file-name-handler-alist (delq a1 file-name-handler-alist)))
+ (dolist (fnh '(tramp-file-name-handler
+ tramp-completion-file-name-handler
+ tramp-autoload-file-name-handler))
+ (let ((a1 (rassq fnh file-name-handler-alist)))
+ (setq file-name-handler-alist (delq a1 file-name-handler-alist))))
;; Add the handlers.
(add-to-list 'file-name-handler-alist
(cons tramp-file-name-regexp 'tramp-file-name-handler))
@@ -2278,13 +2292,9 @@
(let ((entry (rassoc fnh file-name-handler-alist)))
(when entry
(setq file-name-handler-alist
- (cons entry (delete entry file-name-handler-alist))))))))
+ (cons entry (delete entry file-name-handler-alist)))))))
-;; `tramp-file-name-handler' must be registered before evaluation of
-;; site-start and init files, because there might exist remote files
-;; already, f.e. files kept via recentf-mode.
-;;;###autoload
-(tramp-register-file-name-handlers)
+(eval-after-load 'tramp (tramp-register-file-name-handlers))
(defun tramp-exists-file-name-handler (operation &rest args)
"Check, whether OPERATION runs a file name handler."
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2014-04-17 14:59:22 +0000
+++ b/src/ChangeLog 2014-04-18 23:36:51 +0000
@@ -1,3 +1,22 @@
+2014-04-18 Paul Eggert <address@hidden>
+
+ * emacs.c (close_output_streams): Don't clear and restore errno.
+
+2014-04-18 Jan Djärv <address@hidden>
+
+ * xterm.c (x_make_frame_visible): Prevent endless loop when frame
+ never becomes visible, i.e. using XMonad (Bug#17237).
+
+2014-04-18 Eli Zaretskii <address@hidden>
+
+ * xdisp.c (insert_left_trunc_glyphs): Ensure the left truncation
+ glyph is written to TEXT_AREA of the temporary glyph_row. (Bug#17288)
+ (Fline_pixel_height): Don't assume that the current buffer and the
+ selected window's buffer are one and the same. (Bug#17281)
+
+ * insdel.c (invalidate_buffer_caches): Invalidate the bidi
+ paragraph-start cache before the newline cache. (Bug#17269)
+
2014-04-17 Paul Eggert <address@hidden>
* term.c (tty_send_additional_strings): No need to fflush here,
@@ -23,6 +42,7 @@
2014-04-16 Eli Zaretskii <address@hidden>
+ Fix the MSDOS build.
* unexcoff.c [MSDOS]: Include libc/atexit.h.
(copy_text_and_data): Zero out the atexit chain pointer before
dumping Emacs.
=== modified file 'src/emacs.c'
--- a/src/emacs.c 2014-04-16 19:43:46 +0000
+++ b/src/emacs.c 2014-04-18 23:36:51 +0000
@@ -690,11 +690,6 @@
static void
close_output_streams (void)
{
- int err = errno;
-
- /* close_stream checks errno, so make sure it doesn't inherit some
- random value. */
- errno = 0;
if (close_stream (stdout) != 0)
{
emacs_perror ("Write error to standard output");
@@ -703,8 +698,6 @@
if (close_stream (stderr) != 0)
_exit (EXIT_FAILURE);
-
- errno = err;
}
/* ARGSUSED */
=== modified file 'src/insdel.c'
--- a/src/insdel.c 2014-04-16 19:43:46 +0000
+++ b/src/insdel.c 2014-04-18 23:36:51 +0000
@@ -1849,14 +1849,9 @@
need to consider the caches of their base buffer. */
if (buf->base_buffer)
buf = buf->base_buffer;
- if (buf->newline_cache)
- invalidate_region_cache (buf,
- buf->newline_cache,
- start - BUF_BEG (buf), BUF_Z (buf) - end);
- if (buf->width_run_cache)
- invalidate_region_cache (buf,
- buf->width_run_cache,
- start - BUF_BEG (buf), BUF_Z (buf) - end);
+ /* The bidi_paragraph_cache must be invalidated first, because doing
+ so might need to use the newline_cache (via find_newline_no_quit,
+ see below). */
if (buf->bidi_paragraph_cache)
{
if (start != end
@@ -1880,13 +1875,20 @@
&start_byte);
set_buffer_internal (old);
}
- if (line_beg > BUF_BEG (buf))
- start = line_beg - 1;
+ start = line_beg - (line_beg > BUF_BEG (buf));
}
invalidate_region_cache (buf,
buf->bidi_paragraph_cache,
start - BUF_BEG (buf), BUF_Z (buf) - end);
}
+ if (buf->newline_cache)
+ invalidate_region_cache (buf,
+ buf->newline_cache,
+ start - BUF_BEG (buf), BUF_Z (buf) - end);
+ if (buf->width_run_cache)
+ invalidate_region_cache (buf,
+ buf->width_run_cache,
+ start - BUF_BEG (buf), BUF_Z (buf) - end);
}
/* These macros work with an argument named `preserve_ptr'
=== modified file 'src/xdisp.c'
--- a/src/xdisp.c 2014-04-12 19:24:17 +0000
+++ b/src/xdisp.c 2014-04-18 23:36:51 +0000
@@ -1262,12 +1262,23 @@
struct it it;
struct text_pos pt;
struct window *w = XWINDOW (selected_window);
+ struct buffer *old_buffer = NULL;
+ Lisp_Object result;
+ if (XBUFFER (w->contents) != current_buffer)
+ {
+ old_buffer = current_buffer;
+ set_buffer_internal_1 (XBUFFER (w->contents));
+ }
SET_TEXT_POS (pt, PT, PT_BYTE);
start_display (&it, w, pt);
it.vpos = it.current_y = 0;
last_height = 0;
- return make_number (line_bottom_y (&it));
+ result = make_number (line_bottom_y (&it));
+ if (old_buffer)
+ set_buffer_internal_1 (old_buffer);
+
+ return result;
}
/* Return the default pixel height of text lines in window W. The
@@ -18677,6 +18688,7 @@
truncate_it.current_x = 0;
truncate_it.face_id = DEFAULT_FACE_ID;
truncate_it.glyph_row = &scratch_glyph_row;
+ truncate_it.area = TEXT_AREA;
truncate_it.glyph_row->used[TEXT_AREA] = 0;
CHARPOS (truncate_it.position) = BYTEPOS (truncate_it.position) = -1;
truncate_it.object = make_number (0);
=== modified file 'src/xterm.c'
--- a/src/xterm.c 2014-04-05 19:30:36 +0000
+++ b/src/xterm.c 2014-04-18 23:36:51 +0000
@@ -8900,6 +8900,7 @@
x_make_frame_visible (struct frame *f)
{
int original_top, original_left;
+ int tries = 0;
block_input ();
@@ -9007,7 +9008,13 @@
/* Force processing of queued events. */
x_sync (f);
- /* This hack is still in use at least for Cygwin. See
+ /* If on another desktop, the deiconify/map may be ignored and the
+ frame never becomes visible. XMonad does this.
+ Prevent an endless loop. */
+ if (FRAME_ICONIFIED_P (f) && ++tries > 100)
+ break;
+
+ /* This hack is still in use at least for Cygwin. See
http://lists.gnu.org/archive/html/emacs-devel/2013-12/msg00351.html.
Machines that do polling rather than SIGIO have been
=== modified file 'test/ChangeLog'
--- a/test/ChangeLog 2014-04-11 06:51:49 +0000
+++ b/test/ChangeLog 2014-04-18 23:36:51 +0000
@@ -1,3 +1,18 @@
+2014-04-18 Michael Albinus <address@hidden>
+
+ * automated/tramp-tests.el (tramp-copy-size-limit): Set to nil.
+ (tramp--test-make-temp-name): Optional argument LOCAL.
+ (tramp--instrument-test-case): Show messages. Catch also `quit'.
+ (tramp-test10-write-region): No special test for out-of-band copy
+ needed anymore.
+ (tramp-test11-copy-file, tramp-test12-rename-file)
+ (tramp-test21-file-links): Extend tests.
+ (tramp-test20-file-modes): More robust check for user "root".
+ (tramp--test-check-files): New defun.
+ (tramp-test30-special-characters, tramp-test33-recursive-load)
+ (tramp-test34-unload): New tests.
+ (tramp-test31-utf8, tramp-test32-asynchronous-requests): Rename.
+
2014-04-11 Glenn Morris <address@hidden>
* automated/Makefile.in (EMACSDATA, EMACSDOC, EMACSPATH): Unexport.
=== modified file 'test/automated/tramp-tests.el'
--- a/test/automated/tramp-tests.el 2014-03-07 14:11:37 +0000
+++ b/test/automated/tramp-tests.el 2014-04-18 18:58:13 +0000
@@ -56,6 +56,7 @@
(setq password-cache-expiry nil
tramp-verbose 0
+ tramp-copy-size-limit nil
tramp-message-show-message nil)
;; Disable interactive passwords in batch mode.
@@ -92,10 +93,11 @@
;; Return result.
(cdr tramp--test-enabled-checked))
-(defun tramp--test-make-temp-name ()
+(defun tramp--test-make-temp-name (&optional local)
"Create a temporary file name for test."
(expand-file-name
- (make-temp-name "tramp-test") tramp-test-temporary-file-directory))
+ (make-temp-name "tramp-test")
+ (if local temporary-file-directory tramp-test-temporary-file-directory)))
(defmacro tramp--instrument-test-case (verbose &rest body)
"Run BODY with `tramp-verbose' equal VERBOSE.
@@ -103,12 +105,17 @@
eval properly in `should', `should-not' or `should-error'."
(declare (indent 1) (debug (natnump body)))
`(let ((tramp-verbose ,verbose)
+ (tramp-message-show-message t)
(tramp-debug-on-error t))
(condition-case err
- (progn ,@body)
+ ;; In general, we cannot use a timeout here: this would
+ ;; prevent traces when the test runs into an error.
+; (with-timeout (10 (ert-fail "`tramp--instrument-test-case' timed out"))
+ (progn
+ ,@body)
(ert-test-skipped
(signal (car err) (cdr err)))
- (error
+ ((error quit)
(with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
(with-current-buffer (tramp-get-connection-buffer v)
(message "%s" (buffer-string)))
@@ -662,15 +669,7 @@
(write-region 3 5 tmp-name))
(with-temp-buffer
(insert-file-contents tmp-name)
- (should (string-equal (buffer-string) "34")))
- ;; Trigger out-of-band copy.
- (let ((string ""))
- (while (<= (length string) tramp-copy-size-limit)
- (setq string (concat string (md5 string))))
- (write-region string nil tmp-name)
- (with-temp-buffer
- (insert-file-contents tmp-name)
- (should (string-equal (buffer-string) string)))))
+ (should (string-equal (buffer-string) "34"))))
(ignore-errors (delete-file tmp-name)))))
(ert-deftest tramp-test11-copy-file ()
@@ -678,7 +677,12 @@
(skip-unless (tramp--test-enabled))
(let ((tmp-name1 (tramp--test-make-temp-name))
- (tmp-name2 (tramp--test-make-temp-name)))
+ (tmp-name2 (tramp--test-make-temp-name))
+ (tmp-name3 (tramp--test-make-temp-name))
+ (tmp-name4 (tramp--test-make-temp-name 'local))
+ (tmp-name5 (tramp--test-make-temp-name 'local)))
+
+ ;; Copy on remote side.
(unwind-protect
(progn
(write-region "foo" nil tmp-name1)
@@ -686,17 +690,69 @@
(should (file-exists-p tmp-name2))
(with-temp-buffer
(insert-file-contents tmp-name2)
- (should (string-equal (buffer-string) "foo"))))
- (ignore-errors
- (delete-file tmp-name1)
- (delete-file tmp-name2)))))
+ (should (string-equal (buffer-string) "foo")))
+ (should-error (copy-file tmp-name1 tmp-name2))
+ (copy-file tmp-name1 tmp-name2 'ok)
+ (make-directory tmp-name3)
+ (copy-file tmp-name1 tmp-name3)
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name1) tmp-name3))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name2))
+ (ignore-errors (delete-directory tmp-name3 'recursive)))
+
+ ;; Copy from remote side to local side.
+ (unwind-protect
+ (progn
+ (write-region "foo" nil tmp-name1)
+ (copy-file tmp-name1 tmp-name4)
+ (should (file-exists-p tmp-name4))
+ (with-temp-buffer
+ (insert-file-contents tmp-name4)
+ (should (string-equal (buffer-string) "foo")))
+ (should-error (copy-file tmp-name1 tmp-name4))
+ (copy-file tmp-name1 tmp-name4 'ok)
+ (make-directory tmp-name5)
+ (copy-file tmp-name1 tmp-name5)
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name1) tmp-name5))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name4))
+ (ignore-errors (delete-directory tmp-name5 'recursive)))
+
+ ;; Copy from local side to remote side.
+ (unwind-protect
+ (progn
+ (write-region "foo" nil tmp-name4 nil 'nomessage)
+ (copy-file tmp-name4 tmp-name1)
+ (should (file-exists-p tmp-name1))
+ (with-temp-buffer
+ (insert-file-contents tmp-name1)
+ (should (string-equal (buffer-string) "foo")))
+ (should-error (copy-file tmp-name4 tmp-name1))
+ (copy-file tmp-name4 tmp-name1 'ok)
+ (make-directory tmp-name3)
+ (copy-file tmp-name4 tmp-name3)
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name4) tmp-name3))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name4))
+ (ignore-errors (delete-directory tmp-name3 'recursive)))))
(ert-deftest tramp-test12-rename-file ()
"Check `rename-file'."
(skip-unless (tramp--test-enabled))
(let ((tmp-name1 (tramp--test-make-temp-name))
- (tmp-name2 (tramp--test-make-temp-name)))
+ (tmp-name2 (tramp--test-make-temp-name))
+ (tmp-name3 (tramp--test-make-temp-name))
+ (tmp-name4 (tramp--test-make-temp-name 'local))
+ (tmp-name5 (tramp--test-make-temp-name 'local)))
+
+ ;; Rename on remote side.
(unwind-protect
(progn
(write-region "foo" nil tmp-name1)
@@ -705,8 +761,71 @@
(should (file-exists-p tmp-name2))
(with-temp-buffer
(insert-file-contents tmp-name2)
- (should (string-equal (buffer-string) "foo"))))
- (ignore-errors (delete-file tmp-name2)))))
+ (should (string-equal (buffer-string) "foo")))
+ (write-region "foo" nil tmp-name1)
+ (should-error (rename-file tmp-name1 tmp-name2))
+ (rename-file tmp-name1 tmp-name2 'ok)
+ (should-not (file-exists-p tmp-name1))
+ (write-region "foo" nil tmp-name1)
+ (make-directory tmp-name3)
+ (rename-file tmp-name1 tmp-name3)
+ (should-not (file-exists-p tmp-name1))
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name1) tmp-name3))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name2))
+ (ignore-errors (delete-directory tmp-name3 'recursive)))
+
+ ;; Rename from remote side to local side.
+ (unwind-protect
+ (progn
+ (write-region "foo" nil tmp-name1)
+ (rename-file tmp-name1 tmp-name4)
+ (should-not (file-exists-p tmp-name1))
+ (should (file-exists-p tmp-name4))
+ (with-temp-buffer
+ (insert-file-contents tmp-name4)
+ (should (string-equal (buffer-string) "foo")))
+ (write-region "foo" nil tmp-name1)
+ (should-error (rename-file tmp-name1 tmp-name4))
+ (rename-file tmp-name1 tmp-name4 'ok)
+ (should-not (file-exists-p tmp-name1))
+ (write-region "foo" nil tmp-name1)
+ (make-directory tmp-name5)
+ (rename-file tmp-name1 tmp-name5)
+ (should-not (file-exists-p tmp-name1))
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name1) tmp-name5))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name4))
+ (ignore-errors (delete-directory tmp-name5 'recursive)))
+
+ ;; Rename from local side to remote side.
+ (unwind-protect
+ (progn
+ (write-region "foo" nil tmp-name4 nil 'nomessage)
+ (rename-file tmp-name4 tmp-name1)
+ (should-not (file-exists-p tmp-name4))
+ (should (file-exists-p tmp-name1))
+ (with-temp-buffer
+ (insert-file-contents tmp-name1)
+ (should (string-equal (buffer-string) "foo")))
+ (write-region "foo" nil tmp-name4 nil 'nomessage)
+ (should-error (rename-file tmp-name4 tmp-name1))
+ (rename-file tmp-name4 tmp-name1 'ok)
+ (should-not (file-exists-p tmp-name4))
+ (write-region "foo" nil tmp-name4 nil 'nomessage)
+ (make-directory tmp-name3)
+ (rename-file tmp-name4 tmp-name3)
+ (should-not (file-exists-p tmp-name4))
+ (should
+ (file-exists-p
+ (expand-file-name (file-name-nondirectory tmp-name4) tmp-name3))))
+ (ignore-errors (delete-file tmp-name1))
+ (ignore-errors (delete-file tmp-name4))
+ (ignore-errors (delete-directory tmp-name3 'recursive)))))
(ert-deftest tramp-test13-make-directory ()
"Check `make-directory'.
@@ -930,7 +1049,7 @@
(should (= (file-modes tmp-name) #o444))
(should-not (file-executable-p tmp-name))
;; A file is always writable for user "root".
- (when (not (string-equal (file-remote-p tmp-name 'user) "root"))
+ (unless (zerop (nth 2 (file-attributes tmp-name)))
(should-not (file-writable-p tmp-name))))
(ignore-errors (delete-file tmp-name)))))
@@ -941,7 +1060,7 @@
(let ((tmp-name1 (tramp--test-make-temp-name))
(tmp-name2 (tramp--test-make-temp-name))
- (tmp-name3 (make-temp-name "tramp-")))
+ (tmp-name3 (tramp--test-make-temp-name 'local)))
(unwind-protect
(progn
(write-region "foo" nil tmp-name1)
@@ -988,16 +1107,18 @@
(should (file-symlink-p tmp-name2))
(should-not (string-equal tmp-name2 (file-truename tmp-name2)))
(should
- (string-equal (file-truename tmp-name1) (file-truename tmp-name2))))
+ (string-equal (file-truename tmp-name1) (file-truename tmp-name2)))
+ (should (file-equal-p tmp-name1 tmp-name2)))
(ignore-errors
(delete-file tmp-name1)
(delete-file tmp-name2)))
;; `file-truename' shall preserve trailing link of directories.
- (let* ((dir1 (directory-file-name tramp-test-temporary-file-directory))
- (dir2 (file-name-as-directory dir1)))
- (should (string-equal (file-truename dir1) (expand-file-name dir1)))
- (should (string-equal (file-truename dir2) (expand-file-name dir2))))))
+ (unless (file-symlink-p tramp-test-temporary-file-directory)
+ (let* ((dir1 (directory-file-name tramp-test-temporary-file-directory))
+ (dir2 (file-name-as-directory dir1)))
+ (should (string-equal (file-truename dir1) (expand-file-name dir1)))
+ (should (string-equal (file-truename dir2) (expand-file-name dir2)))))))
(ert-deftest tramp-test22-file-times ()
"Check `set-file-times' and `file-newer-than-file-p'."
@@ -1295,35 +1416,61 @@
(ignore-errors (delete-directory tmp-name1 'recursive)))))
-(ert-deftest tramp-test30-utf8 ()
- "Check UTF8 encoding in file names and file contents."
- (skip-unless (tramp--test-enabled))
-
- (let ((tmp-name (tramp--test-make-temp-name))
- (coding-system-for-read 'utf-8)
- (coding-system-for-write 'utf-8)
- (arabic "أصبح بوسعك الآن تنزيل نسخة كاملة من موسوعة ويكيبيديا العربية
لتصفحها بلا اتصال بالإنترنت")
- (chinese "银河系漫游指南系列")
- (russian "Автостопом по гала́ктике"))
+(defun tramp--test-check-files (&rest files)
+ "Runs a simple but comprehensive test over every file in FILES."
+ (let ((tmp-name (tramp--test-make-temp-name)))
(unwind-protect
(progn
(make-directory tmp-name)
- (dolist (lang `(,arabic ,chinese ,russian))
- (let ((file (expand-file-name lang tmp-name)))
- (write-region lang nil file)
+ (dolist (elt files)
+ (let ((file (expand-file-name elt tmp-name)))
+ (write-region elt nil file)
(should (file-exists-p file))
;; Check file contents.
(with-temp-buffer
(insert-file-contents file)
- (should (string-equal (buffer-string) lang)))))
+ (should (string-equal (buffer-string) elt)))))
;; Check file names.
(should (equal (directory-files
tmp-name nil directory-files-no-dot-files-regexp)
- (sort `(,arabic ,chinese ,russian) 'string-lessp))))
+ (sort files 'string-lessp))))
(ignore-errors (delete-directory tmp-name 'recursive)))))
+;; This test is inspired by Bug#17238.
+(ert-deftest tramp-test30-special-characters ()
+ "Check special characters in file names."
+ (skip-unless (tramp--test-enabled))
+
+ ;; Newlines and slashes in file names are not supported. So we don't test.
+ (tramp--test-check-files
+ " foo bar\tbaz "
+ "$foo$bar$$baz$"
+ "-foo-bar-baz-"
+ "%foo%bar%baz%"
+ "&foo&bar&baz&"
+ "?foo?bar?baz?"
+ "*foo*bar*baz*"
+ "'foo\"bar'baz\""
+ "\\foo\\bar\\baz\\"
+ "#foo#bar#baz#"
+ "!foo|bar!baz|"
+ ":foo;bar:baz;"
+ "<foo>bar<baz>"
+ "(foo)bar(baz)"))
+
+(ert-deftest tramp-test31-utf8 ()
+ "Check UTF8 encoding in file names and file contents."
+ (skip-unless (tramp--test-enabled))
+
+ (let ((coding-system-for-read 'utf-8)
+ (coding-system-for-write 'utf-8))
+ (tramp--test-check-files
+ "أصبح بوسعك الآن تنزيل نسخة كاملة من موسوعة ويكيبيديا العربية لتصفحها
بلا اتصال بالإنترنت"
+ "银河系漫游指南系列"
+ "Автостопом по гала́ктике")))
+
;; This test is inspired by Bug#16928.
-(ert-deftest tramp-test31-asynchronous-requests ()
+(ert-deftest tramp-test32-asynchronous-requests ()
"Check parallel asynchronous requests.
Such requests could arrive from timers, process filters and
process sentinels. They shall not disturb each other."
@@ -1412,6 +1559,62 @@
(dolist (buf buffers)
(ignore-errors (kill-buffer buf)))))))
+(ert-deftest tramp-test33-recursive-load ()
+ "Check that Tramp does not fail due to recursive load."
+ (skip-unless (tramp--test-enabled))
+
+ (dolist (code
+ (list
+ (format
+ "(expand-file-name %S))"
+ tramp-test-temporary-file-directory)
+ (format
+ "(let ((default-directory %S)) (expand-file-name %S))"
+ tramp-test-temporary-file-directory
+ temporary-file-directory)))
+ (should-not
+ (string-match
+ "Recursive load"
+ (shell-command-to-string
+ (format
+ "%s -batch -Q -L %s --eval %s"
+ (expand-file-name invocation-name invocation-directory)
+ (mapconcat 'shell-quote-argument load-path " -L ")
+ (shell-quote-argument code)))))))
+
+(ert-deftest tramp-test34-unload ()
+ "Check that Tramp and its subpackages unload completely.
+Since it unloads Tramp, it shall be the last test to run."
+ ;; Mark as failed until all symbols are unbound.
+ :expected-result (if (featurep 'tramp) :failed :passed)
+ (when (featurep 'tramp)
+ (unload-feature 'tramp 'force)
+ ;; No Tramp feature must be left.
+ (should-not (featurep 'tramp))
+ (should-not (all-completions "tramp" (delq 'tramp-tests features)))
+ ;; `file-name-handler-alist' must be clean.
+ (should-not (all-completions "tramp" (mapcar 'cdr
file-name-handler-alist)))
+ ;; There shouldn't be left a bound symbol. We do not regard our
+ ;; test symbols, and the Tramp unload hooks.
+ (mapatoms
+ (lambda (x)
+ (and (or (boundp x) (functionp x))
+ (string-match "^tramp" (symbol-name x))
+ (not (string-match "^tramp--?test" (symbol-name x)))
+ (not (string-match "unload-hook$" (symbol-name x)))
+ (ert-fail (format "`%s' still bound" x)))))
+; (progn (message "`%s' still bound" x)))))
+ ;; There shouldn't be left a hook function containing a Tramp
+ ;; function. We do not regard the Tramp unload hooks.
+ (mapatoms
+ (lambda (x)
+ (and (boundp x)
+ (string-match "-hooks?$" (symbol-name x))
+ (not (string-match "unload-hook$" (symbol-name x)))
+ (consp (symbol-value x))
+ (ignore-errors (all-completions "tramp" (symbol-value x)))
+ (ert-fail (format "Hook `%s' still contains Tramp function" x)))))))
+
;; TODO:
;; * dired-compress-file
@@ -1426,8 +1629,11 @@
;; * Fix `tramp-test27-start-file-process' on MS Windows (`process-send-eof'?).
;; * Fix `tramp-test28-shell-command' on MS Windows (nasty plink message).
-;; * Fix `tramp-test30-utf8' on MS Windows. Seems to be in `directory-files'.
-;; * Fix Bug#16928. Set expected error of
`tramp-test31-asynchronous-requests'.
+;; * Fix `tramp-test31-utf8' for MS Windows and `nc'/`telnet' (when
+;; target is a dumb busybox). Seems to be in `directory-files'.
+;; * Fix Bug#16928. Set expected error of
`tramp-test32-asynchronous-requests'.
+;; * Fix `tramp-test34-unload' (Not all symbols are unbound). Set
+;; expected error.
(defun tramp-test-all (&optional interactive)
"Run all tests for \\[tramp]."
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r116991: Merge from emacs-24; up to r116982,
Juanma Barranquero <=