emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116881: Merge from emacs-24; up to r116865


From: Juanma Barranquero
Subject: [Emacs-diffs] trunk r116881: Merge from emacs-24; up to r116865
Date: Wed, 26 Mar 2014 15:57:40 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116881 [merge]
revision-id: address@hidden
parent: address@hidden
parent: address@hidden
committer: Juanma Barranquero <address@hidden>
branch nick: trunk
timestamp: Wed 2014-03-26 16:57:13 +0100
message:
  Merge from emacs-24; up to r116865
modified:
  ChangeLog                      changelog-20091113204419-o5vbwnq5f7feedwu-1538
  doc/lispref/ChangeLog          changelog-20091113204419-o5vbwnq5f7feedwu-6155
  doc/lispref/files.texi         files.texi-20091113204419-o5vbwnq5f7feedwu-6179
  doc/lispref/markers.texi       
markers.texi-20091113204419-o5vbwnq5f7feedwu-6198
  doc/lispref/text.texi          text.texi-20091113204419-o5vbwnq5f7feedwu-6215
  doc/misc/ChangeLog             changelog-20091113204419-o5vbwnq5f7feedwu-6331
  doc/misc/texinfo.tex           
texinfo.tex-20091113204419-o5vbwnq5f7feedwu-6323
  doc/misc/tramp.texi            tramp.texi-20091113204419-o5vbwnq5f7feedwu-6324
  lib/strftime.c                 strftime.c-20091113204419-o5vbwnq5f7feedwu-1170
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/align.el                  align.el-20091113204419-o5vbwnq5f7feedwu-1758
  lisp/emacs-lisp/package.el     package.el-20100617020707-ybavz666awsxwin6-2
  lisp/frame.el                  frame.el-20091113204419-o5vbwnq5f7feedwu-275
  lisp/frameset.el               frameset.el-20130802043218-tfwraxv1c2zlibpw-1
  lisp/net/tramp-sh.el           trampsh.el-20100913133439-a1faifh29eqoi4nh-1
  lisp/net/tramp.el              tramp.el-20091113204419-o5vbwnq5f7feedwu-2427
  lisp/progmodes/ruby-mode.el    
rubymode.el-20091113204419-o5vbwnq5f7feedwu-8804
  lisp/simple.el                 simple.el-20091113204419-o5vbwnq5f7feedwu-403
  lisp/url/ChangeLog             changelog-20091113204419-o5vbwnq5f7feedwu-3116
  lisp/url/url-handlers.el       
urlhandlers.el-20091113204419-o5vbwnq5f7feedwu-2987
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/buffer.c                   buffer.c-20091113204419-o5vbwnq5f7feedwu-264
  src/editfns.c                  editfns.c-20091113204419-o5vbwnq5f7feedwu-255
  src/fileio.c                   fileio.c-20091113204419-o5vbwnq5f7feedwu-210
  src/insdel.c                   insdel.c-20091113204419-o5vbwnq5f7feedwu-175
  src/lisp.h                     lisp.h-20091113204419-o5vbwnq5f7feedwu-253
  src/undo.c                     undo.c-20091113204419-o5vbwnq5f7feedwu-206
  src/w32term.c                  w32term.c-20091113204419-o5vbwnq5f7feedwu-950
  src/xdisp.c                    xdisp.c-20091113204419-o5vbwnq5f7feedwu-240
  test/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-8588
  test/automated/undo-tests.el   undotests.el-20130108184711-brlnvjau5r1ardib-1
=== modified file 'ChangeLog'
--- a/ChangeLog 2014-03-26 01:14:44 +0000
+++ b/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,9 @@
+2014-03-26  Paul Eggert  <address@hidden>
+
+       Merge from gnulib, incorporating:
+       2014-03-26 strftime: wrap macros in "do {...} while(0)"
+       * lib/strftime.c: Update from gnulib.
+
 2014-03-26  Glenn Morris  <address@hidden>
 
        * configure.ac (CLASH_DETECTION): Remove option.  Every platform

=== modified file 'doc/lispref/ChangeLog'
--- a/doc/lispref/ChangeLog     2014-03-26 01:24:01 +0000
+++ b/doc/lispref/ChangeLog     2014-03-26 15:57:13 +0000
@@ -1,3 +1,16 @@
+2014-03-26  Eli Zaretskii  <address@hidden>
+
+       * files.texi (Kinds of Files): Improve documentation of
+       file-symlink-p.  (Bug#17073)  Add cross-references.
+
+2014-03-26  Barry O'Reilly  <address@hidden>
+
+       * markers.texi (Moving Marker Positions): The 2014-03-02 doc
+       change mentioning undo's inability to handle relocated markers no
+       longer applies.  See bug#16818.
+       * text.texi (Undo): Expand documentation of (TEXT . POS) and
+       (MARKER . ADJUSTMENT) undo elements.
+
 2014-03-26  Glenn Morris  <address@hidden>
 
        * files.texi (File Locks): All systems support locking.

=== modified file 'doc/lispref/files.texi'
--- a/doc/lispref/files.texi    2014-03-26 01:24:01 +0000
+++ b/doc/lispref/files.texi    2014-03-26 15:57:13 +0000
@@ -950,22 +950,26 @@
 @defun file-symlink-p filename
 @cindex file symbolic links
 If the file @var{filename} is a symbolic link, the
address@hidden function returns the (non-recursive) link target
-as a string.  (Determining the file name that the link points to from
-the target is nontrivial.)  First, this function recursively follows
-symbolic links at all levels of parent directories.
address@hidden function returns its (non-recursive) link target
+as a string.  (The link target string is not necessarily the full
+absolute file name of the target; determining the full file name that
+the link points to is nontrivial, see below.)  If the leading
+directories of @var{filename} include symbolic links, this function
+recursively follows them.
 
-If the file @var{filename} is not a symbolic link (or there is no such file),
+If the file @var{filename} is not a symbolic link, or does not exist,
 @code{file-symlink-p} returns @code{nil}.
 
+Here are a few examples of using this function:
+
 @example
 @group
-(file-symlink-p "foo")
+(file-symlink-p "not-a-symlink")
      @result{} nil
 @end group
 @group
 (file-symlink-p "sym-link")
-     @result{} "foo"
+     @result{} "not-a-symlink"
 @end group
 @group
 (file-symlink-p "sym-link2")
@@ -976,6 +980,40 @@
      @result{} "/pub/bin"
 @end group
 @end example
+
+Note that in the third example, the function returned @file{sym-link},
+but did not proceed to resolve it, although that file is itself a
+symbolic link.  This is what we meant by ``non-recursive'' above---the
+process of following the symbolic links does not recurse if the link
+target is itself a link.
+
+The string that this function returns is what is recorded in the
+symbolic link; it may or may not include any leading directories.
+This function does @emph{not} expand the link target to produce a
+fully-qualified file name, and in particular does not use the leading
+directories, if any, of the @var{filename} argument if the link target
+is not an absolute file name.  Here's an example:
+
address@hidden
address@hidden
+(file-symlink-p "/foo/bar/baz")
+     @result{} "some-file"
address@hidden group
address@hidden example
+
address@hidden
+Here, although @file{/foo/bar/baz} was given as a fully-qualified file
+name, the result is not, and in fact does not have any leading
+directories at all.  And since @file{some-file} might itself be a
+symbolic link, you cannot simply prepend leading directories to it,
+nor even naively use @code{expand-file-name} (@pxref{File Name
+Expansion}) to produce its absolute file name.
+
+For this reason, this function is seldom useful if you need to
+determine more than just the fact that a file is or isn't a symbolic
+link.  If you actually need the file name of the link target, use
address@hidden or @code{file-truename}, described in
address@hidden
 @end defun
 
 The next two functions recursively follow symbolic links at

=== modified file 'doc/lispref/markers.texi'
--- a/doc/lispref/markers.texi  2014-03-02 17:49:02 +0000
+++ b/doc/lispref/markers.texi  2014-03-25 02:47:39 +0000
@@ -344,12 +344,10 @@
 @section Moving Marker Positions
 
   This section describes how to change the position of an existing
-marker.  When you do this, be sure you know how the marker is used
-outside of your program.  For example, moving a marker to an unrelated
-new position can cause undo to later adjust the marker incorrectly.
-Often when you wish to relocate a marker to an unrelated position, it
-is preferable to make a new marker and set the prior one to point
-nowhere.
+marker.  When you do this, be sure you know whether the marker is used
+outside of your program, and, if so, what effects will result from
+moving it---otherwise, confusing things may happen in other parts of
+Emacs.
 
 @defun set-marker marker position &optional buffer
 This function moves @var{marker} to @var{position}

=== modified file 'doc/lispref/text.texi'
--- a/doc/lispref/text.texi     2014-03-18 21:14:36 +0000
+++ b/doc/lispref/text.texi     2014-03-25 02:47:39 +0000
@@ -1270,7 +1270,8 @@
 The deleted text itself is the string @var{text}.  The place to
 reinsert it is @code{(abs @var{position})}.  If @var{position} is
 positive, point was at the beginning of the deleted text, otherwise it
-was at the end.
+was at the end.  Zero or more (@var{marker} . @var{adjustment})
+elements follow immediately after this element.
 
 @item (t . @var{time-flag})
 This kind of element indicates that an unmodified buffer became
@@ -1296,8 +1297,10 @@
 @item (@var{marker} . @var{adjustment})
 This kind of element records the fact that the marker @var{marker} was
 relocated due to deletion of surrounding text, and that it moved
address@hidden character positions.  Undoing this element moves
address@hidden @minus{} @var{adjustment} characters.
address@hidden character positions.  If the marker's location is
+consistent with the (@var{text} . @var{position}) element preceding it
+in the undo list, then undoing this element moves @var{marker}
address@hidden @var{adjustment} characters.
 
 @item (apply @var{funname} . @var{args})
 This is an extensible undo item, which is undone by calling

=== modified file 'doc/misc/ChangeLog'
--- a/doc/misc/ChangeLog        2014-03-23 23:16:06 +0000
+++ b/doc/misc/ChangeLog        2014-03-26 15:57:13 +0000
@@ -1,3 +1,11 @@
+2014-03-26  Paul Eggert  <address@hidden>
+
+       * texinfo.tex: Update from gnulib.
+
+2014-03-26  Michael Albinus  <address@hidden>
+
+       * tramp.texi (Frequently Asked Questions): Add fish shell settings.
+
 2014-03-23  Katsumi Yamaoka  <address@hidden>
 
        * gnus.texi (Ma Gnus): Mention header attachment buttons.

=== modified file 'doc/misc/texinfo.tex'
--- a/doc/misc/texinfo.tex      2014-02-24 07:12:42 +0000
+++ b/doc/misc/texinfo.tex      2014-03-26 04:16:13 +0000
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2014-02-16.16}
+\def\texinfoversion{2014-03-17.07}
 %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -3935,19 +3935,23 @@
 }
 
 % multitable-only commands.
-%
-% @headitem starts a heading row, which we typeset in bold.
-% Assignments have to be global since we are inside the implicit group
-% of an alignment entry.  \everycr resets \everytab so we don't have to
+% 
+% @headitem starts a heading row, which we typeset in bold.  Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry.  \everycr below resets \everytab so we don't have to
 % undo it ourselves.
 \def\headitemfont{\b}% for people to use in the template row; not changeable
 \def\headitem{%
   \checkenv\multitable
   \crcr
+  \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
   \global\everytab={\bf}% can't use \headitemfont since the parsing differs
   \the\everytab % for the first item
 }%
 %
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
 % A \tab used to include \hskip1sp.  But then the space in a template
 % line is not enough.  That is bad.  So let's go back to just `&' until
 % we again encounter the problem the 1sp was intended to solve.
@@ -3978,15 +3982,15 @@
   %
   \everycr = {%
     \noalign{%
-      \global\everytab={}%
+      \global\everytab={}% Reset from possible headitem.
       \global\colcount=0 % Reset the column counter.
-      % Check for saved footnotes, etc.
+      %
+      % Check for saved footnotes, etc.:
       \checkinserts
-      % Keeps underfull box messages off when table breaks over pages.
-      %\filbreak
-       % Maybe so, but it also creates really weird page breaks when the
-       % table breaks over pages. Wouldn't \vfil be better?  Wait until the
-       % problem manifests itself, so it can be fixed for real --karl.
+      %
+      % Perhaps a \nobreak, then reset:
+      \headitemcrhook
+      \global\let\headitemcrhook=\relax
     }%
   }%
   %

=== modified file 'doc/misc/tramp.texi'
--- a/doc/misc/tramp.texi       2014-02-21 08:04:15 +0000
+++ b/doc/misc/tramp.texi       2014-03-24 08:09:42 +0000
@@ -3053,15 +3053,28 @@
 If it fails, or the cursor is not moved at the end of the buffer, your
 prompt is not recognized correctly.
 
-A special problem is the zsh, which uses left-hand side and right-hand
-side prompts in parallel.  Therefore, it is necessary to disable the
-zsh line editor on the remote host.  You shall add to @file{~/.zshrc}
-the following command:
+A special problem is the zsh shell, which uses left-hand side and
+right-hand side prompts in parallel.  Therefore, it is necessary to
+disable the zsh line editor on the remote host.  You shall add to
address@hidden/.zshrc} the following command:
 
 @example
 [ $TERM = "dumb" ] && unsetopt zle && PS1='$ '
 @end example
 
+Similar fancy prompt settings are known from the fish shell.  Here you
+must add in @file{~/.config/fish/config.fish}:
+
address@hidden
+function fish_prompt
+  if test $TERM = "dumb"
+     echo "\$ "
+  else
+     @dots{}
+  end
+end
address@hidden example
+
 Furthermore it has been reported, that @value{tramp} (like sshfs,
 incidentally) doesn't work with WinSSHD due to strange prompt settings.
 

=== modified file 'lib/strftime.c'
--- a/lib/strftime.c    2014-01-01 07:43:34 +0000
+++ b/lib/strftime.c    2014-03-26 04:16:13 +0000
@@ -681,24 +681,44 @@
       switch (format_char)
         {
 #define DO_NUMBER(d, v) \
-          digits = d;                                                         \
-          number_value = v; goto do_number
+          do                                                                  \
+            {                                                                 \
+              digits = d;                                                     \
+              number_value = v;                                               \
+              goto do_number;                                                 \
+            }                                                                 \
+          while (0)
 #define DO_SIGNED_NUMBER(d, negative, v) \
-          digits = d;                                                         \
-          negative_number = negative;                                         \
-          u_number_value = v; goto do_signed_number
+          do                                                                  \
+            {                                                                 \
+              digits = d;                                                     \
+              negative_number = negative;                                     \
+              u_number_value = v;                                             \
+              goto do_signed_number;                                          \
+            }                                                                 \
+          while (0)
 
           /* The mask is not what you might think.
              When the ordinal i'th bit is set, insert a colon
              before the i'th digit of the time zone representation.  */
 #define DO_TZ_OFFSET(d, negative, mask, v) \
-          digits = d;                                                         \
-          negative_number = negative;                                         \
-          tz_colon_mask = mask;                                               \
-          u_number_value = v; goto do_tz_offset
+          do                                                                  \
+            {                                                                 \
+              digits = d;                                                     \
+              negative_number = negative;                                     \
+              tz_colon_mask = mask;                                           \
+              u_number_value = v;                                             \
+              goto do_tz_offset;                                              \
+            }                                                                 \
+          while (0)
 #define DO_NUMBER_SPACEPAD(d, v) \
-          digits = d;                                                         \
-          number_value = v; goto do_number_spacepad
+          do                                                                  \
+            {                                                                 \
+              digits = d;                                                     \
+              number_value = v;                                               \
+              goto do_number_spacepad;                                        \
+            }                                                                 \
+          while (0)
 
         case L_('%'):
           if (modifier != 0)
@@ -1265,9 +1285,9 @@
             }
           if (modifier == L_('O'))
             goto bad_format;
-          else
-            DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
-                              tp->tm_year + (unsigned int) TM_YEAR_BASE);
+
+          DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
+                            tp->tm_year + (unsigned int) TM_YEAR_BASE);
 
         case L_('y'):
           if (modifier == L_('E'))

=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-03-26 04:02:27 +0000
+++ b/lisp/ChangeLog    2014-03-26 15:57:13 +0000
@@ -1,3 +1,78 @@
+2014-03-26  Juanma Barranquero  <address@hidden>
+
+       * emacs-lisp/package.el: Fix bug#16733 (again).
+       (url-http-parse-response, url-http-end-of-headers, url-recreate-url)
+       (url-http-target-url): Remove unused declarations.
+       (package-handle-response): Remove.
+       (package--with-work-buffer): Use url-insert-file-contents and simplify.
+       (package--download-one-archive): Use current-buffer instead of
+       dynamic binding of `buffer'.
+       (describe-package-1): Do not decode readme-string.
+
+2014-03-26  Michael Albinus  <address@hidden>
+
+       * net/tramp.el (tramp-methods, tramp-connection-timeout): Fix docstring.
+
+       * net/tramp-sh.el (tramp-sh-handle-vc-registered): Revert change
+       from 2014-03-07, it decreases performance unnecessarily.  Let-bind
+       `remote-file-name-inhibit-cache' to nil in the second pass.
+       (tramp-find-executable): Do not call "which" on SunOS.
+       (tramp-send-command-and-check): Fix docstring.
+       (tramp-do-copy-or-rename-file-directly): In the `rename' case,
+       check whether source directory has set the sticky bit.
+
+2014-03-26  Barry O'Reilly  <address@hidden>
+
+       * simple.el (primitive-undo): Only process marker adjustments
+       validated against their corresponding (TEXT . POS).  Issue warning
+       for lone marker adjustments in undo history.  (Bug#16818)
+       (undo-make-selective-list): Add marker adjustments to selective
+       undo list based on whether their corresponding (TEXT . POS) is in
+       the region.  Remove variable adjusted-markers, which was unused
+       and only non nil during undo-make-selective-list.
+       (undo-elt-in-region): Return nil when passed a marker adjustment
+       and explain in function doc.
+
+2014-03-26  Nicolas Richard  <address@hidden>
+
+       * align.el (align-region): Do not fail when end-mark is nil (bug#17088).
+
+2014-03-26  Dmitry Gutov  <address@hidden>
+
+       * progmodes/ruby-mode.el (ruby-expression-expansion-re):
+       Match special global variables without curlies, too.
+       (ruby-font-lock-keywords): Simplify the matcher for special global
+       variables.  Don't require a non-word character after the variable.
+       (Bug#17057)
+
+2014-03-26  Stefan Monnier  <address@hidden>
+
+       * simple.el (redisplay-highlight-region-function): Increase priority of
+       overlay to make sure boundaries are visible (bug#15899).
+
+2014-03-26  Juanma Barranquero  <address@hidden>
+
+       * frameset.el (frameset--initial-params): Fix typo in parameter name.
+       (frameset-restore): Compare display strings with equal.
+
+       * frame.el (make-frame): Don't quote display name in error message,
+       it is already a string.
+
+2014-03-26  Thierry Volpiatto  <address@hidden>
+
+       * net/tramp.el (tramp-read-passwd): Suspend the timers while reading
+       the password.
+
+2014-03-26  Dmitry Gutov  <address@hidden>
+
+       * emacs-lisp/package.el (package--add-to-archive-contents):
+       Include already installed and built-in packages in
+       `package-archive-contents'.
+       (package-install): Don't include already installed packages in the
+       options during interactive invocation.  (Bug#16762)
+       (package-show-package-list): If the buffer is already displayed in
+       another window, switch to that window.
+
 2014-03-26  Reto Zimmermann  <address@hidden>
 
        Sync with upstream vhdl mode v3.35.1.
@@ -1247,7 +1322,7 @@
        dbus-call-method check for completion using a busy-wait loop with
        gradual backoff.
 
-2013-10-02  Michael Albinus  <address@hidden>
+2014-02-16  Michael Albinus  <address@hidden>
 
        Sync with Tramp 2.2.9.
 

=== modified file 'lisp/align.el'
--- a/lisp/align.el     2014-03-21 01:12:57 +0000
+++ b/lisp/align.el     2014-03-24 16:54:24 +0000
@@ -1603,7 +1603,7 @@
            rule-index (1+ rule-index)))
     ;; This function can use a lot of temporary markers, so instead of
     ;; waiting for the next GC we delete them immediately (Bug#10047).
-    (set-marker end-mark nil)
+    (when end-mark (set-marker end-mark nil))
     (dolist (m markers)
       (set-marker m nil))
 

=== modified file 'lisp/emacs-lisp/package.el'
--- a/lisp/emacs-lisp/package.el        2014-03-22 08:43:30 +0000
+++ b/lisp/emacs-lisp/package.el        2014-03-26 15:21:17 +0000
@@ -205,13 +205,9 @@
 
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
-(declare-function url-http-parse-response "url-http" ())
 (declare-function url-http-file-exists-p "url-http" (url))
 (declare-function lm-header "lisp-mnt" (header))
 (declare-function lm-commentary "lisp-mnt" (&optional file))
-(defvar url-http-end-of-headers)
-(declare-function url-recreate-url "url-parse" (urlobj))
-(defvar url-http-target-url)
 
 (defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/";))
   "An alist of archives from which to fetch.
@@ -770,38 +766,14 @@
 and evaluates BODY while that buffer is current.  This work
 buffer is killed afterwards.  Return the last value in BODY."
   (declare (indent 2) (debug t))
-  `(let* ((http (string-match "\\`https?:" ,location))
-         (buffer
-          (if http
-              (url-retrieve-synchronously (concat ,location ,file))
-            (generate-new-buffer "*package work buffer*"))))
-     (prog1
-        (with-current-buffer buffer
-          (if http
-              (progn (package-handle-response)
-                     (re-search-forward "^$" nil 'move)
-                     (forward-char)
-                     (delete-region (point-min) (point)))
-            (unless (file-name-absolute-p ,location)
-              (error "Archive location %s is not an absolute file name"
-                     ,location))
-            (insert-file-contents (expand-file-name ,file ,location)))
-          ,@body)
-       (kill-buffer buffer))))
-
-(defun package-handle-response ()
-  "Handle the response from a `url-retrieve-synchronously' call.
-Parse the HTTP response and throw if an error occurred.
-The url package seems to require extra processing for this.
-This should be called in a `save-excursion', in the download buffer.
-It will move point to somewhere in the headers."
-  ;; We assume HTTP here.
-  (require 'url-http)
-  (let ((response (url-http-parse-response)))
-    (when (or (< response 200) (>= response 300))
-      (error "Error downloading %s:%s"
-            (url-recreate-url url-http-target-url)
-            (buffer-substring-no-properties (point) (line-end-position))))))
+  `(with-temp-buffer
+     (if (string-match-p "\\`https?:" ,location)
+        (url-insert-file-contents (concat ,location ,file))
+       (unless (file-name-absolute-p ,location)
+        (error "Archive location %s is not an absolute file name"
+               ,location))
+       (insert-file-contents (expand-file-name ,file ,location)))
+     ,@body))
 
 (defun package--archive-file-exists-p (location file)
   (let ((http (string-match "\\`https?:" location)))
@@ -1047,14 +1019,9 @@
          (existing-packages (assq name package-archive-contents))
          (pinned-to-archive (assoc name package-pinned-packages)))
     (cond
-     ;; Skip entirely if pinned to another archive or already installed.
-     ((or (and pinned-to-archive
-               (not (equal (cdr pinned-to-archive) archive)))
-          (let ((bi (assq name package--builtin-versions)))
-            (and bi (version-list-= version (cdr bi))))
-          (let ((ins (cdr (assq name package-alist))))
-            (and ins (version-list-= version
-                                     (package-desc-version (car ins))))))
+     ;; Skip entirely if pinned to another archive.
+     ((and pinned-to-archive
+           (not (equal (cdr pinned-to-archive) archive)))
       nil)
      ((not existing-packages)
       (push (list name pkg-desc) package-archive-contents))
@@ -1090,8 +1057,11 @@
        (package-refresh-contents))
      (list (intern (completing-read
                     "Install package: "
-                    (mapcar (lambda (elt) (symbol-name (car elt)))
-                            package-archive-contents)
+                    (delq nil
+                          (mapcar (lambda (elt)
+                                    (unless (package-installed-p (car elt))
+                                      (symbol-name (car elt))))
+                                  package-archive-contents))
                     nil t)))))
   (package-download-transaction
    (if (package-desc-p pkg)
@@ -1272,7 +1242,7 @@
                     (car archive)))))
       ;; Read the retrieved buffer to make sure it is valid (e.g. it
       ;; may fetch a URL redirect page).
-      (when (listp (read buffer))
+      (when (listp (read (current-buffer)))
        (make-directory dir t)
        (setq buffer-file-name (expand-file-name file dir))
        (let ((version-control 'never)
@@ -1531,8 +1501,7 @@
                        (setq readme-string (buffer-string))
                        t))
                 (error nil))
-              (let ((coding (detect-coding-string readme-string t)))
-                (insert (decode-coding-string readme-string coding t))))
+              (insert readme-string))
              ((file-readable-p readme)
               (insert-file-contents readme)
               (goto-char (point-max))))))))
@@ -2117,11 +2086,14 @@
 shown."
   (interactive)
   (require 'finder-inf nil t)
-  (let ((buf (get-buffer-create "*Packages*")))
+  (let* ((buf (get-buffer-create "*Packages*"))
+         (win (get-buffer-window buf)))
     (with-current-buffer buf
       (package-menu-mode)
       (package-menu--generate nil packages keywords))
-    (switch-to-buffer buf)))
+    (if win
+        (select-window win)
+      (switch-to-buffer buf))))
 
 ;; package-menu--generate rebinds "q" on the fly, so we have to
 ;; hard-code the binding in the doc-string here.

=== modified file 'lisp/frame.el'
--- a/lisp/frame.el     2014-03-03 01:00:27 +0000
+++ b/lisp/frame.el     2014-03-23 22:11:59 +0000
@@ -668,7 +668,7 @@
              (cdr (assq 'window-system parameters)))
              (display
               (or (window-system-for-display display)
-                  (error "Don't know how to interpret display \"%S\""
+                  (error "Don't know how to interpret display %S"
                          display)))
             (t window-system)))
         (frame-creation-function (cdr (assq w frame-creation-function-alist)))

=== modified file 'lisp/frameset.el'
--- a/lisp/frameset.el  2014-03-21 00:03:08 +0000
+++ b/lisp/frameset.el  2014-03-26 15:57:13 +0000
@@ -940,7 +940,7 @@
 Setting position and size parameters as soon as possible helps reducing
 flickering; other parameters, like `minibuffer' and `border-width', can
 not be changed once the frame has been created.  Internal use only."
-  (cl-loop for param in '(left top with height border-width minibuffer)
+  (cl-loop for param in '(left top width height border-width minibuffer)
           when (assq param parameters) collect it))
 
 (defun frameset--restore-frame (parameters window-state filters force-onscreen)
@@ -1146,8 +1146,8 @@
                     frame to-tty duplicate)
                ;; Only set target if forcing displays and the target display 
is different.
                (unless (or (frameset-keep-original-display-p force-display)
-                           (eq (frame-parameter nil 'display)
-                               (cdr (assq 'display frame-cfg))))
+                           (equal (frame-parameter nil 'display)
+                                  (cdr (assq 'display frame-cfg))))
                  (setq frameset--target-display (cons 'display
                                                       (frame-parameter nil 
'display))
                        to-tty (null (cdr frameset--target-display))))

=== modified file 'lisp/net/tramp-sh.el'
--- a/lisp/net/tramp-sh.el      2014-03-21 13:02:25 +0000
+++ b/lisp/net/tramp-sh.el      2014-03-25 09:49:37 +0000
@@ -2110,6 +2110,12 @@
           ;; We can do it directly.
           ((let (file-name-handler-alist)
              (and (file-readable-p localname1)
+                  ;; No sticky bit when renaming.
+                  (or (eq op 'copy)
+                      (zerop
+                       (logand
+                        (file-modes (file-name-directory localname1))
+                        (tramp-compat-octal-to-decimal "1000"))))
                   (file-writable-p (file-name-directory localname2))
                   (or (file-directory-p localname2)
                       (file-writable-p localname2))))
@@ -3311,55 +3317,57 @@
       (with-tramp-progress-reporter
          v 3 (format "Checking `vc-registered' for %s" file)
 
-       (unless remote-file-name-inhibit-cache
-         ;; There could be new files, created by the vc backend.  We
-         ;; cannot reuse the old cache entries, therefore.
-         (let (tramp-vc-registered-file-names
-               (remote-file-name-inhibit-cache (current-time))
-               (file-name-handler-alist
-                `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
-
-           ;; Here we collect only file names, which need an operation.
-           (ignore-errors (tramp-run-real-handler 'vc-registered (list file)))
-           (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
-
-           ;; Send just one command, in order to fill the cache.
-           (when tramp-vc-registered-file-names
-             (tramp-maybe-send-script
-              v
-              (format tramp-vc-registered-read-file-names
-                      (tramp-get-file-exists-command v)
-                      (format "%s -r" (tramp-get-test-command v)))
-              "tramp_vc_registered_read_file_names")
-
-             (dolist
-                 (elt
-                  (ignore-errors
-                    ;; We cannot use `tramp-send-command-and-read',
-                    ;; because this does not cooperate well with
-                    ;; heredoc documents.
-                    (tramp-send-command
-                     v
-                     (format
-                      "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
-                      tramp-end-of-heredoc
-                      (mapconcat 'tramp-shell-quote-argument
-                                 tramp-vc-registered-file-names
-                                 "\n")
-                      tramp-end-of-heredoc))
-                    (with-current-buffer (tramp-get-connection-buffer v)
-                      ;; Read the expression.
-                      (goto-char (point-min))
-                      (read (current-buffer)))))
-
-               (tramp-set-file-property
-                v (car elt) (cadr elt) (cadr (cdr elt)))))))
+       ;; There could be new files, created by the vc backend.  We
+       ;; cannot reuse the old cache entries, therefore.  In
+       ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
+       ;; could also be a timestamp as `current-time' returns.  This
+       ;; means invalidate all cache entries with an older timestamp.
+       (let (tramp-vc-registered-file-names
+             (remote-file-name-inhibit-cache (current-time))
+             (file-name-handler-alist
+              `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
+
+         ;; Here we collect only file names, which need an operation.
+         (ignore-errors (tramp-run-real-handler 'vc-registered (list file)))
+         (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
+
+         ;; Send just one command, in order to fill the cache.
+         (when tramp-vc-registered-file-names
+           (tramp-maybe-send-script
+            v
+            (format tramp-vc-registered-read-file-names
+                    (tramp-get-file-exists-command v)
+                    (format "%s -r" (tramp-get-test-command v)))
+            "tramp_vc_registered_read_file_names")
+
+           (dolist
+               (elt
+                (ignore-errors
+                  ;; We cannot use `tramp-send-command-and-read',
+                  ;; because this does not cooperate well with
+                  ;; heredoc documents.
+                  (tramp-send-command
+                   v
+                   (format
+                    "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
+                    tramp-end-of-heredoc
+                    (mapconcat 'tramp-shell-quote-argument
+                               tramp-vc-registered-file-names
+                               "\n")
+                    tramp-end-of-heredoc))
+                  (with-current-buffer (tramp-get-connection-buffer v)
+                    ;; Read the expression.
+                    (goto-char (point-min))
+                    (read (current-buffer)))))
+
+             (tramp-set-file-property
+              v (car elt) (cadr elt) (cadr (cdr elt))))))
 
        ;; Second run.  Now all `file-exists-p' or `file-readable-p'
        ;; calls shall be answered from the file cache.  We unset
-       ;; `process-file-side-effects' in order to keep the cache when
-       ;; `process-file' calls appear.
-       (let (process-file-side-effects)
+       ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
+       ;; in order to keep the cache.
+       (let (remote-file-name-inhibit-cache process-file-side-effects)
          (ignore-errors
            (tramp-run-real-handler 'vc-registered (list file))))))))
 
@@ -3604,8 +3612,13 @@
     (let (result)
       ;; Check whether the executable is in $PATH. "which(1)" does not
       ;; report always a correct error code; therefore we check the
-      ;; number of words it returns.
-      (unless ignore-path
+      ;; number of words it returns.  "SunOS 5.10" (and maybe "SunOS
+      ;; 5.11") have problems with this command, we disable the call
+      ;; therefore.
+      (unless (or ignore-path
+                 (string-match
+                  (regexp-opt '("SunOS 5.10" "SunOS 5.11"))
+                  (tramp-get-connection-property vec "uname" "")))
        (tramp-send-command vec (format "which \\%s | wc -w" progname))
        (goto-char (point-min))
        (if (looking-at "^\\s-*1$")
@@ -4677,8 +4690,9 @@
 (defun tramp-send-command-and-check
   (vec command &optional subshell dont-suppress-err)
   "Run COMMAND and check its exit status.
-Sends `echo $?' along with the COMMAND for checking the exit status.  If
-COMMAND is nil, just sends `echo $?'.  Returns the exit status found.
+Sends `echo $?' along with the COMMAND for checking the exit status.
+If COMMAND is nil, just sends `echo $?'.  Returns `t' if the exit
+status is 0, and `nil' otherwise.
 
 If the optional argument SUBSHELL is non-nil, the command is
 executed in a subshell, ie surrounded by parentheses.  If

=== modified file 'lisp/net/tramp.el'
--- a/lisp/net/tramp.el 2014-03-21 13:02:25 +0000
+++ b/lisp/net/tramp.el 2014-03-25 08:16:49 +0000
@@ -241,7 +241,7 @@
   * `tramp-copy-program'
     This specifies the name of the program to use for remotely copying
     the file; this might be the absolute filename of rcp or the name of
-    a workalike program.
+    a workalike program.  It is always applied on the local host.
   * `tramp-copy-args'
     This specifies the list of parameters to pass to the above mentioned
     program, the hints for `tramp-login-args' also apply here.
@@ -1044,7 +1044,9 @@
 
 (defcustom tramp-connection-timeout 60
   "Defines the max time to wait for establishing a connection (in seconds).
-This can be overwritten for different connection types in `tramp-methods'."
+This can be overwritten for different connection types in `tramp-methods'.
+
+The timeout does not include the time reading a password."
   :group 'tramp
   :version "24.4"
   :type 'integer)
@@ -4119,40 +4121,48 @@
              (with-current-buffer (process-buffer proc)
                (tramp-check-for-regexp proc tramp-password-prompt-regexp)
                (format "%s for %s " (capitalize (match-string 1)) key))))
-         auth-info auth-passwd)
-    (with-parsed-tramp-file-name key nil
-      (prog1
-         (or
-          ;; See if auth-sources contains something useful, if it's
-          ;; bound.  `auth-source-user-or-password' is an obsoleted
-          ;; function, it has been replaced by `auth-source-search'.
-          (and (boundp 'auth-sources)
-               (tramp-get-connection-property v "first-password-request" nil)
-               ;; Try with Tramp's current method.
-                (if (fboundp 'auth-source-search)
-                   (setq auth-info
-                         (tramp-compat-funcall
-                          'auth-source-search
-                          :max 1
-                          :user (or tramp-current-user t)
-                          :host tramp-current-host
-                          :port tramp-current-method)
-                         auth-passwd (plist-get (nth 0 auth-info) :secret)
-                         auth-passwd (if (functionp auth-passwd)
-                                         (funcall auth-passwd)
-                                       auth-passwd))
-                  (tramp-compat-funcall
-                   'auth-source-user-or-password
-                   "password" tramp-current-host tramp-current-method)))
-          ;; Try the password cache.
-          (when (functionp 'password-read)
-            (let ((password
-                   (tramp-compat-funcall 'password-read pw-prompt key)))
-              (tramp-compat-funcall 'password-cache-add key password)
-              password))
-          ;; Else, get the password interactively.
-          (read-passwd pw-prompt))
-       (tramp-set-connection-property v "first-password-request" nil)))))
+        ;; We suspend the timers while reading the password.
+         (stimers (with-timeout-suspend))
+        auth-info auth-passwd)
+
+    (unwind-protect
+       (with-parsed-tramp-file-name key nil
+         (prog1
+             (or
+              ;; See if auth-sources contains something useful, if
+              ;; it's bound.  `auth-source-user-or-password' is an
+              ;; obsoleted function, it has been replaced by
+              ;; `auth-source-search'.
+              (and (boundp 'auth-sources)
+                   (tramp-get-connection-property
+                    v "first-password-request" nil)
+                   ;; Try with Tramp's current method.
+                   (if (fboundp 'auth-source-search)
+                       (setq auth-info
+                             (tramp-compat-funcall
+                              'auth-source-search
+                              :max 1
+                              :user (or tramp-current-user t)
+                              :host tramp-current-host
+                              :port tramp-current-method)
+                             auth-passwd (plist-get (nth 0 auth-info) :secret)
+                             auth-passwd (if (functionp auth-passwd)
+                                             (funcall auth-passwd)
+                                           auth-passwd))
+                     (tramp-compat-funcall
+                      'auth-source-user-or-password
+                      "password" tramp-current-host tramp-current-method)))
+              ;; Try the password cache.
+              (when (functionp 'password-read)
+                (let ((password
+                       (tramp-compat-funcall 'password-read pw-prompt key)))
+                  (tramp-compat-funcall 'password-cache-add key password)
+                  password))
+              ;; Else, get the password interactively.
+              (read-passwd pw-prompt))
+           (tramp-set-connection-property v "first-password-request" nil)))
+      ;; Reenable the timers.
+      (with-timeout-unsuspend stimers))))
 
 ;;;###tramp-autoload
 (defun tramp-clear-passwd (vec)

=== modified file 'lisp/progmodes/ruby-mode.el'
--- a/lisp/progmodes/ruby-mode.el       2014-03-21 04:26:39 +0000
+++ b/lisp/progmodes/ruby-mode.el       2014-03-24 08:53:56 +0000
@@ -106,7 +106,7 @@
   "Regexp to match the beginning of a heredoc.")
 
   (defconst ruby-expression-expansion-re
-    
"\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\)\\)"))
+    
"\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\|\\$[^a-zA-Z
 \n]\\)\\)"))
 
 (defun ruby-here-doc-end-match ()
   "Return a regexp to find the end of a heredoc.
@@ -2113,8 +2113,8 @@
     
("\\(^\\|[^:]\\)\\(:\\(address@hidden|[/%&|^`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|![~=]?\\|\\[\\]=?\\|@?\\(\\w\\|_\\)+\\([!?=]\\|\\b_*\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)"
      2 font-lock-constant-face)
     ;; Variables.
-    ("\\(\\$\\([^a-zA-Z0-9 \n]\\|[0-9]\\)\\)\\W"
-     1 font-lock-variable-name-face)
+    ("\\$[^a-zA-Z \n]"
+     0 font-lock-variable-name-face)
     ("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+"
      0 font-lock-variable-name-face)
     ;; Constants.

=== modified file 'lisp/simple.el'
--- a/lisp/simple.el    2014-03-22 22:36:29 +0000
+++ b/lisp/simple.el    2014-03-26 15:57:13 +0000
@@ -2283,20 +2283,38 @@
            (when (let ((apos (abs pos)))
                    (or (< apos (point-min)) (> apos (point-max))))
              (error "Changes to be undone are outside visible portion of 
buffer"))
-           (if (< pos 0)
-               (progn
-                 (goto-char (- pos))
-                 (insert string))
-             (goto-char pos)
-             ;; Now that we record marker adjustments
-             ;; (caused by deletion) for undo,
-             ;; we should always insert after markers,
-             ;; so that undoing the marker adjustments
-             ;; put the markers back in the right place.
-             (insert string)
-             (goto-char pos)))
+           (let (valid-marker-adjustments)
+             ;; Check that marker adjustments which were recorded
+             ;; with the (STRING . POS) record are still valid, ie
+             ;; the markers haven't moved.  We check their validity
+             ;; before reinserting the string so as we don't need to
+             ;; mind marker insertion-type.
+             (while (and (markerp (car-safe (car list)))
+                         (integerp (cdr-safe (car list))))
+               (let* ((marker-adj (pop list))
+                      (m (car marker-adj)))
+                 (and (eq (marker-buffer m) (current-buffer))
+                      (= pos m)
+                      (push marker-adj valid-marker-adjustments))))
+             ;; Insert string and adjust point
+             (if (< pos 0)
+                 (progn
+                   (goto-char (- pos))
+                   (insert string))
+               (goto-char pos)
+               (insert string)
+               (goto-char pos))
+             ;; Adjust the valid marker adjustments
+             (dolist (adj valid-marker-adjustments)
+               (set-marker (car adj)
+                           (- (car adj) (cdr adj))))))
           ;; (MARKER . OFFSET) means a marker MARKER was adjusted by OFFSET.
           (`(,(and marker (pred markerp)) . ,(and offset (pred integerp)))
+           (warn "Encountered %S entry in undo list with no matching (TEXT . 
POS) entry"
+                 next)
+           ;; Even though these elements are not expected in the undo
+           ;; list, adjust them to be conservative for the 24.4
+           ;; release.  (Bug#16818)
            (when (marker-buffer marker)
              (set-marker marker
                          (- marker offset)
@@ -2335,8 +2353,6 @@
            (undo-make-selective-list (min beg end) (max beg end))
          buffer-undo-list)))
 
-(defvar undo-adjusted-markers)
-
 (defun undo-make-selective-list (start end)
   "Return a list of undo elements for the region START to END.
 The elements come from `buffer-undo-list', but we keep only
@@ -2345,7 +2361,6 @@
 we stop and ignore all further elements."
   (let ((undo-list-copy (undo-copy-list buffer-undo-list))
        (undo-list (list nil))
-       undo-adjusted-markers
        some-rejected
        undo-elt temp-undo-list delta)
     (while undo-list-copy
@@ -2355,15 +2370,30 @@
                    ;; This is a "was unmodified" element.
                    ;; Keep it if we have kept everything thus far.
                    (not some-rejected))
+                   ;; Skip over marker adjustments, instead relying on
+                   ;; finding them after (TEXT . POS) elements
+                   ((markerp (car-safe undo-elt))
+                    nil)
                   (t
                    (undo-elt-in-region undo-elt start end)))))
        (if keep-this
            (progn
              (setq end (+ end (cdr (undo-delta undo-elt))))
              ;; Don't put two nils together in the list
-             (if (not (and (eq (car undo-list) nil)
-                           (eq undo-elt nil)))
-                 (setq undo-list (cons undo-elt undo-list))))
+             (when (not (and (eq (car undo-list) nil)
+                              (eq undo-elt nil)))
+                (setq undo-list (cons undo-elt undo-list))
+                ;; If (TEXT . POS), "keep" its subsequent (MARKER
+                ;; . ADJUSTMENT) whose markers haven't moved.
+                (when (and (stringp (car-safe undo-elt))
+                           (integerp (cdr-safe undo-elt)))
+                  (let ((list-i (cdr undo-list-copy)))
+                    (while (markerp (car-safe (car list-i)))
+                      (let* ((adj-elt (pop list-i))
+                             (m (car adj-elt)))
+                        (and (eq (marker-buffer m) (current-buffer))
+                             (= (cdr undo-elt) m)
+                             (push adj-elt undo-list))))))))
          (if (undo-elt-crosses-region undo-elt start end)
              (setq undo-list-copy nil)
            (setq some-rejected t)
@@ -2411,7 +2441,12 @@
 
 (defun undo-elt-in-region (undo-elt start end)
   "Determine whether UNDO-ELT falls inside the region START ... END.
-If it crosses the edge, we return nil."
+If it crosses the edge, we return nil.
+
+Generally this function is not useful for determining
+whether (MARKER . ADJUSTMENT) undo elements are in the region,
+because markers can be arbitrarily relocated.  Instead, pass the
+marker adjustment's corresponding (TEXT . POS) element."
   (cond ((integerp undo-elt)
         (and (>= undo-elt start)
              (<= undo-elt end)))
@@ -2424,17 +2459,8 @@
         (and (>= (abs (cdr undo-elt)) start)
              (<= (abs (cdr undo-elt)) end)))
        ((and (consp undo-elt) (markerp (car undo-elt)))
-        ;; This is a marker-adjustment element (MARKER . ADJUSTMENT).
-        ;; See if MARKER is inside the region.
-        (let ((alist-elt (assq (car undo-elt) undo-adjusted-markers)))
-          (unless alist-elt
-            (setq alist-elt (cons (car undo-elt)
-                                  (marker-position (car undo-elt))))
-            (setq undo-adjusted-markers
-                  (cons alist-elt undo-adjusted-markers)))
-          (and (cdr alist-elt)
-               (>= (cdr alist-elt) start)
-               (<= (cdr alist-elt) end))))
+        ;; (MARKER . ADJUSTMENT)
+         (<= start (car undo-elt) end))
        ((null (car undo-elt))
         ;; (nil PROPERTY VALUE BEG . END)
         (let ((tail (nthcdr 3 undo-elt)))
@@ -4467,6 +4493,11 @@
           (funcall redisplay-unhighlight-region-function rol)
           (overlay-put nrol 'window window)
           (overlay-put nrol 'face 'region)
+          ;; Normal priority so that a large region doesn't hide all the
+          ;; overlays within it, but high secondary priority so that if it
+          ;; ends/starts in the middle of a small overlay, that small overlay
+          ;; won't hide the region's boundaries.
+          (overlay-put nrol 'priority '(nil . 100))
           nrol)
       (unless (and (eq (overlay-buffer rol) (current-buffer))
                    (eq (overlay-start rol) start)

=== modified file 'lisp/url/ChangeLog'
--- a/lisp/url/ChangeLog        2014-02-13 02:19:48 +0000
+++ b/lisp/url/ChangeLog        2014-03-26 15:21:17 +0000
@@ -1,3 +1,8 @@
+2014-03-26  Juanma Barranquero  <address@hidden>
+
+       * url-handlers.el (url-http-parse-response): Add autoload.
+       (url-insert-file-contents): Signal file-error in case of HTTP error.
+
 2014-02-05  Glenn Morris  <address@hidden>
 
        * url-cookie.el (url-cookie-list): Doc fix.

=== modified file 'lisp/url/url-handlers.el'
--- a/lisp/url/url-handlers.el  2014-01-01 07:43:34 +0000
+++ b/lisp/url/url-handlers.el  2014-03-26 15:21:17 +0000
@@ -33,6 +33,7 @@
 (autoload 'url-expand-file-name "url-expand" "Convert url to a fully specified 
url, and canonicalize it.")
 (autoload 'mm-dissect-buffer "mm-decode" "Dissect the current buffer and 
return a list of MIME handles.")
 (autoload 'url-scheme-get-property "url-methods" "Get property of a URL 
SCHEME.")
+(autoload 'url-http-parse-response "url-http" "Parse just the response code.")
 
 ;; Always used after mm-dissect-buffer and defined in the same file.
 (declare-function mm-save-part-to-file "mm-decode" (handle file))
@@ -293,8 +294,15 @@
 ;;;###autoload
 (defun url-insert-file-contents (url &optional visit beg end replace)
   (let ((buffer (url-retrieve-synchronously url)))
-    (if (not buffer)
-       (error "Opening input file: No such file or directory, %s" url))
+    (unless buffer (signal 'file-error (list url "No Data")))
+    (with-current-buffer buffer
+      (let ((response (url-http-parse-response)))
+        (if (and (>= response 200) (< response 300))
+            (goto-char (point-min))
+          (let ((desc (buffer-substring-no-properties (1+ (point))
+                                                      (line-end-position))))
+            (kill-buffer buffer)
+            (signal 'file-error (list url desc))))))
     (if visit (setq buffer-file-name url))
     (save-excursion
       (let* ((start (point))

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-03-26 10:21:55 +0000
+++ b/src/ChangeLog     2014-03-26 15:57:13 +0000
@@ -1,3 +1,61 @@
+2014-03-26  Paul Eggert  <address@hidden>
+
+       Fix core dump in char-equal (Bug#17011).
+       * editfns.c (Fchar_equal): Do not use MAKE_CHAR_MULTIBYTE in
+       unibyte buffers, as we can't tell whether the characters are
+       actually unibyte.
+
+       * insdel.c (adjust_markers_for_delete): Remove unused local.
+
+2014-03-26  Barry O'Reilly  <address@hidden>
+
+       Have (MARKER . ADJUSTMENT) undo records always be immediately
+       after their corresponding (TEXT . POS) record in undo list.
+       (Bug#16818)
+       * lisp.h (record-delete): New arg record_markers.
+       (record_marker_adjustment): No longer needed outside undo.c.
+       * insdel.c (adjust_markers_for_delete): Move calculation of marker
+       adjustments to undo.c's record_marker_adjustments.  Note that
+       fileio.c's decide_coding_unwind is another caller to
+       adjust_markers_for_delete.  Because it has undo list bound to t,
+       it does not rely on adjust_markers_for_delete to record marker
+       adjustments.
+       (del_range_2): Swap call to record_delete and
+       adjust_markers_for_delete so as undo marker adjustments are
+       recorded before current deletion's adjustments, as before.
+       (adjust_after_replace):
+       (replace_range): Pass value for new record_markers arg to
+       delete_record.
+       * undo.c (record_marker_adjustment): Renamed to
+       record_marker_adjustments and made static.
+       (record_delete): Check record_markers arg and call
+       record_marker_adjustments.
+       (record_change): Pass value for new record_markers arg to
+       delete_record.
+       (record_point): at_boundary calculation no longer needs to account
+       for marker adjustments.
+
+2014-03-26  Martin Rudalics  <address@hidden>
+
+       * w32term.c (x_set_window_size): Refine fix from 2014-03-14
+       (Bug#17077).
+
+2014-03-26  Glenn Morris  <address@hidden>
+
+       * fileio.c (Ffile_symlink_p): Doc fix. (Bug#17073)
+
+2014-03-26  Stefan Monnier  <address@hidden>
+
+       * buffer.c (struct sortvec): Add field `spriority'.
+       (compare_overlays): Use it.
+       (sort_overlays): Set it.
+
+2014-03-26  Eli Zaretskii  <address@hidden>
+
+       * xdisp.c (redisplay_window): If all previous attempts to find the
+       cursor row failed, try a few alternatives before falling back to
+       the top-most row of the window.  Use row_containing_pos.  (Bug#17047)
+
 2014-03-26  Juanma Barranquero  <address@hidden>
 
        * image.c (x_bitmap_height, x_bitmap_width) [HAVE_X_WINDOWS]:

=== modified file 'src/buffer.c'
--- a/src/buffer.c      2014-03-26 01:14:44 +0000
+++ b/src/buffer.c      2014-03-26 15:57:13 +0000
@@ -3142,6 +3142,7 @@
   Lisp_Object overlay;
   ptrdiff_t beg, end;
   EMACS_INT priority;
+  EMACS_INT spriority;         /* Secondary priority.  */
 };
 
 static int
@@ -3149,19 +3150,28 @@
 {
   const struct sortvec *s1 = v1;
   const struct sortvec *s2 = v2;
+  /* Return 1 if s1 should take precedence, -1 if v2 should take precedence,
+     and 0 if they're equal.  */
   if (s1->priority != s2->priority)
     return s1->priority < s2->priority ? -1 : 1;
-  if (s1->beg != s2->beg)
-    return s1->beg < s2->beg ? -1 : 1;
-  if (s1->end != s2->end)
+  /* If the priority is equal, give precedence to the one not covered by the
+     other.  If neither covers the other, obey spriority.  */
+  else if (s1->beg < s2->beg)
+    return (s1->end < s2->end && s1->spriority > s2->spriority ? 1 : -1);
+  else if (s1->beg > s2->beg)
+    return (s1->end > s2->end && s1->spriority < s2->spriority ? -1 : 1);
+  else if (s1->end != s2->end)
     return s2->end < s1->end ? -1 : 1;
-  /* Avoid the non-determinism of qsort by choosing an arbitrary ordering
-     between "equal" overlays.  The result can still change between
-     invocations of Emacs, but it won't change in the middle of
-     `find_field' (bug#6830).  */
-  if (!EQ (s1->overlay, s2->overlay))
+  else if (s1->spriority != s2->spriority)
+    return (s1->spriority < s2->spriority ? -1 : 1);
+  else if (EQ (s1->overlay, s2->overlay))
+    return 0;
+  else
+    /* Avoid the non-determinism of qsort by choosing an arbitrary ordering
+       between "equal" overlays.  The result can still change between
+       invocations of Emacs, but it won't change in the middle of
+       `find_field' (bug#6830).  */
     return XLI (s1->overlay) < XLI (s2->overlay) ? -1 : 1;
-  return 0;
 }
 
 /* Sort an array of overlays by priority.  The array is modified in place.
@@ -3204,10 +3214,23 @@
          sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay));
          sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay));
          tem = Foverlay_get (overlay, Qpriority);
-         if (INTEGERP (tem))
-           sortvec[j].priority = XINT (tem);
-         else
-           sortvec[j].priority = 0;
+         if (NILP (tem))
+           {
+             sortvec[j].priority = 0;
+             sortvec[j].spriority = 0;
+           }
+         else if (INTEGERP (tem))
+           {
+             sortvec[j].priority = XINT (tem);
+             sortvec[j].spriority = 0;
+           }
+         else if (CONSP (tem))
+           {
+             Lisp_Object car = XCAR (tem);
+             Lisp_Object cdr = XCDR (tem);
+             sortvec[j].priority  = INTEGERP (car) ? XINT (car) : 0;
+             sortvec[j].spriority = INTEGERP (cdr) ? XINT (cdr) : 0;
+           }
          j++;
        }
     }

=== modified file 'src/editfns.c'
--- a/src/editfns.c     2014-01-24 16:05:12 +0000
+++ b/src/editfns.c     2014-03-26 05:35:38 +0000
@@ -4377,18 +4377,13 @@
   if (NILP (BVAR (current_buffer, case_fold_search)))
     return Qnil;
 
+  /* FIXME: When enable-multibyte-characters is nil, it's still possible
+     to manipulate multibyte chars, which means there is a bug for chars
+     in the range 128-255 as we can't tell whether they are eight-bit
+     bytes or Latin-1 chars.  For now, assume the latter.  See Bug#17011.
+     Also see casefiddle.c's casify_object, which has a similar problem.  */
   i1 = XFASTINT (c1);
-  if (NILP (BVAR (current_buffer, enable_multibyte_characters))
-      && ! ASCII_CHAR_P (i1))
-    {
-      MAKE_CHAR_MULTIBYTE (i1);
-    }
   i2 = XFASTINT (c2);
-  if (NILP (BVAR (current_buffer, enable_multibyte_characters))
-      && ! ASCII_CHAR_P (i2))
-    {
-      MAKE_CHAR_MULTIBYTE (i2);
-    }
   return (downcase (i1) == downcase (i2) ? Qt :  Qnil);
 }
 

=== modified file 'src/fileio.c'
--- a/src/fileio.c      2014-03-26 01:14:44 +0000
+++ b/src/fileio.c      2014-03-26 15:57:13 +0000
@@ -2682,8 +2682,7 @@
 The value is the link target, as a string.
 Otherwise it returns nil.
 
-This function returns t when given the name of a symlink that
-points to a nonexistent file.  */)
+This function does not check whether the link target exists.  */)
   (Lisp_Object filename)
 {
   Lisp_Object handler;

=== modified file 'src/insdel.c'
--- a/src/insdel.c      2014-03-26 01:14:44 +0000
+++ b/src/insdel.c      2014-03-26 15:57:13 +0000
@@ -214,9 +214,8 @@
 adjust_markers_for_delete (ptrdiff_t from, ptrdiff_t from_byte,
                           ptrdiff_t to, ptrdiff_t to_byte)
 {
-  Lisp_Object marker;
-  register struct Lisp_Marker *m;
-  register ptrdiff_t charpos;
+  struct Lisp_Marker *m;
+  ptrdiff_t charpos;
 
   for (m = BUF_MARKERS (current_buffer); m; m = m->next)
     {
@@ -233,34 +232,9 @@
       /* Here's the case where a marker is inside text being deleted.  */
       else if (charpos > from)
        {
-         if (! m->insertion_type)
-           { /* Normal markers will end up at the beginning of the
-              re-inserted text after undoing a deletion, and must be
-              adjusted to move them to the correct place.  */
-             XSETMISC (marker, m);
-             record_marker_adjustment (marker, from - charpos);
-           }
-         else if (charpos < to)
-           { /* Before-insertion markers will automatically move forward
-              upon re-inserting the deleted text, so we have to arrange
-              for them to move backward to the correct position.  */
-             XSETMISC (marker, m);
-             record_marker_adjustment (marker, to - charpos);
-           }
          m->charpos = from;
          m->bytepos = from_byte;
        }
-      /* Here's the case where a before-insertion marker is immediately
-        before the deleted region.  */
-      else if (charpos == from && m->insertion_type)
-       {
-         /* Undoing the change uses normal insertion, which will
-            incorrectly make MARKER move forward, so we arrange for it
-            to then move backward to the correct place at the beginning
-            of the deleted region.  */
-         XSETMISC (marker, m);
-         record_marker_adjustment (marker, to - from);
-       }
     }
 }
 
@@ -1219,7 +1193,7 @@
                               from + len, from_byte + len_byte, 0);
 
   if (nchars_del > 0)
-    record_delete (from, prev_text);
+    record_delete (from, prev_text, false);
   record_insert (from, len);
 
   if (len > nchars_del)
@@ -1384,7 +1358,7 @@
   if (!NILP (deletion))
     {
       record_insert (from + SCHARS (deletion), inschars);
-      record_delete (from, deletion);
+      record_delete (from, deletion, false);
     }
 
   GAP_SIZE -= outgoing_insbytes;
@@ -1716,13 +1690,14 @@
   else
     deletion = Qnil;
 
-  /* Relocate all markers pointing into the new, larger gap
-     to point at the end of the text before the gap.
-     Do this before recording the deletion,
-     so that undo handles this after reinserting the text.  */
+  /* Record marker adjustments, and text deletion into undo
+     history.  */
+  record_delete (from, deletion, true);
+
+  /* Relocate all markers pointing into the new, larger gap to point
+     at the end of the text before the gap.  */
   adjust_markers_for_delete (from, from_byte, to, to_byte);
 
-  record_delete (from, deletion);
   MODIFF++;
   CHARS_MODIFF = MODIFF;
 

=== modified file 'src/lisp.h'
--- a/src/lisp.h        2014-03-25 14:43:26 +0000
+++ b/src/lisp.h        2014-03-26 15:57:13 +0000
@@ -4199,9 +4199,8 @@
 extern Lisp_Object Qapply;
 extern Lisp_Object Qinhibit_read_only;
 extern void truncate_undo_list (struct buffer *);
-extern void record_marker_adjustment (Lisp_Object, ptrdiff_t);
 extern void record_insert (ptrdiff_t, ptrdiff_t);
-extern void record_delete (ptrdiff_t, Lisp_Object);
+extern void record_delete (ptrdiff_t, Lisp_Object, bool);
 extern void record_first_change (void);
 extern void record_change (ptrdiff_t, ptrdiff_t);
 extern void record_property_change (ptrdiff_t, ptrdiff_t,

=== modified file 'src/undo.c'
--- a/src/undo.c        2014-01-01 07:43:34 +0000
+++ b/src/undo.c        2014-03-25 02:47:39 +0000
@@ -75,27 +75,8 @@
     Fundo_boundary ();
   last_undo_buffer = current_buffer;
 
-  if (CONSP (BVAR (current_buffer, undo_list)))
-    {
-      /* Set AT_BOUNDARY only when we have nothing other than
-         marker adjustment before undo boundary.  */
-
-      Lisp_Object tail = BVAR (current_buffer, undo_list), elt;
-
-      while (1)
-       {
-         if (NILP (tail))
-           elt = Qnil;
-         else
-           elt = XCAR (tail);
-         if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
-           break;
-         tail = XCDR (tail);
-       }
-      at_boundary = NILP (elt);
-    }
-  else
-    at_boundary = 1;
+  at_boundary = ! CONSP (BVAR (current_buffer, undo_list))
+                || NILP (XCAR (BVAR (current_buffer, undo_list)));
 
   if (MODIFF <= SAVE_MODIFF)
     record_first_change ();
@@ -147,11 +128,61 @@
                  Fcons (Fcons (lbeg, lend), BVAR (current_buffer, undo_list)));
 }
 
-/* Record that a deletion is about to take place,
-   of the characters in STRING, at location BEG.  */
+/* Record the fact that markers in the region of FROM, TO are about to
+   be adjusted.  This is done only when a marker points within text
+   being deleted, because that's the only case where an automatic
+   marker adjustment won't be inverted automatically by undoing the
+   buffer modification.  */
+
+static void
+record_marker_adjustments (ptrdiff_t from, ptrdiff_t to)
+{
+  Lisp_Object marker;
+  register struct Lisp_Marker *m;
+  register ptrdiff_t charpos, adjustment;
+
+  /* Allocate a cons cell to be the undo boundary after this command.  */
+  if (NILP (pending_boundary))
+    pending_boundary = Fcons (Qnil, Qnil);
+
+  if (current_buffer != last_undo_buffer)
+    Fundo_boundary ();
+  last_undo_buffer = current_buffer;
+
+  for (m = BUF_MARKERS (current_buffer); m; m = m->next)
+    {
+      charpos = m->charpos;
+      eassert (charpos <= Z);
+
+      if (from <= charpos && charpos <= to)
+        {
+          /* insertion_type nil markers will end up at the beginning of
+             the re-inserted text after undoing a deletion, and must be
+             adjusted to move them to the correct place.
+
+             insertion_type t markers will automatically move forward
+             upon re-inserting the deleted text, so we have to arrange
+             for them to move backward to the correct position.  */
+          adjustment = (m->insertion_type ? to : from) - charpos;
+
+          if (adjustment)
+            {
+              XSETMISC (marker, m);
+              bset_undo_list
+                (current_buffer,
+                 Fcons (Fcons (marker, make_number (adjustment)),
+                        BVAR (current_buffer, undo_list)));
+            }
+        }
+    }
+}
+
+/* Record that a deletion is about to take place, of the characters in
+   STRING, at location BEG.  Optionally record adjustments for markers
+   in the region STRING occupies in the current buffer.  */
 
 void
-record_delete (ptrdiff_t beg, Lisp_Object string)
+record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers)
 {
   Lisp_Object sbeg;
 
@@ -169,36 +200,17 @@
       record_point (beg);
     }
 
+  /* primitive-undo assumes marker adjustments are recorded
+     immediately before the deletion is recorded.  See bug 16818
+     discussion.  */
+  if (record_markers)
+    record_marker_adjustments (beg, beg + SCHARS (string));
+
   bset_undo_list
     (current_buffer,
      Fcons (Fcons (string, sbeg), BVAR (current_buffer, undo_list)));
 }
 
-/* Record the fact that MARKER is about to be adjusted by ADJUSTMENT.
-   This is done only when a marker points within text being deleted,
-   because that's the only case where an automatic marker adjustment
-   won't be inverted automatically by undoing the buffer modification.  */
-
-void
-record_marker_adjustment (Lisp_Object marker, ptrdiff_t adjustment)
-{
-  if (EQ (BVAR (current_buffer, undo_list), Qt))
-    return;
-
-  /* Allocate a cons cell to be the undo boundary after this command.  */
-  if (NILP (pending_boundary))
-    pending_boundary = Fcons (Qnil, Qnil);
-
-  if (current_buffer != last_undo_buffer)
-    Fundo_boundary ();
-  last_undo_buffer = current_buffer;
-
-  bset_undo_list
-    (current_buffer,
-     Fcons (Fcons (marker, make_number (adjustment)),
-           BVAR (current_buffer, undo_list)));
-}
-
 /* Record that a replacement is about to take place,
    for LENGTH characters at location BEG.
    The replacement must not change the number of characters.  */
@@ -206,7 +218,7 @@
 void
 record_change (ptrdiff_t beg, ptrdiff_t length)
 {
-  record_delete (beg, make_buffer_string (beg, beg + length, 1));
+  record_delete (beg, make_buffer_string (beg, beg + length, 1), false);
   record_insert (beg, length);
 }
 

=== modified file 'src/w32term.c'
--- a/src/w32term.c     2014-03-26 10:21:55 +0000
+++ b/src/w32term.c     2014-03-26 15:57:13 +0000
@@ -5653,30 +5653,41 @@
 
   compute_fringe_widths (f, 0);
 
-  if (pixelwise)
+  if (frame_resize_pixelwise)
     {
-      pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
-      pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+      if (pixelwise)
+       {
+         pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+         pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+       }
+      else
+       {
+         pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width);
+         pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height);
+       }
     }
   else
     {
-      pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width);
-      pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height);
-    }
-
-  if (!frame_resize_pixelwise)
-    {
       /* If we don't resize frames pixelwise, round sizes to multiples
         of character sizes here.  Otherwise, when enforcing size hints
         while processing WM_WINDOWPOSCHANGING in w32_wnd_proc, we might
         clip our frame rectangle to a multiple of the frame's character
         size and subsequently lose our mode line or scroll bar.
-        Bug#16923 could be one possible consequence of this.  */
+        Bug#16923 could be one possible consequence of this.  Carefully
+        reverse-engineer what WM_WINDOWPOSCHANGING does here since
+        otherwise we might make our frame too small, see Bug#17077.  */
       int unit_width = FRAME_COLUMN_WIDTH (f);
       int unit_height = FRAME_LINE_HEIGHT (f);
 
-      pixelwidth = (pixelwidth / unit_width) * unit_width;
-      pixelheight = (pixelheight / unit_height) * unit_height;
+      pixelwidth = (((((pixelwise ? width : (width * FRAME_COLUMN_WIDTH (f)))
+                      + FRAME_TOTAL_FRINGE_WIDTH (f))
+                     / unit_width) * unit_width)
+                   + FRAME_SCROLL_BAR_AREA_WIDTH (f)
+                   + 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
+
+      pixelheight = ((((pixelwise ? height : (height * FRAME_LINE_HEIGHT (f)))
+                      / unit_height) * unit_height)
+                    + 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
     }
 
   f->win_gravity = NorthWestGravity;

=== modified file 'src/xdisp.c'
--- a/src/xdisp.c       2014-03-20 14:09:37 +0000
+++ b/src/xdisp.c       2014-03-23 15:57:25 +0000
@@ -16400,12 +16400,50 @@
   /* Consider the following case: Window starts at BEGV, there is
      invisible, intangible text at BEGV, so that display starts at
      some point START > BEGV.  It can happen that we are called with
-     PT somewhere between BEGV and START.  Try to handle that case.  */
+     PT somewhere between BEGV and START.  Try to handle that case,
+     and similar ones.  */
   if (w->cursor.vpos < 0)
     {
-      struct glyph_row *row = w->current_matrix->rows;
-      if (row->mode_line_p)
-       ++row;
+      /* First, try locating the proper glyph row for PT.  */
+      struct glyph_row *row =
+       row_containing_pos (w, PT, w->current_matrix->rows, NULL, 0);
+
+      /* Sometimes point is at the beginning of invisible text that is
+        before the 1st character displayed in the row.  In that case,
+        row_containing_pos fails to find the row, because no glyphs
+        with appropriate buffer positions are present in the row.
+        Therefore, we next try to find the row which shows the 1st
+        position after the invisible text.  */
+      if (!row)
+       {
+         Lisp_Object val =
+           get_char_property_and_overlay (make_number (PT), Qinvisible,
+                                          Qnil, NULL);
+
+         if (TEXT_PROP_MEANS_INVISIBLE (val))
+           {
+             ptrdiff_t alt_pos;
+             Lisp_Object invis_end =
+               Fnext_single_char_property_change (make_number (PT), Qinvisible,
+                                                  Qnil, Qnil);
+
+             if (NATNUMP (invis_end))
+               alt_pos = XFASTINT (invis_end);
+             else
+               alt_pos = ZV;
+             row = row_containing_pos (w, alt_pos, w->current_matrix->rows,
+                                       NULL, 0);
+           }
+       }
+      /* Finally, fall back on the first row of the window after the
+        header line (if any).  This is slightly better than not
+        displaying the cursor at all.  */
+      if (!row)
+       {
+         row = w->current_matrix->rows;
+         if (row->mode_line_p)
+           ++row;
+       }
       set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
     }
 

=== modified file 'test/ChangeLog'
--- a/test/ChangeLog    2014-03-23 17:56:34 +0000
+++ b/test/ChangeLog    2014-03-26 15:57:13 +0000
@@ -1,3 +1,11 @@
+2014-03-26  Barry O'Reilly  <address@hidden>
+
+       * automated/undo-tests.el (undo-test-marker-adjustment-nominal):
+       (undo-test-region-t-marker): New tests of marker adjustments.
+       (undo-test-marker-adjustment-moved):
+       (undo-test-region-mark-adjustment): New tests to demonstrate
+       bug#16818, which fail without the fix.
+
 2014-03-23  Dmitry Gutov  <address@hidden>
 
        * automated/package-test.el (package-test-describe-package):

=== modified file 'test/automated/undo-tests.el'
--- a/test/automated/undo-tests.el      2014-03-02 17:37:32 +0000
+++ b/test/automated/undo-tests.el      2014-03-25 02:47:39 +0000
@@ -268,6 +268,104 @@
     (should (string= (buffer-string)
                      "This sentence corrupted?aaa"))))
 
+(ert-deftest undo-test-marker-adjustment-nominal ()
+  "Test nominal behavior of marker adjustments."
+  (with-temp-buffer
+    (buffer-enable-undo)
+    (insert "abcdefg")
+    (undo-boundary)
+    (let ((m (make-marker)))
+      (set-marker m 2 (current-buffer))
+      (goto-char (point-min))
+      (delete-forward-char 3)
+      (undo-boundary)
+      (should (= (point-min) (marker-position m)))
+      (undo)
+      (undo-boundary)
+      (should (= 2 (marker-position m))))))
+
+(ert-deftest undo-test-region-t-marker ()
+  "Test undo in region containing marker with t insertion-type."
+  (with-temp-buffer
+    (buffer-enable-undo)
+    (transient-mark-mode 1)
+    (insert "abcdefg")
+    (undo-boundary)
+    (let ((m (make-marker)))
+      (set-marker-insertion-type m t)
+      (set-marker m (point-min) (current-buffer)) ; m at a
+      (goto-char (+ 2 (point-min)))
+      (push-mark (point) t t)
+      (setq mark-active t)
+      (goto-char (point-min))
+      (delete-forward-char 1) ;; delete region covering "ab"
+      (undo-boundary)
+      (should (= (point-min) (marker-position m)))
+      ;; Resurrect "ab". m's insertion type means the reinsertion
+      ;; moves it forward 2, and then the marker adjustment returns it
+      ;; to its rightful place.
+      (undo)
+      (undo-boundary)
+      (should (= (point-min) (marker-position m))))))
+
+(ert-deftest undo-test-marker-adjustment-moved ()
+  "Test marker adjustment behavior when the marker moves.
+Demonstrates bug 16818."
+  (with-temp-buffer
+    (buffer-enable-undo)
+    (insert "abcdefghijk")
+    (undo-boundary)
+    (let ((m (make-marker)))
+      (set-marker m 2 (current-buffer)) ; m at b
+      (goto-char (point-min))
+      (delete-forward-char 3) ; m at d
+      (undo-boundary)
+      (set-marker m 4) ; m at g
+      (undo)
+      (undo-boundary)
+      ;; m still at g, but shifted 3 because deletion undone
+      (should (= 7 (marker-position m))))))
+
+(ert-deftest undo-test-region-mark-adjustment ()
+  "Test that the mark's marker adjustment in undo history doesn't
+obstruct undo in region from finding the correct change group.
+Demonstrates bug 16818."
+  (with-temp-buffer
+    (buffer-enable-undo)
+    (transient-mark-mode 1)
+    (insert "First line\n")
+    (insert "Second line\n")
+    (undo-boundary)
+
+    (goto-char (point-min))
+    (insert "aaa")
+    (undo-boundary)
+
+    (undo)
+    (undo-boundary)
+
+    (goto-char (point-max))
+    (insert "bbb")
+    (undo-boundary)
+
+    (push-mark (point) t t)
+    (setq mark-active t)
+    (goto-char (- (point) 3))
+    (delete-forward-char 1)
+    (undo-boundary)
+
+    (insert "bbb")
+    (undo-boundary)
+
+    (goto-char (point-min))
+    (push-mark (point) t t)
+    (setq mark-active t)
+    (goto-char (+ (point) 3))
+    (undo)
+    (undo-boundary)
+
+    (should (string= (buffer-string) "aaaFirst line\nSecond line\nbbb"))))
+
 (defun undo-test-all (&optional interactive)
   "Run all tests for \\[undo]."
   (interactive "p")


reply via email to

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