emacs-diffs
[Top][All Lists]
Advanced

[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]."


reply via email to

[Prev in Thread] Current Thread [Next in Thread]