------------------------------------------------------------ revno: 116991 [merge] committer: Juanma Barranquero branch nick: trunk timestamp: Sat 2014-04-19 01:36:51 +0200 message: Merge from emacs-24; up to r116982 diff: === modified file 'admin/ChangeLog' --- admin/ChangeLog 2014-04-11 06:51:49 +0000 +++ admin/ChangeLog 2014-04-18 23:36:51 +0000 @@ -1,3 +1,9 @@ +2014-04-18 Paul Eggert + + * 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 * grammars/Makefile.in (EMACSDATA, EMACSDOC, EMACSPATH): Unexport. === modified file 'admin/notes/bzr' --- admin/notes/bzr 2014-01-10 10:43:18 +0000 +++ 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' --- lisp/ChangeLog 2014-04-17 07:54:23 +0000 +++ lisp/ChangeLog 2014-04-18 23:36:51 +0000 @@ -1,3 +1,20 @@ +2014-04-18 Michael Albinus + + * 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 Add support for bracketed paste mode; add infrastructure for === modified file 'lisp/net/tramp-adb.el' --- lisp/net/tramp-adb.el 2014-02-28 08:41:24 +0000 +++ 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' --- lisp/net/tramp-compat.el 2014-01-01 07:43:34 +0000 +++ 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' --- lisp/net/tramp.el 2014-04-10 07:17:40 +0000 +++ 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' --- src/ChangeLog 2014-04-17 14:59:22 +0000 +++ src/ChangeLog 2014-04-18 23:36:51 +0000 @@ -1,3 +1,22 @@ +2014-04-18 Paul Eggert + + * emacs.c (close_output_streams): Don't clear and restore errno. + +2014-04-18 Jan Djärv + + * 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 + + * 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 * term.c (tty_send_additional_strings): No need to fflush here, @@ -23,6 +42,7 @@ 2014-04-16 Eli Zaretskii + 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' --- src/emacs.c 2014-04-16 19:43:46 +0000 +++ 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' --- src/insdel.c 2014-04-16 19:43:46 +0000 +++ 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' --- src/xdisp.c 2014-04-12 19:24:17 +0000 +++ 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' --- src/xterm.c 2014-04-05 19:30:36 +0000 +++ 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' --- test/ChangeLog 2014-04-11 06:51:49 +0000 +++ test/ChangeLog 2014-04-18 23:36:51 +0000 @@ -1,3 +1,18 @@ +2014-04-18 Michael Albinus + + * 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 * automated/Makefile.in (EMACSDATA, EMACSDOC, EMACSPATH): Unexport. === modified file 'test/automated/tramp-tests.el' --- test/automated/tramp-tests.el 2014-03-07 14:11:37 +0000 +++ 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;" + "bar" + "(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]." ------------------------------------------------------------ revno: 116990 committer: Paul Eggert branch nick: trunk timestamp: Thu 2014-04-17 07:59:22 -0700 message: * term.c (tty_send_additional_strings): No need to fflush here, as callers fflush. (tty_set_terminal_modes): fflush after sending additional strings, not before. diff: === modified file 'src/ChangeLog' --- src/ChangeLog 2014-04-17 07:54:23 +0000 +++ src/ChangeLog 2014-04-17 14:59:22 +0000 @@ -1,3 +1,10 @@ +2014-04-17 Paul Eggert + + * term.c (tty_send_additional_strings): No need to fflush here, + as callers fflush. + (tty_set_terminal_modes): fflush after sending additional strings, + not before. + 2014-04-17 Daniel Colascione * term.c (Qtty_mode_set_strings, Qtty_mode_reset_strings): New === modified file 'src/term.c' --- src/term.c 2014-04-17 07:54:23 +0000 +++ src/term.c 2014-04-17 14:59:22 +0000 @@ -165,7 +165,7 @@ /* Set up termcap modes for Emacs. */ static void -tty_send_additional_strings (struct terminal* terminal, Lisp_Object sym) +tty_send_additional_strings (struct terminal *terminal, Lisp_Object sym) { Lisp_Object lisp_terminal; Lisp_Object extra_codes; @@ -180,7 +180,6 @@ if (STRINGP (string)) { fwrite (SDATA (string), 1, SBYTES (string), tty->output); - fflush (tty->output); if (tty->termscript) fwrite (SDATA (string), 1, SBYTES (string), tty->termscript); } @@ -209,8 +208,8 @@ OUTPUT_IF (tty, visible_cursor ? tty->TS_cursor_visible : tty->TS_cursor_normal); OUTPUT_IF (tty, tty->TS_keypad_mode); losecursor (tty); - fflush (tty->output); tty_send_additional_strings (terminal, Qtty_mode_set_strings); + fflush (tty->output); } } ------------------------------------------------------------ Use --include-merged or -n0 to see merged revisions.