# HG changeset patch # User Eli Zaretskii # Date 1264763596 18000 # Node ID 1465e84ffdb00cdf9d0e9c11951ff3856126a011 # Parent 7ff0e7bb71422126162a8b80a43f2c68d27e4394# Parent fb827ff9ec83c76a89e55d06ac866f7af62ac94c Merge from mainline. diff -r 7ff0e7bb7142 -r 1465e84ffdb0 admin/notes/bugtracker --- a/admin/notes/bugtracker Mon Jan 25 12:42:44 2010 -0500 +++ b/admin/notes/bugtracker Fri Jan 29 06:13:16 2010 -0500 @@ -2,6 +2,36 @@ The Emacs Bug Tracker can be found at http://debbugs.gnu.org/ +* Quick-start guide + +This is 95% of all you will ever need. + +** How do I report a bug? +Use M-x report-emacs-bug, or send mail to bug-gnu-emacs@gnu.org. +If you want to Cc someone, use an "X-Debbugs-CC" header instead. + +** How do I comment on a bug? +Reply to a mail on the bug-gnu-emacs list in the normal way. +Or send a mail to 123@debbugs.gnu.org. + +If the bug is old and closed, you may have to unarchive it first. +Send a mail to control@debbugs.gnu.org with +unarchive 123 +on the first line of the body. + +** How do I close a bug? +Send a mail to 123-done@debbugs.gnu.org. In the body, explain +why the bug is being closed. + +** How do I set bug meta-data? +By mailing commands to control@debbugs.gnu.org. Place commands at the +start of the message body, one per line. + +severity 123 serious|important|normal|minor|wishlist +tags 123 moreinfo|unreproducible|wontfix|patch + +* More detailed information + For a list of all bugs, see http://debbugs.gnu.org/db/pa/lemacs.html This is a static page, updated once a day. There is also a dynamic list, generated on request, but since there are many bug reports this @@ -110,11 +140,7 @@ ** Not interested in tracker control messages (tags being set, etc)? Discard mails matching: -^X-Emacs-PR-Message: transcript - -When you close a bug, you get a message matching: - -^X-Emacs-PR-Message: closed +^X-Emacs-PR-Message: (transcript|closed) ** How to avoid multiple copies of mails. If you reply to reports in the normal way, this should work fine. @@ -131,6 +157,31 @@ submitter; they get copies anyway so this will just result in more duplicate mail. +** Details of closing a bug. +(For information only) +Sending a mail to 123-done does the following: + +1) Mark the bug as closed in the database. + +2) Send a mail to the original submitter telling them that their bug +has been closed. This mail has a header: + +X-Emacs-PR-Message: they-closed 123 + +3) Send a mail to you and to the emacs-bug-tracker list confirming +that the bug has been closed. This mail has a header: + +X-Emacs-PR-Message: closed 123 + +4) Send a copy of your mail to the bug-gnu-emacs list in exactly the +same way as if you had sent mail to "123" (sans -done). This mail has +headers: + +X-Emacs-PR-Message: cc-closed 123 +Mail-Followup-To: 123@debbugs.gnu.org, person-who-closed + +(This is Emacs-specific. Normally the bug list gets the same mail as in 3). + ** Setting bug parameters. There are two ways to set the parameters of bugs in the database (tags, severity level, etc). When you report a new bug, you can @@ -341,6 +392,17 @@ Or use the static index: http://debbugs.gnu.org/db/ix/full.html +** What are those "mbox folder" links on the bug report pages? + +"mbox folder" = messages as they arrived at the tracker + +"status mbox" = as above, but with a fake message at the start + summarizing the bug status + +"maintainer mbox" = messages as sent out from the tracker to the + maintainers (ie, bug-gnu-emacs). These have some changed headers + (Resent-*, Subject, etc). + ** ChangeLog issues *** When you fix a bug, it can be helpful to put the bug number in the @@ -368,13 +430,15 @@ ** Bazaar stuff *** You can use `bzr commit --fixes emacs:123' to mark that a commit fixes -Emacs bug 123. You will first need to add a line to your bazaar.conf -(untested): +Emacs bug 123. You will first need to add a line to your bazaar.conf: bugtracker_emacs_url = http://debbugs.gnu.org/{id} Note that all this does is add some metadata to the commit, it doesn't -actually mark the bug as closed in the tracker. +actually mark the bug as closed in the tracker. There seems to be no +way to see this "metadata" with `bzr log', which is rather poor, but +it will show up as a link in a recent loggerhead installation, or with +some of the graphical frontends to bzr log. ** Gnus-specific voodoo diff -r 7ff0e7bb7142 -r 1465e84ffdb0 doc/lispref/ChangeLog --- a/doc/lispref/ChangeLog Mon Jan 25 12:42:44 2010 -0500 +++ b/doc/lispref/ChangeLog Fri Jan 29 06:13:16 2010 -0500 @@ -1,3 +1,8 @@ +2010-01-28 Alan Mackenzie + + * display.texi (Auto Faces): Say fontification-functions is called + whether or not Font Lock is enabled. Tidy up the wording a bit. + 2010-01-17 Chong Yidong * elisp.texi: Remove duplicate edition information (Bug#5407). diff -r 7ff0e7bb7142 -r 1465e84ffdb0 doc/lispref/display.texi --- a/doc/lispref/display.texi Mon Jan 25 12:42:44 2010 -0500 +++ b/doc/lispref/display.texi Fri Jan 29 06:13:16 2010 -0500 @@ -2654,23 +2654,25 @@ @defvar fontification-functions This variable holds a list of functions that are called by Emacs -redisplay as needed to assign faces automatically to text in the buffer. +redisplay as needed, just before doing redisplay. They are called even +when Font Lock Mode isn't enabled. When Font Lock Mode is enabled, this +variable usually holds just one function, @code{jit-lock-function}. The functions are called in the order listed, with one argument, a -buffer position @var{pos}. Each function should attempt to assign faces -to the text in the current buffer starting at @var{pos}. - -Each function should record the faces they assign by setting the -@code{face} property. It should also add a non-@code{nil} -@code{fontified} property for all the text it has assigned faces to. +buffer position @var{pos}. Collectively they should attempt to assign +faces to the text in the current buffer starting at @var{pos}. + +The functions should record the faces they assign by setting the +@code{face} property. They should also add a non-@code{nil} +@code{fontified} property to all the text they have assigned faces to. That property tells redisplay that faces have been assigned to that text already. -It is probably a good idea for each function to do nothing if the +It is probably a good idea for the functions to do nothing if the character after @var{pos} already has a non-@code{nil} @code{fontified} property, but this is not required. If one function overrides the -assignments made by a previous one, the properties as they are -after the last function finishes are the ones that really matter. +assignments made by a previous one, the properties after the last +function finishes are the ones that really matter. For efficiency, we recommend writing these functions so that they usually assign faces to around 400 to 600 characters at each call. diff -r 7ff0e7bb7142 -r 1465e84ffdb0 doc/misc/ChangeLog --- a/doc/misc/ChangeLog Mon Jan 25 12:42:44 2010 -0500 +++ b/doc/misc/ChangeLog Fri Jan 29 06:13:16 2010 -0500 @@ -1,8 +1,8 @@ -2010-01-24 Mark A. Hershberger +2010-01-21 Katsumi Yamaoka * gnus.texi (Score File Format): Fix typo. -2010-01-21 Katsumi Yamaoka +2010-01-19 Mark A. Hershberger * cc-mode.texi: Replace references to obsolete c-subword-mode. diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/ChangeLog --- a/lisp/ChangeLog Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/ChangeLog Fri Jan 29 06:13:16 2010 -0500 @@ -1,3 +1,61 @@ +2010-01-28 Michael Albinus + + * net/ange-ftp.el (ange-ftp-insert-directory): Handle the case, + FILENAME is not in `default-directory'. (Bug#5478) + + * net/tramp.el (tramp-handle-insert-directory): Simplify handling + of SWITCHES. Handle the case, FILENAME is not in + `default-directory'. (Bug#5478) + (tramp-register-file-name-handlers): Add safe-magic property. + +2010-01-28 Chong Yidong + + * arc-mode.el (archive-zip-extract): Quote the argument passed to + unzip (Bug#5475). + +2010-01-28 Nil Geisweiller (tiny change) + + * progmodes/flymake.el (flymake-allowed-file-name-masks) + (flymake-master-make-header-init): Add other C++ filename masks. + (flymake-find-possible-master-files) + (flymake-check-patch-master-file-buffer): Doc fixes (Bug#5488). + +2010-01-28 Michael Albinus + + Fix some busybox annoyances. + + * net/tramp.el (tramp-wrong-passwd-regexp): Add "Timeout, server + not responding." string. + (tramp-open-connection-setup-interactive-shell): Dump stty + settings. Enable "neveropen" arg for all `tramp-send-command' + calls. Handle "=" in variable values properly. + (tramp-find-inline-encoding): Raise an error, when no encoding is + found. + (tramp-wait-for-output): Check, whether PROC buffer is available. + Remove spurious " ^H" sequences, sent by busybox. + (tramp-get-ls-command): Suppress coloring, if possible. + +2010-01-28 Glenn Morris + + * vc-svn.el (vc-svn-update): Use "svn --non-interactive". (Bug#4280) + + * log-edit.el (log-edit-strip-single-file-name): Add missing + :safe, :group, and :version tags. + +2010-01-27 Stephen Berman + + * calendar/diary-lib.el (diary-unhide-everything): Handle narrowed + buffers. (Bug#5477) + +2010-01-27 David De La Harpe Golden + + * files.el (delete-directory): Handle moving to trash without + first doing recursion (Bug#5436). + +2010-01-26 Dan Nicolaescu + + * vc-hooks.el (vc-path): Mark as obsolete. + 2010-01-25 Dan Nicolaescu * vc-annotate.el (vc-annotate-revision-at-line): Compare file diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/arc-mode.el --- a/lisp/arc-mode.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/arc-mode.el Fri Jan 29 06:13:16 2010 -0500 @@ -1784,7 +1784,10 @@ (defun archive-zip-extract (archive name) (if (equal (car archive-zip-extract) "pkzip") (archive-*-extract archive name archive-zip-extract) - (archive-extract-by-stdout archive name archive-zip-extract))) + ;; unzip expands wildcards in NAME, so we need to quote it. + ;; FIXME: Does pkzip need similar treatment? + (archive-extract-by-stdout archive (shell-quote-argument name) + archive-zip-extract))) (defun archive-zip-write-file-member (archive descr) (archive-*-write-file-member diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/calendar/diary-lib.el --- a/lisp/calendar/diary-lib.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/calendar/diary-lib.el Fri Jan 29 06:13:16 2010 -0500 @@ -804,7 +804,9 @@ (defun diary-unhide-everything () "Show all invisible text in the diary." (kill-local-variable 'diary-selective-display) - (remove-overlays (point-min) (point-max) 'invisible 'diary) + (save-restriction ; bug#5477 + (widen) + (remove-overlays (point-min) (point-max) 'invisible 'diary)) (kill-local-variable 'mode-line-format)) (defvar original-date) ; bound in diary-list-entries diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/erc/ChangeLog --- a/lisp/erc/ChangeLog Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/erc/ChangeLog Fri Jan 29 06:13:16 2010 -0500 @@ -1,3 +1,12 @@ +2010-01-25 Vivek Dasmohapatra + + * erc-backend.el (erc-session-connector): New var. + (erc-server-reconnect): Use it to reconnect via old + connector (Bug#4958). + + * erc.el (erc-determine-parameters): Save + erc-server-connect-function to erc-session-connector. + 2009-11-03 Stefan Monnier * erc.el (erc-display-line-1, erc-process-away): diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/erc/erc-backend.el --- a/lisp/erc/erc-backend.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/erc/erc-backend.el Fri Jan 29 06:13:16 2010 -0500 @@ -130,6 +130,10 @@ "The server name used to connect to for this session.") (make-variable-buffer-local 'erc-session-server) +(defvar erc-session-connector nil + "The function used to connect to this session (nil for the default).") +(make-variable-buffer-local 'erc-session-connector) + (defvar erc-session-port nil "The port used to connect to.") (make-variable-buffer-local 'erc-session-port) @@ -538,8 +542,10 @@ (erc-set-active-buffer (current-buffer)) (setq erc-server-last-sent-time 0) (setq erc-server-lines-sent 0) - (erc-open erc-session-server erc-session-port erc-server-current-nick - erc-session-user-full-name t erc-session-password)))) + (let ((erc-server-connect-function (or erc-session-connector + 'open-network-stream))) + (erc-open erc-session-server erc-session-port erc-server-current-nick + erc-session-user-full-name t erc-session-password))))) (defun erc-server-filter-function (process string) "The process filter for the ERC server." diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/erc/erc.el --- a/lisp/erc/erc.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/erc/erc.el Fri Jan 29 06:13:16 2010 -0500 @@ -5654,11 +5654,13 @@ "Determine the connection and authentication parameters. Sets the buffer local variables: +- `erc-session-connector' - `erc-session-server' - `erc-session-port' - `erc-session-full-name' - `erc-server-current-nick'" - (setq erc-session-server (erc-compute-server server) + (setq erc-session-connector erc-server-connect-function + erc-session-server (erc-compute-server server) erc-session-port (or port erc-default-port) erc-session-user-full-name (erc-compute-full-name name)) (erc-set-current-nick (erc-compute-nick nick))) diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/files.el --- a/lisp/files.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/files.el Fri Jan 29 06:13:16 2010 -0500 @@ -4665,21 +4665,35 @@ ;; delete-directory handler. (setq directory (directory-file-name (expand-file-name directory))) (let ((handler (find-file-name-handler directory 'delete-directory))) - (if handler - (funcall handler 'delete-directory directory recursive) + (cond + (handler + (funcall handler 'delete-directory directory recursive)) + (delete-by-moving-to-trash + ;; Only move non-empty dir to trash if recursive deletion was + ;; requested. This mimics the non-`delete-by-moving-to-trash' + ;; case, where the operation fails in delete-directory-internal. + ;; As `move-file-to-trash' trashes directories (empty or + ;; otherwise) as a unit, we do not need to recurse here. + (if (and (not recursive) + ;; Check if directory is empty apart from "." and "..". + (directory-files + directory 'full directory-files-no-dot-files-regexp)) + (error "Directory is not empty, not moving to trash") + (move-file-to-trash directory))) + ;; Otherwise, call outselves recursively if needed. + (t (if (and recursive (not (file-symlink-p directory))) - (mapc - (lambda (file) - ;; This test is equivalent to - ;; (and (file-directory-p fn) (not (file-symlink-p fn))) - ;; but more efficient - (if (eq t (car (file-attributes file))) - (delete-directory file recursive) - (delete-file file))) - ;; We do not want to delete "." and "..". - (directory-files - directory 'full directory-files-no-dot-files-regexp))) - (delete-directory-internal directory)))) + (mapc (lambda (file) + ;; This test is equivalent to + ;; (and (file-directory-p fn) (not (file-symlink-p fn))) + ;; but more efficient + (if (eq t (car (file-attributes file))) + (delete-directory file recursive) + (delete-file file))) + ;; We do not want to delete "." and "..". + (directory-files + directory 'full directory-files-no-dot-files-regexp))) + (delete-directory-internal directory))))) (defun copy-directory (directory newname &optional keep-time parents) "Copy DIRECTORY to NEWNAME. Both args must be strings. diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/log-edit.el --- a/lisp/log-edit.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/log-edit.el Fri Jan 29 06:13:16 2010 -0500 @@ -1,7 +1,7 @@ ;;; log-edit.el --- Major mode for editing CVS commit messages -;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +;; 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Stefan Monnier ;; Keywords: pcl-cvs cvs commit log @@ -150,7 +150,10 @@ (defcustom log-edit-strip-single-file-name t "If non-nil, remove file name from single-file log entries." - :type 'boolean) + :type 'boolean + :safe 'booleanp + :group 'log-edit + :version "23.2") (defvar cvs-changelog-full-paragraphs t) (make-obsolete-variable 'cvs-changelog-full-paragraphs diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/net/ange-ftp.el --- a/lisp/net/ange-ftp.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/net/ange-ftp.el Fri Jan 29 06:13:16 2010 -0500 @@ -4542,7 +4542,18 @@ (if (string-match (concat "^.+[^ ] " (regexp-quote filename) "\\( -> .*\\)?[@/*=]?\n") dirlist) (match-string 0 dirlist) - ""))))))) + ""))))) + + ;; The inserted file could be from somewhere else. + (when (and (not wildcard) (not full) + (search-backward + (if (zerop (length (file-name-nondirectory + (expand-file-name file)))) + "." + (file-name-nondirectory file)) + nil 'noerror)) + (replace-match (file-relative-name (expand-file-name file)) t) + (goto-char (point-max))))) (defun ange-ftp-dired-uncache (dir) (if (ange-ftp-ftp-name (expand-file-name dir)) diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/net/tramp.el --- a/lisp/net/tramp.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/net/tramp.el Fri Jan 29 06:13:16 2010 -0500 @@ -1085,6 +1085,7 @@ "Login Incorrect" "Connection refused" "Connection closed" + "Timeout, server not responding." "Sorry, try again." "Name or service not known" "Host key verification failed." @@ -4061,26 +4062,25 @@ (not (symbol-value 'ls-lisp-use-insert-directory-program))) (tramp-run-real-handler 'insert-directory (list filename switches wildcard full-directory-p)) - (when (and (string-match "^--dired\\s-+" switches) + (when (stringp switches) + (setq switches (split-string switches))) + (when (and (member "--dired" switches) (not (tramp-get-ls-command-with-dired v))) - (setq switches (replace-match "" nil t switches))) - (tramp-message - v 4 "Inserting directory `ls %s %s', wildcard %s, fulldir %s" - switches filename (if wildcard "yes" "no") - (if full-directory-p "yes" "no")) + (setq switches (delete "--dired" switches))) (when wildcard (setq wildcard (tramp-run-real-handler 'file-name-nondirectory (list localname))) (setq localname (tramp-run-real-handler 'file-name-directory (list localname)))) - (when (listp switches) - (setq switches (mapconcat 'identity switches " "))) (unless full-directory-p - (setq switches (concat "-d " switches))) + (setq switches (add-to-list 'switches "-d" 'append))) + (setq switches (mapconcat 'tramp-shell-quote-argument switches " ")) (when wildcard - (setq switches (concat switches " " wildcard))) - (when (string-match "'" switches) - (setq switches (replace-match "\\\\'" nil nil switches))) + (setq switches (concat switches " " wildcard))) + (tramp-message + v 4 "Inserting directory `ls %s %s', wildcard %s, fulldir %s" + switches filename (if wildcard "yes" "no") + (if full-directory-p "yes" "no")) ;; If `full-directory-p', we just say `ls -l FILENAME'. ;; Else we chdir to the parent directory, then say `ls -ld BASENAME'. (if full-directory-p @@ -4143,6 +4143,17 @@ (while (looking-at "//") (forward-line 1) (delete-region (match-beginning 0) (point))) + + ;; The inserted file could be from somewhere else. + (when (and (not wildcard) (not full-directory-p)) + (goto-char (point-max)) + (search-backward + (if (zerop (length (file-name-nondirectory filename))) + "." + (file-name-nondirectory filename)) + beg 'noerror) + (replace-match (file-relative-name filename) t)) + (goto-char (point-max)))))) (defun tramp-handle-unhandled-file-name-directory (filename) @@ -5480,6 +5491,7 @@ ;; Add the handlers. (add-to-list 'file-name-handler-alist (cons tramp-file-name-regexp 'tramp-file-name-handler)) + (put 'tramp-file-name-handler 'safe-magic t) (add-to-list 'file-name-handler-alist (cons tramp-completion-file-name-regexp 'tramp-completion-file-name-handler)) @@ -6732,6 +6744,9 @@ ;; because we're running on a non-MULE Emacs. Let's try ;; stty, instead. (tramp-send-command vec "stty -onlcr" t)))) + ;; Dump stty settings in the traces. + (when (>= tramp-verbose 10) + (tramp-send-command vec "stty -a" t)) (tramp-send-command vec "set +o vi +o emacs" t) ;; Check whether the output of "uname -sr" has been changed. If @@ -6801,15 +6816,16 @@ ;; . We ;; apply the workaround. (if (string-equal (tramp-get-connection-property vec "uname" "") "SunOS 5.11") - (tramp-send-command vec "unset HISTFILE")) + (tramp-send-command vec "unset HISTFILE" t)) (let ((env (copy-sequence tramp-remote-process-environment)) unset item) (while env (setq item (tramp-compat-split-string (car env) "=")) - (if (and (stringp (cadr item)) (not (string-equal (cadr item) ""))) + (setcdr item (mapconcat 'identity (cdr item) "=")) + (if (and (stringp (cdr item)) (not (string-equal (cdr item) ""))) (tramp-send-command - vec (format "%s=%s; export %s" (car item) (cadr item) (car item)) t) + vec (format "%s=%s; export %s" (car item) (cdr item) (car item)) t) (push (car item) unset)) (setq env (cdr env))) (when unset @@ -6981,7 +6997,8 @@ ;; Did we find something? (unless found - (tramp-message vec 2 "Couldn't find an inline transfer encoding")) + (tramp-error + vec 'file-error "Couldn't find an inline transfer encoding")) ;; Set connection properties. (tramp-message vec 5 "Using local encoding `%s'" loc-enc) @@ -7301,7 +7318,10 @@ (unless nooutput (tramp-wait-for-output p)))) (defun tramp-wait-for-output (proc &optional timeout) - "Wait for output from remote rsh command." + "Wait for output from remote command." + (unless (buffer-live-p (process-buffer proc)) + (delete-process proc) + (tramp-error proc 'file-error "Process `%s' not available, try again" proc)) (with-current-buffer (process-buffer proc) (let* (;; Initially, `tramp-end-of-output' is "#$ ". There might ;; be leading escape sequences, which must be ignored. @@ -7313,6 +7333,14 @@ (found (tramp-wait-for-regexp proc timeout regexp1))) (if found (let (buffer-read-only) + ;; A simple-minded busybox has sent " ^H" sequences. + ;; Delete them. + (goto-char (point-min)) + (when (re-search-forward + "^\\(.\b\\)+$" (tramp-compat-line-end-position) t) + (forward-line 1) + (delete-region (point-min) (point))) + ;; Delete the prompt. (goto-char (point-max)) (re-search-backward regexp nil t) (delete-region (point) (point-max))) @@ -8002,9 +8030,14 @@ (let ((dl (tramp-get-remote-path vec)) result) (while (and dl (setq result (tramp-find-executable vec cmd dl t t))) - ;; Check parameter. + ;; Check parameters. On busybox, "ls" output coloring is + ;; enabled by default sometimes. So we try to disable it + ;; when possible. $LS_COLORING is not supported there. (when (zerop (tramp-send-command-and-check vec (format "%s -lnd /" result))) + (when (zerop (tramp-send-command-and-check + vec (format "%s --color=never /" result))) + (setq result (concat result " --color=never"))) (throw 'ls-found result)) (setq dl (cdr dl)))))) (tramp-error vec 'file-error "Couldn't find a proper `ls' command")))) @@ -8481,8 +8514,6 @@ ;; * Don't use globbing for directories with many files, as this is ;; likely to produce long command lines, and some shells choke on ;; long command lines. -;; * `vc-directory' does not work. It never displays any files, even -;; if it does show files when run locally. ;; * How to deal with MULE in `insert-file-contents' and `write-region'? ;; * Test remote ksh or bash for tilde expansion in `tramp-find-shell'? ;; * abbreviate-file-name @@ -8529,8 +8560,6 @@ ;; * Reconnect directly to a compliant shell without first going ;; through the user's default shell. (Pete Forman) ;; * Make `tramp-default-user' obsolete. -;; * Tramp shall reconnect automatically to its ssh connection when it -;; detects that the process "has died". (David Reitter) ;; * How can I interrupt the remote process with a signal ;; (interrupt-process seems not to work)? (Markus Triska) ;; * Avoid the local shell entirely for starting remote processes. If @@ -8552,6 +8581,16 @@ ;; * Keep a second connection open for out-of-band methods like scp or ;; rsync. ;; * Support ptys in `tramp-handle-start-file-process'. +;; * IMHO, it's a drawback that currently Tramp doesn't support +;; Unicode in Dired file names by default. Is it possible to +;; improve Tramp to set LC_ALL to "C" only for commands where Tramp +;; expects English? Or just to set LC_MESSAGES to "C" if Tramp +;; expects only English messages? (Juri Linkov) +;; * Make shadowfile.el grok Tramp filenames. (Bug#4526, Bug#4846) +;; * Do not handle files with drive letter as remote. (Bug#5447) +;; * Load Tramp subpackages only when needed. (Bug#1529, Bug#5448) +;; * Try telnet+curl as new method. It might be useful for busybox, +;; without built-in uuencode/uudecode. ;; Functions for file-name-handler-alist: ;; diff-latest-backup-file -- in diff.el diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/progmodes/flymake.el --- a/lisp/progmodes/flymake.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/progmodes/flymake.el Fri Jan 29 06:13:16 2010 -0500 @@ -269,8 +269,7 @@ :group 'tools) (defcustom flymake-allowed-file-name-masks - '(("\\.c\\'" flymake-simple-make-init) - ("\\.cpp\\'" flymake-simple-make-init) + '(("\\.\\(?:c\\(?:pp\\|xx\\|\\+\\+\\)?\\|CC\\)\\'" flymake-simple-make-init) ("\\.xml\\'" flymake-xml-init) ("\\.html?\\'" flymake-xml-init) ("\\.cs\\'" flymake-simple-make-init) @@ -291,7 +290,7 @@ ;; ("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2 )) ;; ("\\.tex\\'" 1) ) - "*Files syntax checking is allowed for." + "Files syntax checking is allowed for." :group 'flymake :type '(repeat (string symbol symbol symbol))) @@ -384,7 +383,7 @@ (defun flymake-find-possible-master-files (file-name master-file-dirs masks) "Find (by name and location) all possible master files. -Master files are .cpp and .c for and .h. Files are searched for +Master files include .cpp and .c for .h. Files are searched for starting from the .h directory and max max-level parent dirs. File contents are not checked." (let* ((dirs master-file-dirs) @@ -434,9 +433,11 @@ source-file-name patched-source-file-name include-dirs regexp) "Check if MASTER-FILE-NAME is a master file for SOURCE-FILE-NAME. -For .cpp master file this means it includes SOURCE-FILE-NAME (.h). If yes, patch a copy of MASTER-FILE-NAME to include PATCHED-SOURCE-FILE-NAME instead of SOURCE-FILE-NAME. + +For example, foo.cpp is a master file if it includes foo.h. + Whether a buffer for MATER-FILE-NAME exists, use it as a source instead of reading master file from disk." (let* ((source-file-nondir (file-name-nondirectory source-file-name)) @@ -1700,9 +1701,10 @@ ;;;; .h/make specific (defun flymake-master-make-header-init () - (flymake-master-make-init 'flymake-get-include-dirs - '("\\.cpp\\'" "\\.c\\'") - "[ \t]*#[ \t]*include[ \t]*\"\\([[:word:]0-9/\\_.]*%s\\)\"")) + (flymake-master-make-init + 'flymake-get-include-dirs + '("\\.\\(?:c\\(?:pp\\|xx\\|\\+\\+\\)?\\|CC\\)\\'") + "[ \t]*#[ \t]*include[ \t]*\"\\([[:word:]0-9/\\_.]*%s\\)\"")) ;;;; .java/make specific (defun flymake-simple-make-java-init () diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/vc-hooks.el --- a/lisp/vc-hooks.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/vc-hooks.el Fri Jan 29 06:13:16 2010 -0500 @@ -89,6 +89,8 @@ :type '(repeat directory) :group 'vc) +(make-obsolete 'vc-path "should not be necessary anymore." "23.2") + (defcustom vc-make-backup-files nil "If non-nil, backups of registered files are made as with other files. If nil (the default), files covered by version control don't get backups." diff -r 7ff0e7bb7142 -r 1465e84ffdb0 lisp/vc-svn.el --- a/lisp/vc-svn.el Mon Jan 25 12:42:44 2010 -0500 +++ b/lisp/vc-svn.el Fri Jan 29 06:13:16 2010 -0500 @@ -330,6 +330,7 @@ ;; Check out a particular version (or recreate the file). (vc-file-setprop file 'vc-working-revision nil) (apply 'vc-svn-command nil 0 file + "--non-interactive" ; bug#4280 "update" (cond ((null rev) "-rBASE") diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/ChangeLog --- a/src/ChangeLog Mon Jan 25 12:42:44 2010 -0500 +++ b/src/ChangeLog Fri Jan 29 06:13:16 2010 -0500 @@ -1,3 +1,33 @@ +2010-01-28 Chong Yidong + + * fileio.c (Frename_file): Fix last change (Bug#5487). + + * m/mips.h: Remove DATA_START. Suggested by Dan Nicolaescu. + + * m/alpha.h: Don't define DATA_START on NetBSD (Bug#4629). + +2010-01-28 Jan Djärv + + * xfns.c (Fx_create_frame): Remove window size matching code from + 2010-01-15. + (x_get_current_desktop, x_get_desktop_workarea): Remove + +2010-01-27 Jason Rumney + + * w32inevt.c (w32_kbd_patch_key): Save the unicode character. + (key_event): Use unicode for characters 128 and higher (Bug#4567). + +2010-01-27 Kenichi Handa + + * regex.c (analyse_first): Fix setting of fastmap for unibyte + pattern string (Bug#4209). + +2010-01-27 David De La Harpe Golden + + * fileio.c (Frename_file): Call copy-directory and + delete-directory for directories, in order to handle cross-device + renaming (Bug#3353). + 2010-01-25 Jan Djärv * xfns.c (Fx_create_frame): If frame height is too big, try @@ -9323,7 +9353,7 @@ (syms_of_xterm): Don't declare it any more. (x_draw_glyph_string): Adjust to the new name. -2008-06-10 David De La Harpe Golden (tiny change) +2008-06-10 David De La Harpe Golden * xterm.c (x_underline_minimum_display_offset): New var. (x_draw_glyph_string): Use it. diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/fileio.c --- a/src/fileio.c Mon Jan 25 12:42:44 2010 -0500 +++ b/src/fileio.c Fri Jan 29 06:13:16 2010 -0500 @@ -215,6 +215,12 @@ /* Lisp function for moving files to trash. */ Lisp_Object Qmove_file_to_trash; +/* Lisp function for recursively copying directories. */ +Lisp_Object Qcopy_directory; + +/* Lisp function for recursively deleting directories. */ +Lisp_Object Qdelete_directory; + extern Lisp_Object Vuser_login_name; #ifdef WINDOWSNT @@ -2241,7 +2247,11 @@ && (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname)))) #endif ) - newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname); + { + Lisp_Object fname = NILP (Ffile_directory_p (file)) + ? file : Fdirectory_file_name (file); + newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname); + } else newname = Fexpand_file_name (newname, Qnil); @@ -2279,15 +2289,21 @@ NILP (ok_if_already_exists) ? Qnil : Qt); else #endif + if (!NILP (Ffile_directory_p (file))) + call4 (Qcopy_directory, file, newname, Qt, Qnil); + else + /* We have already prompted if it was an integer, so don't + have copy-file prompt again. */ Fcopy_file (file, newname, - /* We have already prompted if it was an integer, - so don't have copy-file prompt again. */ NILP (ok_if_already_exists) ? Qnil : Qt, Qt, Qt); count = SPECPDL_INDEX (); specbind (Qdelete_by_moving_to_trash, Qnil); - Fdelete_file (file); + if (!NILP (Ffile_directory_p (file))) + call2 (Qdelete_directory, file, Qt); + else + Fdelete_file (file); unbind_to (count, Qnil); } else @@ -5727,6 +5743,10 @@ Qdelete_by_moving_to_trash = intern_c_string ("delete-by-moving-to-trash"); Qmove_file_to_trash = intern_c_string ("move-file-to-trash"); staticpro (&Qmove_file_to_trash); + Qcopy_directory = intern_c_string ("copy-directory"); + staticpro (&Qcopy_directory); + Qdelete_directory = intern_c_string ("delete-directory"); + staticpro (&Qdelete_directory); defsubr (&Sfind_file_name_handler); defsubr (&Sfile_name_directory); diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/m/alpha.h --- a/src/m/alpha.h Mon Jan 25 12:42:44 2010 -0500 +++ b/src/m/alpha.h Fri Jan 29 06:13:16 2010 -0500 @@ -95,7 +95,7 @@ #undef UNEXEC #define UNEXEC unexelf.o -#ifndef GNU_LINUX +#if !defined(GNU_LINUX) && !defined(__NetBSD__) #define DATA_START 0x140000000 #endif diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/m/mips.h --- a/src/m/mips.h Mon Jan 25 12:42:44 2010 -0500 +++ b/src/m/mips.h Fri Jan 29 06:13:16 2010 -0500 @@ -50,10 +50,6 @@ #define TEXT_START 0x00400000 -#ifndef GNU_LINUX -#define DATA_START 0x10000000 -#endif - #if 0 /* These definitions were advantageous when not using USE_LSB_TAG. With that, they get ignored but cause errors. */ diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/regex.c --- a/src/regex.c Mon Jan 25 12:42:44 2010 -0500 +++ b/src/regex.c Fri Jan 29 06:13:16 2010 -0500 @@ -4083,8 +4083,7 @@ the corresponding multibyte character. */ int c = RE_CHAR_TO_MULTIBYTE (p[1]); - if (! CHAR_BYTE8_P (c)) - fastmap[CHAR_LEADING_CODE (c)] = 1; + fastmap[CHAR_LEADING_CODE (c)] = 1; } } break; diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/w32inevt.c --- a/src/w32inevt.c Mon Jan 25 12:42:44 2010 -0500 +++ b/src/w32inevt.c Fri Jan 29 06:13:16 2010 -0500 @@ -81,6 +81,9 @@ static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE]; static INPUT_RECORD *queue_ptr = event_queue, *queue_end = event_queue; +/* Temporarily store lead byte of DBCS input sequences. */ +static char dbcs_lead = 0; + static int fill_queue (BOOL block) { @@ -253,13 +256,15 @@ keystate, buf, 128, 0); if (isdead > 0) { - char cp[20]; - int cpId; + char cp[20]; + int cpId; + + event->uChar.UnicodeChar = buf[isdead - 1]; - GetLocaleInfo (GetThreadLocale (), + GetLocaleInfo (GetThreadLocale (), LOCALE_IDEFAULTANSICODEPAGE, cp, 20); - cpId = atoi (cp); - isdead = WideCharToMultiByte (cpId, 0, buf, isdead, + cpId = atoi (cp); + isdead = WideCharToMultiByte (cpId, 0, buf, isdead, ansi_code, 4, NULL, NULL); } else @@ -425,8 +430,6 @@ if (lispy_function_keys[event->wVirtualKeyCode] == 0) { - emacs_ev->kind = ASCII_KEYSTROKE_EVENT; - if (!NILP (Vw32_recognize_altgr) && (event->dwControlKeyState & LEFT_CTRL_PRESSED) && (event->dwControlKeyState & RIGHT_ALT_PRESSED)) @@ -461,9 +464,65 @@ else if (event->uChar.AsciiChar == 0) w32_kbd_patch_key (event); } + if (event->uChar.AsciiChar == 0) - return 0; - emacs_ev->code = event->uChar.AsciiChar; + { + emacs_ev->kind = NO_EVENT; + return 0; + } + else if (event->uChar.AsciiChar > 0 && event->uChar.AsciiChar < 128) + { + emacs_ev->kind = ASCII_KEYSTROKE_EVENT; + emacs_ev->code = event->uChar.AsciiChar; + } + else if (event->uChar.UnicodeChar > 0) + { + emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; + emacs_ev->code = event->uChar.UnicodeChar; + } + else + { + /* Fallback for non-Unicode versions of Windows. */ + wchar_t code; + char dbcs[2]; + char cp[20]; + int cpId; + + /* Get the codepage to interpret this key with. */ + GetLocaleInfo (GetThreadLocale (), + LOCALE_IDEFAULTANSICODEPAGE, cp, 20); + cpId = atoi (cp); + + dbcs[0] = dbcs_lead; + dbcs[1] = event->uChar.AsciiChar; + if (dbcs_lead) + { + dbcs_lead = 0; + if (!MultiByteToWideChar (cpId, 0, dbcs, 2, &code, 1)) + { + /* Garbage */ + DebPrint (("Invalid DBCS sequence: %d %d\n", + dbcs[0], dbcs[1])); + emacs_ev->kind = NO_EVENT; + } + } + else if (IsDBCSLeadByteEx (cpId, dbcs[1])) + { + dbcs_lead = dbcs[1]; + emacs_ev->kind = NO_EVENT; + } + else + { + if (!MultiByteToWideChar (cpId, 0, &dbcs[1], 1, &code, 1)) + { + /* Garbage */ + DebPrint (("Invalid character: %d\n", dbcs[1])); + emacs_ev->kind = NO_EVENT; + } + } + emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; + emacs_ev->code = code; + } } else { diff -r 7ff0e7bb7142 -r 1465e84ffdb0 src/xfns.c --- a/src/xfns.c Mon Jan 25 12:42:44 2010 -0500 +++ b/src/xfns.c Fri Jan 29 06:13:16 2010 -0500 @@ -3145,91 +3145,6 @@ return Qnil; } -/* Return current desktop index for the display where frame F is. - If we can't find out the current desktop, return 0. */ - -static int -x_get_current_desktop (f) - struct frame *f; -{ - Atom actual_type; - unsigned long actual_size, bytes_remaining; - int rc, actual_format; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); - long max_len = 10; - Display *dpy = FRAME_X_DISPLAY (f); - long *data = NULL; - int current_desktop; - - BLOCK_INPUT; - x_catch_errors (dpy); - rc = XGetWindowProperty (dpy, dpyinfo->root_window, - XInternAtom (dpy, "_NET_CURRENT_DESKTOP", False), - 0, max_len, False, XA_CARDINAL, - &actual_type, &actual_format, &actual_size, - &bytes_remaining, (unsigned char **)&data); - - if (rc != Success || actual_type != XA_CARDINAL || x_had_errors_p (dpy) - || actual_size == 0 || actual_format != 32) - current_desktop = 0; - else - current_desktop = (int)*data; - - if (data) XFree (data); - x_uncatch_errors (); - UNBLOCK_INPUT; - return current_desktop; -} - -/* Return current size for DESKTOP_INDEX on the display where frame F is. - If we can't find out the size, return 0, otherwise 1. */ - -static int -x_get_desktop_workarea (f, desktop_index, deskw, deskh) - struct frame *f; - int desktop_index; - int *deskw, *deskh; -{ - Atom actual_type; - unsigned long actual_size, bytes_remaining; - int rc, actual_format; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); - long max_len = 1000; /* This handles 250 desktops, who has that many? */ - Display *dpy = FRAME_X_DISPLAY (f); - long *data = NULL; - int retval; - - BLOCK_INPUT; - x_catch_errors (dpy); - rc = XGetWindowProperty (dpy, dpyinfo->root_window, - XInternAtom (dpy, "_NET_WORKAREA", False), - 0, max_len, False, XA_CARDINAL, - &actual_type, &actual_format, &actual_size, - &bytes_remaining, (unsigned char **)&data); - - if (rc != Success || actual_type != XA_CARDINAL || x_had_errors_p (dpy) - || actual_size < 3 || actual_format != 32) - retval = 0; - else - { - int idx; - - if (actual_size == 4 /* Only one info for all desktops. */ - || desktop_index*4 > actual_size) /* destop_index out of range. */ - desktop_index = 0; - - idx = desktop_index*4; - *deskw = data[idx+2] - data[idx]; - *deskh = data[idx+3] - data[idx+1]; - retval = 1; - } - - if (data) XFree (data); - x_uncatch_errors (); - UNBLOCK_INPUT; - return retval; -} - DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, 1, 1, 0, doc: /* Make a new X window, which is called a "frame" in Emacs terms. @@ -3249,7 +3164,7 @@ Lisp_Object name; int minibuffer_only = 0; long window_prompting = 0; - int width, height, deskw = -1, deskh = -1, current_desktop = -1; + int width, height; int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; Lisp_Object display; @@ -3517,66 +3432,6 @@ /* Compute the size of the X window. */ window_prompting = x_figure_window_size (f, parms, 1); - /* Don't make height higher than display height unless the user asked - for it. Try sizes 24 and 10 if current is too large. */ - height = FRAME_LINES (f); - tem = x_get_arg (dpyinfo, parms, Qheight, 0, 0, RES_TYPE_NUMBER); - if (EQ (tem, Qunbound)) - { - int h = FRAME_LINES (f) + FRAME_TOOL_BAR_LINES (f) - + FRAME_MENU_BAR_LINES (f) + 2; - int ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, h); - int dph = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); - static int tryheight[] = { 24, 10, 0 } ; - int i; - - ph += (FRAME_EXTERNAL_TOOL_BAR (f) ? 32 : 0) /* Gtk toolbar size */ - + (FRAME_EXTERNAL_MENU_BAR (f) ? 24 : 0); /* Arbitrary */ - - /* Some desktops have fixed menus above and/or panels below. Try to - figure out the usable size we have for emacs. */ - current_desktop = x_get_current_desktop (f); - x_get_desktop_workarea (f, current_desktop, &deskw, &deskh); - if (deskh > 0 && deskh < dph) dph = deskh; - - /* Allow 40 pixels for manager decorations. */ - for (i = 0; ph+40 > dph && tryheight[i] != 0; ++i) - { - height = tryheight[i]; - h = height + FRAME_TOOL_BAR_LINES (f) + FRAME_MENU_BAR_LINES (f) + 2; - ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, h) - + (FRAME_EXTERNAL_TOOL_BAR (f) ? 32 : 0) - + (FRAME_EXTERNAL_MENU_BAR (f) ? 24 : 0); - } - } - - /* Don't make width wider than display width unless the user asked - for it. */ - width = FRAME_COLS (f); - tem = x_get_arg (dpyinfo, parms, Qwidth, 0, 0, RES_TYPE_NUMBER); - if (EQ (tem, Qunbound)) - { - int pw = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, FRAME_COLS (f)); - int dpw = DisplayWidth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); - if (deskw == -1) - { - current_desktop = x_get_current_desktop (f); - x_get_desktop_workarea (f, current_desktop, &deskw, &deskh); - } - if (deskw > 0 && deskw < dpw) dpw = deskw; - - if (pw > dpw) - width = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, dpw); - } - - if (height != FRAME_LINES (f) || width != FRAME_COLS (f)) - { - check_frame_size (f, &height, &width); - FRAME_LINES (f) = height; - SET_FRAME_COLS (f, width); - } - - tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); f->no_split = minibuffer_only || EQ (tem, Qt);