rpms/subversion/devel psvn.el,1.3,1.4 subversion.spec,1.58,1.59

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Fri Dec 2 11:20:30 UTC 2005


Author: jorton

Update of /cvs/dist/rpms/subversion/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv11427

Modified Files:
	psvn.el subversion.spec 
Log Message:
* Fri Dec  2 2005 Joe Orton <jorton at redhat.com> 1.2.3-5
- rebuild for httpd-2.2/apr-1.2/apr-util-1.2



Index: psvn.el
===================================================================
RCS file: /cvs/dist/rpms/subversion/devel/psvn.el,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- psvn.el	8 Sep 2005 15:51:44 -0000	1.3
+++ psvn.el	2 Dec 2005 11:20:27 -0000	1.4
@@ -42,6 +42,7 @@
 ;; r     - svn-status-revert                run 'svn revert'
 ;; X v   - svn-status-resolved              run 'svn resolved'
 ;; U     - svn-status-update-cmd            run 'svn update'
+;; M-u   - svn-status-update-cmd            run 'svn update'
 ;; c     - svn-status-commit                run 'svn commit'
 ;; a     - svn-status-add-file              run 'svn add --non-recursive'
 ;; A     - svn-status-add-file-recursively  run 'svn add'
@@ -114,15 +115,22 @@
 ;; Or you can check it out from the subversion repository:
 ;;   svn co http://svn.collab.net/repos/svn/trunk/contrib/client-side/psvn psvn
 
+;; "svn-" is the package prefix used in psvn.el.  There are also longer
+;; prefixes which clarify the code and help symbol completion, but they
+;; are not intended to prevent name clashes with other packages.  All
+;; interactive commands meant to be used only in a specific mode should
+;; have names beginning with the name of that mode: for example,
+;; "svn-status-add-file" in "svn-status-mode".  "psvn" should be used
+;; only in names of files, customization groups, and features.  If SVK
+;; support is ever added, it should use "svn-svk-" when no existing
+;; prefix is applicable.
+
 ;; TODO:
 ;; * shortcut for svn propset svn:keywords "Date" psvn.el
 ;; * docstrings for the functions
 ;; * perhaps shortcuts for ranges, dates
 ;; * when editing the command line - offer help from the svn client
 ;; * finish svn-status-property-set
-;; * eventually use the customize interface
-;; * interactive svn-status should complete existing directories only;
-;;   unfortunately `read-directory-name' doesn't exist in Emacs 21.3
 ;; * Add repository browser
 ;; * Improve support for svn blame
 
@@ -167,49 +175,105 @@
 (require 'easymenu)
 
 ;;; user setable variables
-(defvar svn-status-verbose t "*Add '-v' to svn status call.")
-(defvar svn-log-edit-file-name "++svn-log++" "*Name of a saved log file.")
-(defvar svn-log-edit-insert-files-to-commit t "*Insert the filelist to commit in the *svn-log* buffer")
-(defvar svn-log-edit-use-log-edit-mode (and (condition-case nil (require 'log-edit) (error nil)) t) "*Use log-edit-mode as base for svn-log-edit-mode")
-(defvar svn-status-hide-unknown nil
+(defcustom svn-status-verbose t
+  "*Add '-v' to svn status call."
+  :type 'boolean
+  :group 'psvn)
+(defcustom svn-log-edit-file-name "++svn-log++"
+  "*Name of a saved log file.
+This can be either absolute, or relative to the default directory
+of the *svn-log-edit* buffer."
+  :type 'file
+  :group 'psvn)
+(defcustom svn-log-edit-insert-files-to-commit t
+  "*Insert the filelist to commit in the *svn-log* buffer"
+  :type 'boolean
+  :group 'psvn)
+(defcustom svn-log-edit-use-log-edit-mode
+  (and (condition-case nil (require 'log-edit) (error nil)) t)
+  "*Use log-edit-mode as base for svn-log-edit-mode
+This variable takes effect only when psvn.el is being loaded."
+  :type 'boolean
+  :group 'psvn)
+(defcustom svn-status-hide-unknown nil
   "*Hide unknown files in `svn-status-buffer-name' buffer.
-This can be toggled with \[svn-status-toggle-hide-unknown].")
-(defvar svn-status-hide-unmodified nil
+This can be toggled with \\[svn-status-toggle-hide-unknown]."
+  :type 'boolean
+  :group 'psvn)
+(defcustom svn-status-hide-unmodified nil
   "*Hide unmodified files in `svn-status-buffer-name' buffer.
-This can be toggled with \[svn-status-toggle-hide-unmodified].")
-(defvar svn-status-sort-status-buffer t "Sort the `svn-status-buffer-name' buffer.
+This can be toggled with \\[svn-status-toggle-hide-unmodified]."
+  :type 'boolean
+  :group 'psvn)
+(defcustom svn-status-sort-status-buffer t
+  "Sort the `svn-status-buffer-name' buffer.
 Setting this variable to nil speeds up M-x svn-status.
-However, it is possible, that the sorting is wrong in this case.")
+However, it is possible, that the sorting is wrong in this case.
+This can be toggled with \\[svn-status-toggle-sort-status-buffer]."
+  :type 'boolean
+  :group 'psvn)
 
-(defvar svn-status-unmark-files-after-list '(commit revert)
+(defcustom svn-status-unmark-files-after-list '(commit revert)
   "*List of operations after which all user marks will be removed.
-Possible values are: commit, revert.")
+Possible values are: commit, revert."
+  :type '(set (const commit)
+              (const revert))
+  :group 'psvn)
 
-(defvar svn-status-negate-meaning-of-arg-commands nil
+(defcustom svn-status-negate-meaning-of-arg-commands '()
   "*List of operations that should use a negated meaning of the prefix argument.
-The supported functions are `svn-status' and `svn-status-set-user-mark'.")
+The supported functions are `svn-status' and `svn-status-set-user-mark'."
+  :type '(set (function-item svn-status)
+              (function-item svn-status-set-user-mark))
+  :group 'psvn)
 
-(defvar svn-status-svn-executable "svn" "*The name of the svn executable.")
+(defcustom svn-status-svn-executable "svn"
+  "*The name of the svn executable.
+This can be either absolute or looked up on `exec-path'."
+  ;; Don't use (file :must-match t).  It doesn't know about `exec-path'.
+  :type 'file
+  :group 'psvn)
 
 ;; TODO: bind `process-environment' instead of running env?
 ;; That would probably work more reliably in Windows.
-(defvar svn-status-svn-environment-var-list nil
+(defcustom svn-status-svn-environment-var-list '()
   "*A list of environment variables that should be set for that svn process.
 If you set that variable, svn is called with that environment variables set.
 That is done via the env program.
 
-You could set it for example to '(\"LANG=C\")")
+You could set it for example to '(\"LANG=C\")"
+  :type '(repeat (string :valid-regexp "=" :value "LANG=C"))
+  :group 'psvn)
 
-(defvar svn-browse-url-function nil
+(defcustom svn-browse-url-function nil
   ;; If the user hasn't changed `svn-browse-url-function', then changing
   ;; `browse-url-browser-function' should affect psvn even after it has
   ;; been loaded.
   "Function to display a Subversion related WWW page in a browser.
 So far, this is used only for \"trac\" issue tracker integration.
 By default, this is nil, which means use `browse-url-browser-function'.
-Any non-nil value overrides that variable, with the same syntax.")
+Any non-nil value overrides that variable, with the same syntax."
+  ;; It would be nice to show the full list of browsers supported by
+  ;; browse-url, but (custom-variable-type 'browse-url-browser-function)
+  ;; returns just `function' if browse-url has not yet been loaded,
+  ;; and there seems to be no easy way to autoload browse-url when
+  ;; the custom-type of svn-browse-url-function is actually needed.
+  ;; So I'll only offer enough choices to cover all supported types.
+  :type `(choice (const :tag "Specified by `browse-url-browser-function'" nil)
+                 (function :value browse-url-default-browser
+                           ;; In XEmacs 21.4.17, the `function' widget matches
+                           ;; all objects.  Constrain it here so that alists
+                           ;; fall through to the next choice.  Accept either
+                           ;; a symbol (fbound or not) or a lambda expression.
+                           :match ,(lambda (widget value)
+                                     (or (symbolp value) (functionp value))))
+                 (svn-alist :tag "Regexp/function association list"
+                            :key-type regexp :value-type function
+                            :value (("." . browse-url-default-browser))))
+  :link '(emacs-commentary-link "browse-url")
+  :group 'psvn)
 
-(defvar svn-status-window-alist
+(defcustom svn-status-window-alist
   '((diff "*svn-diff*") (log "*svn-log*") (info t) (blame t) (proplist t) (update t))
   "An alist to specify which windows should be used for svn command outputs.
 The following keys are supported: diff, log, info, blame, proplist, update.
@@ -217,9 +281,19 @@
 nil       ... show in *svn-process* buffer
 t         ... show in dedicated *svn-info* buffer
 invisible ... don't show the buffer (eventually useful for update)
-a string  ... show in a buffer named string")
+a string  ... show in a buffer named string"
+  :type '(svn-alist
+          :key-type symbol
+          :value-type (group
+                       (choice
+                        (const :tag "Show in *svn-process* buffer" nil)
+                        (const :tag "Show in dedicated *svn-info* buffer" t)
+                        (const :tag "Don't show the output" invisible)
+                        (string :tag "Show in a buffer named"))))
+  :options '(diff log info blame proplist update)
+  :group 'psvn)
 
-(defvar svn-status-short-mod-flag-p t
+(defcustom svn-status-short-mod-flag-p t
   "*Whether the mark for out of date files is short or long.
 
 If this variable is is t, and a file is out of date (i.e., there is a newer
@@ -231,7 +305,10 @@
 
 In either case the mark gets the face
 `svn-status-update-available-face', and will only be visible if
-`\\[svn-status-update]' is run with a prefix argument")
+`\\[svn-status-update]' is run with a prefix argument"
+  :type '(choice (const :tag "Short \"**\"" t)
+                 (const :tag "Long \"(Update Available)\"" nil))
+  :group 'psvn)
 
 (defvar svn-status-debug-level 0 "The psvn.el debugging verbosity level.
 The higher the number, the more debug messages are shown.
@@ -240,25 +317,49 @@
 
 (defvar svn-status-buffer-name "*svn-status*" "Name for the svn status buffer")
 
-(defvar svn-status-use-header-line t
+(defcustom svn-status-use-header-line
+  (if (boundp 'header-line-format) t 'inline)
   "*Whether a header line should be used.
 When t: Use the emacs header line
 When 'inline: Insert the header line in the `svn-status-buffer-name' buffer
-Otherwise: Don't display a header line")
+Otherwise: Don't display a header line"
+  :type '(choice (const :tag "Show column titles as a header line" t)
+                 (const :tag "Insert column titles as text in the buffer" inline)
+                 (other :tag "No column titles" nil))
+  :group 'psvn)
 
 ;;; default arguments to pass to svn commands
-(defvar svn-status-default-log-arguments ""
-  "*Arguments to pass to svn log.
-\(used in `svn-status-show-svn-log'; override these by giving prefixes\).")
+;; TODO: When customizing, an option menu or completion might be nice....
+(defcustom svn-status-default-log-arguments '()
+  "*List of arguments to pass to svn log.
+\(used in `svn-status-show-svn-log'; override these by giving prefixes\)."
+  :type '(repeat string)
+  :group 'psvn)
 
-(defvar svn-status-default-diff-arguments nil
-  "*A list of arguments that is passed to the svn diff command.
-  If you'd like to supress whitespace changes use the following value:
-  '(\"--diff-cmd\" \"diff\" \"-x\" \"-wbBu\")")
+(defcustom svn-status-default-commit-arguments '()
+  "*List of arguments to pass to svn commit.
+If you don't like recursive commits, set this value to (\"-N\")
+or mark the directory before committing it.
+Do not put an empty string here, except as an argument of an option:
+Subversion and the operating system may treat that as a file name
+equivalent to \".\", so you would commit more than you intended."
+  :type '(repeat string)
+  :group 'psvn)
 
-(defvar svn-trac-project-root nil "Path for an eventual existing trac issue tracker.")
+(defcustom svn-status-default-diff-arguments '()
+  "*A list of arguments that is passed to the svn diff command.
+If you'd like to suppress whitespace changes use the following value:
+'(\"--diff-cmd\" \"diff\" \"-x\" \"-wbBu\")"
+  :type '(repeat string)
+  :group 'psvn)
 
-(defvar svn-status-module-name nil "A nice short name for the actual project.")
+(defvar svn-trac-project-root nil
+  "Path for an eventual existing trac issue tracker.
+This can be set with \\[svn-status-set-trac-project-root].")
+
+(defvar svn-status-module-name nil
+  "A nice short name for the actual project.
+This can be set with \\[svn-status-set-module-name].")
 
 (defvar svn-status-load-state-before-svn-status t "Load the ++psvn.state file, before running svn-status")
 
@@ -270,9 +371,11 @@
   "A special coding system is needed for the output of svn.
 svn-status-coding-system is used in svn-run-svn, if it is not nil.")
 
-(defvar svn-status-wash-control-M-in-process-buffers
+(defcustom svn-status-wash-control-M-in-process-buffers
   (eq system-type 'windows-nt)
-  "*Remove any trailing ^M from the *svn-process* buffer.")
+  "*Remove any trailing ^M from the *svn-process* buffer."
+  :type 'boolean
+  :group 'psvn)
 
 ;;; experimental features
 (defvar svn-status-track-user-input nil "Track user/password queries.
@@ -332,7 +435,12 @@
 (defvar svn-status-default-author-width 9)
 (defvar svn-status-line-format " %c%c%c %4s %4s %-9s")
 (defvar svn-start-of-file-list-line-number 0)
-(defvar svn-status-files-to-commit nil)
+(defvar svn-status-files-to-commit nil
+  "List of files to commit at `svn-log-edit-done'.
+This is always set together with `svn-status-recursive-commit'.")
+(defvar svn-status-recursive-commit nil
+  "Non-nil if the next commit should be recursive.
+This is always set together with `svn-status-files-to-commit'.")
 (defvar svn-status-pre-commit-window-configuration nil)
 (defvar svn-status-pre-propedit-window-configuration nil)
 (defvar svn-status-head-revision nil)
@@ -475,21 +583,63 @@
 
 ; compatibility
 ; emacs 20
-(unless (fboundp 'point-at-eol) (defalias 'point-at-eol 'line-end-position))
-(unless (fboundp 'point-at-bol) (defalias 'point-at-bol 'line-beginning-position))
-(unless (functionp 'read-directory-name) (defalias 'read-directory-name 'read-file-name))
+(defalias 'svn-point-at-eol
+  (if (fboundp 'point-at-eol) 'point-at-eol 'line-end-position))
+(defalias 'svn-point-at-bol
+  (if (fboundp 'point-at-bol) 'point-at-bol 'line-beginning-position))
+(defalias 'svn-read-directory-name 
+  (if (fboundp 'read-directory-name) 'read-directory-name 'read-file-name))
 
 (eval-when-compile
   (if (not (fboundp 'gethash))
       (require 'cl-macs)))
-(if (not (fboundp 'puthash))
-    (defalias 'puthash 'cl-puthash))
+(defalias 'svn-puthash (if (fboundp 'puthash) 'puthash 'cl-puthash))
 
 ; xemacs
-(if (fboundp 'match-string-no-properties)
-    nil ;; great
-  (defsubst match-string-no-properties (match)
-    (buffer-substring-no-properties (match-beginning match) (match-end match))))
+;; Evaluate the defsubst at compile time, so that the byte compiler
+;; knows the definition and can inline calls.  It cannot detect the
+;; defsubst automatically from within the if form.
+(eval-and-compile
+  (if (fboundp 'match-string-no-properties)
+      (defalias 'svn-match-string-no-properties 'match-string-no-properties)
+    (defsubst svn-match-string-no-properties (match)
+      (buffer-substring-no-properties (match-beginning match) (match-end match)))))
+
+;; XEmacs 21.4.17 does not have an `alist' widget.  Define a replacement.
+;; To find out whether the `alist' widget exists, we cannot check just
+;; (get 'alist 'widget-type), because GNU Emacs 21.4 defines it in
+;; "wid-edit.el", which is not preloaded; it will be autoloaded when
+;; `widget-create' is called.  Instead, we call `widgetp', which is
+;; also autoloaded from "wid-edit.el".  XEmacs 21.4.17 does not have
+;; `widgetp' either, so we check that first.
+(if (and (fboundp 'widgetp) (widgetp 'alist))
+    (define-widget 'svn-alist 'alist
+      "An association list.
+Use this instead of `alist', for XEmacs 21.4 compatibility.")
+  (define-widget 'svn-alist 'list
+    "An association list.
+Use this instead of `alist', for XEmacs 21.4 compatibility."
+    :convert-widget 'svn-alist-convert-widget
+    :tag "Association List"
+    :key-type 'sexp
+    :value-type 'sexp)
+  (defun svn-alist-convert-widget (widget)
+    (let* ((value-type (widget-get widget :value-type))
+           (option-widgets (loop for option in (widget-get widget :options)
+                             collect `(cons :format "%v"
+                                            (const :format "%t: %v\n"
+                                                   :tag "Key"
+                                                   ,option)
+                                            ,value-type))))
+      (widget-put widget :args
+                  `(,@(when option-widgets
+                        `((set :inline t :format "%v"
+                               , at option-widgets)))
+                    (editable-list :inline t
+                                   (cons :format "%v"
+                                         ,(widget-get widget :key-type)
+                                         ,value-type)))))
+    widget))
 
 (defvar svn-global-keymap nil "Global keymap for psvn.el.
 To bind this to a different key, customize `svn-status-prefix-key'.")
@@ -521,6 +671,14 @@
      '(documentation-property 'svn-global-keymap 'variable-documentation t))
 
 
+;; named after SVN_WC_ADM_DIR_NAME in svn_wc.h
+(defun svn-wc-adm-dir-name ()
+  "Return the name of the \".svn\" subdirectory or equivalent."
+  (if (and (eq system-type 'windows-nt)
+           (getenv "SVN_ASP_DOT_NET_HACK"))
+      "_svn"
+    ".svn"))
+
 (defun svn-status-message (level &rest args)
   "If LEVEL is lower than `svn-status-debug-level' print ARGS using `message'.
 
@@ -534,24 +692,25 @@
 (defun svn-status-flatten-list (list)
   "Flatten any lists within ARGS, so that there are no sublists."
   (loop for item in list
-	if (listp item) nconc (svn-status-flatten-list item)
-	else collect item))
+        if (listp item) nconc (svn-status-flatten-list item)
+        else collect item))
 
 (defvar svn-status-display-new-status-buffer nil)
 ;;;###autoload
 (defun svn-status (dir &optional arg)
   "Examine the status of Subversion working copy in directory DIR.
 If ARG then pass the -u argument to `svn status'."
-  (interactive (list (read-directory-name "SVN status directory: "
-                                          nil default-directory nil)
+  (interactive (list (svn-read-directory-name "SVN status directory: "
+                                              nil default-directory nil)
                      current-prefix-arg))
   (setq arg (svn-status-possibly-negate-meaning-of-arg arg 'svn-status))
   (unless (file-directory-p dir)
     (error "%s is not a directory" dir))
-  (if (not (file-exists-p (concat dir "/.svn/")))
+  (if (not (file-exists-p (concat dir "/" (svn-wc-adm-dir-name) "/")))
       (when (y-or-n-p
              (concat dir
-                     " does not seem to be a Subversion working copy (no .svn directory).  "
+                     " does not seem to be a Subversion working copy (no "
+                     (svn-wc-adm-dir-name) " directory).  "
                      "Run dired instead? "))
         (dired dir))
     (setq dir (file-name-as-directory dir))
@@ -712,7 +871,8 @@
                     (svn-status-unset-all-usermarks))
                   (svn-status-update-with-command-list (svn-status-parse-commit-output))
                   (run-hooks 'svn-log-edit-done-hook)
-                  (setq svn-status-files-to-commit nil)
+                  (setq svn-status-files-to-commit nil
+                        svn-status-recursive-commit nil)
                   (message "svn commit finished"))
                  ((eq svn-process-cmd 'update)
                   (svn-status-show-process-output 'update t)
@@ -787,10 +947,33 @@
       (string-to-number str)
     -1))
 
+(defsubst svn-status-make-ui-status ()
+  "Make a ui-status structure for a file in a svn working copy.
+The initial values in the structure returned by this function
+are good for a file or directory that the user hasn't seen before.
+
+The ui-status structure keeps track of how the file or directory
+should be displayed in svn-status mode.  Updating the svn-status
+buffer from the working copy preserves the ui-status if possible.
+User commands modify this structure; each file or directory must
+thus have its own copy.
+
+Currently, the ui-status is a list (USER-MARK USER-ELIDE).
+USER-MARK is non-nil iff the user has marked the file or directory,
+  typically with `svn-status-set-user-mark'.  To read USER-MARK,
+  call `svn-status-line-info->has-usermark'.
+USER-ELIDE is non-nil iff the user has elided the file or directory
+  from the svn-status buffer, typically with `svn-status-toggle-elide'.
+  To read USER-ELIDE, call `svn-status-line-info->user-elide'.
+
+Call `svn-status-line-info->ui-status' to access the whole ui-status
+structure."
+  (list nil nil))
 
 (defun svn-status-make-dummy-dirs (dir-list old-ui-information)
   (append (mapcar (lambda (dir)
-                    (list (or (gethash dir old-ui-information) (list nil nil))
+                    (list (or (gethash dir old-ui-information)
+                              (svn-status-make-ui-status))
                           32 nil dir -1 -1 "?" nil nil nil nil))
                   dir-list)
           svn-status-info))
@@ -802,8 +985,6 @@
   (setq svn-status-head-revision nil)
   (save-excursion
     (let ((old-ui-information (svn-status-ui-information-hash-table))
-          (line-string)
-          (user-mark)
           (svn-marks)
           (svn-file-mark)
           (svn-property-mark)
@@ -816,8 +997,6 @@
           (author)
           (path)
           (dir)
-          (user-elide nil)
-          (ui-status '(nil nil))     ; contains (user-mark user-elide)
           (revision-width svn-status-default-revision-width)
           (author-width svn-status-default-author-width)
           (svn-marks-length (if (and svn-status-verbose svn-status-remote)
@@ -828,7 +1007,7 @@
       (goto-char (point-min))
       (while (< (point) (point-max))
         (cond
-         ((= (point-at-eol) (point-at-bol)) ;skip blank lines
+         ((= (svn-point-at-eol) (svn-point-at-bol)) ;skip blank lines
           nil)
          ((looking-at "Status against revision:[ ]+\\([0-9]+\\)")
           ;; the above message appears for the main listing plus once for each svn:externals entry
@@ -881,8 +1060,8 @@
               (let ((dirname (directory-file-name dir)))
                 (if (not (member dirname dir-set))
                     (setq dir-set (cons dirname dir-set)))))
-          (setq ui-status (or (gethash path old-ui-information) (list user-mark user-elide)))
-          (setq svn-status-info (cons (list ui-status
+          (setq svn-status-info (cons (list (or (gethash path old-ui-information)
+                                                (svn-status-make-ui-status))
                                             svn-file-mark
                                             svn-property-mark
                                             path
@@ -1010,6 +1189,7 @@
   (define-key svn-status-mode-map (kbd "c") 'svn-status-commit)
   (define-key svn-status-mode-map (kbd "M-c") 'svn-status-cleanup)
   (define-key svn-status-mode-map (kbd "U") 'svn-status-update-cmd)
+  (define-key svn-status-mode-map (kbd "M-u") 'svn-status-update-cmd)
   (define-key svn-status-mode-map (kbd "r") 'svn-status-revert)
   (define-key svn-status-mode-map (kbd "l") 'svn-status-show-svn-log)
   (define-key svn-status-mode-map (kbd "i") 'svn-status-info)
@@ -1281,7 +1461,10 @@
   (mouse-set-point event)
   (svn-status-find-file-or-examine-directory))
 
-(defun svn-status-line-info->ui-status (line-info) (nth 0 line-info))
+(defun svn-status-line-info->ui-status (line-info)
+  "Return the ui-status structure of LINE-INFO.
+See `svn-status-make-ui-status' for information about the ui-status."
+  (nth 0 line-info))
 
 (defun svn-status-line-info->has-usermark (line-info) (nth 0 (nth 0 line-info)))
 (defun svn-status-line-info->user-elide (line-info) (nth 1 (nth 0 line-info)))
@@ -1475,7 +1658,7 @@
           (progn
             (goto-char fname-pos)
             (svn-status-goto-file-name fname)
-            (goto-char (+ column (point-at-bol))))
+            (goto-char (+ column (svn-point-at-bol))))
         (goto-char (+ (next-overlay-change (point-min)) svn-status-default-column))))))
 
 (defun svn-status-annotate-status-buffer-entry (action line-info)
@@ -1502,7 +1685,7 @@
       (svn-status-line-info->set-filemark line-info ? )
       (svn-status-line-info->set-propmark line-info ? ))
     (let ((buffer-read-only nil))
-      (delete-region (point-at-bol) (point-at-eol))
+      (delete-region (svn-point-at-bol) (svn-point-at-eol))
       (svn-insert-line-in-status-buffer line-info)
       (backward-char 1)
       (when tag-string
@@ -1528,7 +1711,7 @@
       (setq svn-status-commit-rev-number nil)
       (setq skip nil) ; set to t whenever we find a line not about a committed file
       (while (< (point) (point-max))
-        (cond ((= (point-at-eol) (point-at-bol)) ;skip blank lines
+        (cond ((= (svn-point-at-eol) (svn-point-at-bol)) ;skip blank lines
                (setq skip t))
               ((looking-at "Sending")
                (setq action 'committed))
@@ -1540,7 +1723,7 @@
                (setq skip t))
               ((looking-at "Committed revision \\([0-9]+\\)")
                (setq svn-status-commit-rev-number
-                     (string-to-number (match-string-no-properties 1)))
+                     (string-to-number (svn-match-string-no-properties 1)))
                (setq skip t))
               (t ;; this should never be needed(?)
                (setq action 'unknown)))
@@ -1550,7 +1733,7 @@
             ;; when the commit used . as argument, delete the trailing directory
             ;; from the svn output
             (search-forward "/" nil t))
-          (setq name (buffer-substring-no-properties (point) (point-at-eol)))
+          (setq name (buffer-substring-no-properties (point) (svn-point-at-eol)))
           (setq result (cons (list name action)
                              result))
           (setq skip nil))
@@ -1570,7 +1753,7 @@
           (result))
       (goto-char (point-min))
       (while (< (point) (point-max))
-        (cond ((= (point-at-eol) (point-at-bol)) ;skip blank lines
+        (cond ((= (svn-point-at-eol) (svn-point-at-bol)) ;skip blank lines
                (setq skip t))
               ((looking-at "A")
                (setq action 'added-wc))
@@ -1580,7 +1763,7 @@
                (setq action 'unknown)))
         (unless skip ;found an interesting line
           (forward-char 10)
-          (setq name (buffer-substring-no-properties (point) (point-at-eol)))
+          (setq name (buffer-substring-no-properties (point) (svn-point-at-eol)))
           (setq result (cons (list name action)
                              result))
           (setq skip nil))
@@ -1641,9 +1824,9 @@
                        'svn-status-directory-face
                        'svn-status-filename-face)))
         (elide-hint (if (svn-status-line-info->show-user-elide-continuation line-info) " ..." "")))
-    (puthash (svn-status-line-info->filename line-info)
-             (point)
-             svn-status-filename-to-buffer-position-cache)
+    (svn-puthash (svn-status-line-info->filename line-info)
+                 (point)
+                 svn-status-filename-to-buffer-position-cache)
     (insert (svn-status-maybe-add-face
              (svn-status-line-info->has-usermark line-info)
              (concat usermark
@@ -1749,7 +1932,7 @@
         (progn
           (goto-char fname-pos)
           (svn-status-goto-file-name fname)
-          (goto-char (+ column (point-at-bol))))
+          (goto-char (+ column (svn-point-at-bol))))
       (goto-char (+ (next-overlay-change (point-min)) svn-status-default-column)))))
 
 (defun svn-status-parse-info (arg)
@@ -1775,7 +1958,7 @@
       (goto-char (point-min))
       (let ((case-fold-search t))
         (search-forward "url: "))
-      (setq url (buffer-substring-no-properties (point) (point-at-eol))))
+      (setq url (buffer-substring-no-properties (point) (svn-point-at-eol))))
     (setq svn-status-base-info `((url ,url)))))
 
 (defun svn-status-base-info->url ()
@@ -1813,13 +1996,13 @@
   (interactive "p")
   (next-line nr-of-lines)
   (when (svn-status-get-line-information)
-    (goto-char (+ (point-at-bol) svn-status-default-column))))
+    (goto-char (+ (svn-point-at-bol) svn-status-default-column))))
 
 (defun svn-status-previous-line (nr-of-lines)
   (interactive "p")
   (previous-line nr-of-lines)
   (when (svn-status-get-line-information)
-    (goto-char (+ (point-at-bol) svn-status-default-column))))
+    (goto-char (+ (svn-point-at-bol) svn-status-default-column))))
 
 (defun svn-status-dired-jump ()
   "Jump to a dired buffer, containing the file at point."
@@ -1983,7 +2166,7 @@
               (save-excursion
                 (let ((buffer-read-only nil))
                   (goto-line current-line)
-                  (delete-region (point-at-bol) (point-at-eol))
+                  (delete-region (svn-point-at-bol) (svn-point-at-eol))
                   (svn-insert-line-in-status-buffer (car st-info))
                   (delete-char 1)))
               (message "%s %s" (if set-mark "Marked" "Unmarked") i-fname)))))
@@ -2135,13 +2318,22 @@
 (defun svn-status-marked-file-names ()
   (mapcar 'svn-status-line-info->filename (svn-status-marked-files)))
 
+(defun svn-status-some-files-marked-p ()
+  "Return non-nil iff a file has been marked by `svn-status-set-user-mark'.
+Unlike `svn-status-marked-files', this does not select the file under point
+if no files have been marked."
+  ;; `some' would be shorter but requires cl-seq at runtime.
+  ;; (Because it accepts both lists and vectors, it is difficult to inline.)
+  (loop for file in svn-status-info
+        thereis (svn-status-line-info->has-usermark file)))
+
 (defun svn-status-ui-information-hash-table ()
   (let ((st-info svn-status-info)
         (svn-status-ui-information (make-hash-table :test 'equal)))
     (while st-info
-      (puthash (svn-status-line-info->filename (car st-info))
-               (svn-status-line-info->ui-status (car st-info))
-               svn-status-ui-information)
+      (svn-puthash (svn-status-line-info->filename (car st-info))
+                   (svn-status-line-info->ui-status (car st-info))
+                   svn-status-ui-information)
       (setq st-info (cdr st-info)))
     svn-status-ui-information))
 
@@ -2158,7 +2350,7 @@
     (insert postfix))))
 
 (defun svn-status-show-process-buffer-internal (&optional scroll-to-top)
-  (when (eq (current-buffer) svn-status-buffer-name)
+  (when (string= (buffer-name) svn-status-buffer-name)
     (delete-other-windows))
   (pop-to-buffer "*svn-process*")
   (when svn-status-wash-control-M-in-process-buffers
@@ -2199,21 +2391,19 @@
   "Run `svn log' on selected files.
 The output is put into the *svn-log* buffer
 The optional prefix argument ARG determines which switches are passed to `svn log':
- no prefix               --- use whatever is in the string `svn-status-default-log-arguments'
+ no prefix               --- use whatever is in the list `svn-status-default-log-arguments'
  prefix argument of -1   --- use no arguments
  prefix argument of 0:   --- use the -q switch (quiet)
  other prefix arguments: --- use the -v switch (verbose)
 
 See `svn-status-marked-files' for what counts as selected."
   (interactive "P")
-  (let ((switch (cond ((eq arg 0) "-q")
-                      ((eq arg -1) "")
-                      (arg        "-v")
-                      (t          svn-status-default-log-arguments))))
+  (let ((switches (cond ((eq arg 0)  '("-q"))
+                        ((eq arg -1) '())
+                        (arg         '("-v"))
+                        (t           svn-status-default-log-arguments))))
     (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
-    (if (> (length switch) 0)
-        (svn-run-svn t t 'log "log" "--targets" svn-status-temp-arg-file switch)
-      (svn-run-svn t t 'log "log" "--targets" svn-status-temp-arg-file))
+    (svn-run-svn t t 'log "log" "--targets" svn-status-temp-arg-file switches)
     (save-excursion
       (set-buffer "*svn-process*")
       (svn-log-view-mode))))
@@ -2234,35 +2424,48 @@
 
 (defun svn-status-show-svn-diff (arg)
   "Run `svn diff' on the current file.
-If there is a newer revision in the repository, the diff is done against HEAD, otherwise
-compare the working copy with BASE.
+If the current file is a directory, compare it recursively.
+If there is a newer revision in the repository, the diff is done against HEAD,
+otherwise compare the working copy with BASE.
 If ARG then prompt for revision to diff against."
   (interactive "P")
   (svn-status-ensure-cursor-on-file)
-  (svn-status-show-svn-diff-internal arg nil))
+  (svn-status-show-svn-diff-internal (list (svn-status-get-line-information)) t
+                                     (if arg :ask :auto)))
 
 (defun svn-status-show-svn-diff-for-marked-files (arg)
   "Run `svn diff' on all selected files.
-See `svn-status-marked-files' for what counts as selected.
+If some files have been marked, compare those non-recursively;
+this is because marking a directory with \\[svn-status-set-user-mark]
+normally marks all of its files as well.
+If no files have been marked, compare recursively the file at point.
 If ARG then prompt for revision to diff against, else compare working copy with BASE."
   (interactive "P")
-  (svn-status-show-svn-diff-internal arg t))
-
-(defun svn-status-show-svn-diff-internal (arg &optional use-all-marked-files)
-  (let* ((fl (if use-all-marked-files
-                 (svn-status-marked-files)
-               (list (svn-status-get-line-information))))
-         (clear-buf t)
-         (revision (if arg
-                       (svn-status-read-revision-string "Diff with files for version: " "PREV")
-                     (if use-all-marked-files
-                         "BASE"
-                       (if (svn-status-line-info->update-available (car fl)) "HEAD" "BASE")))))
-    (while fl
+  (svn-status-show-svn-diff-internal (svn-status-marked-files)
+                                     (not (svn-status-some-files-marked-p))
+                                     (if arg :ask "BASE")))
+
+(defun svn-status-show-svn-diff-internal (line-infos recursive revision)
+  ;; REVISION must be one of:
+  ;; - a string: whatever the -r option allows.
+  ;; - `:ask': asks the user to specify the revision, which then becomes
+  ;;   saved in `minibuffer-history' rather than in `command-history'.
+  ;; - `:auto': use "HEAD" if an update is known to exist, "BASE" otherwise.
+  ;; In the future, `nil' might mean omit the -r option entirely;
+  ;; but that currently seems to imply "BASE", so we just use that.
+  (when (eq revision :ask)
+    (setq revision (svn-status-read-revision-string
+                    "Diff with files for version: " "PREV")))
+  (let ((clear-buf t))
+    (dolist (line-info line-infos)
       (svn-run-svn nil clear-buf 'diff "diff" svn-status-default-diff-arguments
-                   "-r" revision (svn-status-line-info->filename (car fl)))
-      (setq clear-buf nil)
-      (setq fl (cdr fl))))
+                   "-r" (if (eq revision :auto)
+                            (if (svn-status-line-info->update-available line-info)
+                                "HEAD" "BASE")
+                          revision)
+                   (unless recursive "--non-recursive")
+                   (svn-status-line-info->filename line-info))
+      (setq clear-buf nil)))
   (svn-status-diff-mode))
 
 (defun svn-status-diff-mode ()
@@ -2270,8 +2473,9 @@
   (svn-status-show-process-output 'diff t)
   (save-excursion
     (set-buffer svn-status-last-output-buffer-name)
-    (diff-mode)
-    (font-lock-fontify-buffer)
+    (when (fboundp 'diff-mode) ;not in GNU Emacs 20.7
+      (diff-mode)
+      (font-lock-fontify-buffer))
     (setq buffer-read-only t)))
 
 (defun svn-status-show-process-buffer ()
@@ -2331,7 +2535,6 @@
   (interactive)
   (let* ((marked-files (svn-status-marked-files))
          (num-of-files (length marked-files))
-         original
          dest)
     (if (= 1 num-of-files)
         ;; one file to rename, prompt for new name, or directory to move the
@@ -2340,8 +2543,8 @@
                                            (svn-status-line-info->filename (car marked-files)))
                                    (svn-status-directory-containing-point t)))
       ;;multiple files selected, so prompt for existing directory to mv them into.
-      (setq dest (read-directory-name (format "Move %d files to directory: " num-of-files)
-                                      (svn-status-directory-containing-point t) nil t))
+      (setq dest (svn-read-directory-name (format "Move %d files to directory: " num-of-files)
+                                          (svn-status-directory-containing-point t) nil t))
       (unless (file-directory-p dest)
         (error "%s is not a directory" dest)))
     (when (string= dest "")
@@ -2365,10 +2568,10 @@
 ;;              ;; run  svn-status-set-user-mark   to remark dir
 ;;              ;; maybe check for local mods here, and unmark if user does't say --force?
 ;;              ))
-        (dolist (original marked-files)
+    (dolist (original marked-files)
       (let ((original-name (svn-status-line-info->filename original))
-                        (original-filemarks (svn-status-line-info->filemark original))
-                        (original-propmarks (svn-status-line-info->propmark original)))
+            (original-filemarks (svn-status-line-info->filemark original))
+            (original-propmarks (svn-status-line-info->propmark original)))
         (cond
          ((or (eq original-filemarks 77)  ;;original has local mods: maybe do `svn mv --force'
               (eq original-propmarks 77)) ;;original has local prop mods: maybe do `svn mv --force'
@@ -2435,10 +2638,15 @@
 
 (defun svn-status-commit ()
   "Commit selected files.
-See `svn-status-marked-files' for what counts as selected."
-  (interactive)
-  (let* ((marked-files (svn-status-marked-files)))
-    (setq svn-status-files-to-commit marked-files)
+If some files have been marked, commit those non-recursively;
+this is because marking a directory with \\[svn-status-set-user-mark]
+normally marks all of its files as well.
+If no files have been marked, commit recursively the file at point."
+  (interactive)
+  (let* ((selected-files (svn-status-marked-files))
+         (marked-files-p (svn-status-some-files-marked-p)))
+    (setq svn-status-files-to-commit selected-files
+          svn-status-recursive-commit (not marked-files-p))
     (svn-log-edit-show-files-to-commit)
     (svn-status-pop-to-commit-buffer)
     (when svn-log-edit-insert-files-to-commit
@@ -2537,7 +2745,7 @@
                   (if pos
                       (progn
                         (goto-char pos)
-                        (delete-region (point-at-bol) (point-at-eol))
+                        (delete-region (svn-point-at-bol) (svn-point-at-eol))
                         (svn-insert-line-in-status-buffer (car st-info))
                         (delete-char 1))
                     (message "psvn: file %s not found, updating %s buffer content..."
@@ -2557,34 +2765,77 @@
 The older revisions are stored in backup files named F.~REVISION~.
 
 When the function is called without a prefix argument: get all marked files.
-Otherwise get only the actual file."
+With a prefix argument: get only the actual file."
   (interactive "P")
-  (svn-status-get-specific-revision-internal (not arg) t))
+  (svn-status-get-specific-revision-internal
+   (svn-status-get-file-list (not arg))
+   :ask))
+
+(defun svn-status-get-specific-revision-internal (line-infos revision)
+  "Retrieve older revisions of files.
+LINE-INFOS is a list of line-info structures (see
+`svn-status-get-line-information').
+REVISION is one of:
+- a string: whatever the -r option allows.
+- `:ask': asks the user to specify the revision, which then becomes
+  saved in `minibuffer-history' rather than in `command-history'.
+- `:auto': Use \"HEAD\" if an update is known to exist, \"BASE\" otherwise.
+
+After the call, `svn-status-get-revision-file-info' will be an alist
+\((WORKING-FILE-NAME . RETRIEVED-REVISION-FILE-NAME) ...).  These file
+names are relative to the directory where `svn-status' was run."
+  ;; In `svn-status-show-svn-diff-internal', there is a comment
+  ;; that REVISION `nil' might mean omitting the -r option entirely.
+  ;; That doesn't seem like a good idea with svn cat.
+  ;;
+  ;; TODO: Return the alist, instead of storing it in a variable.
 
-(defun svn-status-get-specific-revision-internal (&optional only-actual-file arg)
-  (let* ((file-names (if only-actual-file
-                         (list (svn-status-line-info->filename (svn-status-get-line-information)))
-                       (svn-status-marked-file-names)))
-         (revision (if arg (svn-status-read-revision-string "Get files for version: " "PREV") "BASE"))
-         (file-name)
-         (file-name-with-revision))
-    (message "Getting revision %s for %S" revision file-names)
-    (setq svn-status-get-specific-revision-file-info nil)
-    (while file-names
-      (setq file-name (car file-names))
-      (setq file-name-with-revision (concat file-name ".~" revision "~"))
-      (add-to-list 'svn-status-get-specific-revision-file-info
-                   (cons file-name file-name-with-revision))
+  (when (eq revision :ask)
+    (setq revision (svn-status-read-revision-string
+                    "Get files for version: " "PREV")))
+
+  (let ((count (length line-infos)))
+    (if (= count 1)
+        (let ((line-info (car line-infos)))
+          (message "Getting revision %s of %s"
+                   (if (eq revision :auto)
+                       (if (svn-status-line-info->update-available line-info)
+                           "HEAD" "BASE")
+                     revision)
+                   (svn-status-line-info->filename line-info)))
+      ;; We could compute "Getting HEAD of 8 files and BASE of 11 files"
+      ;; but that'd be more bloat than it's worth.
+      (message "Getting revision %s of %d files"
+               (if (eq revision :auto) "HEAD or BASE" revision)
+               count)))
+
+  (setq svn-status-get-specific-revision-file-info '())
+  (dolist (line-info line-infos)
+    (let* ((revision (if (eq revision :auto)
+                         (if (svn-status-line-info->update-available line-info)
+                             "HEAD" "BASE")
+                       revision))       ;must be a string by this point
+           (file-name (svn-status-line-info->filename line-info))
+           ;; If REVISION is e.g. "HEAD", should we find out the actual
+           ;; revision number and save "foo.~123~" rather than "foo.~HEAD~"?
+           ;; OTOH, `auto-mode-alist' already ignores ".~HEAD~" suffixes,
+           ;; and if users often want to know the revision numbers of such
+           ;; files, they can use svn:keywords.
+           (file-name-with-revision (concat file-name ".~" revision "~")))
+      ;; `add-to-list' would unnecessarily check for duplicates.
+      (push (cons file-name file-name-with-revision)
+            svn-status-get-specific-revision-file-info)
       (save-excursion
         (let ((content
                (with-temp-buffer
                  (if (string= revision "BASE")
                      (insert-file-contents (concat (file-name-directory file-name)
-                                                   ".svn/text-base/"
+                                                   (svn-wc-adm-dir-name)
+                                                   "/text-base/"
                                                    (file-name-nondirectory file-name)
                                                    ".svn-base"))
                    (progn
-                     (svn-run-svn nil t 'cat (append (list "cat" "-r" revision) (list file-name)))
+                     (svn-run-svn nil t 'cat "cat" "-r" revision file-name)
                      ;;todo: error processing
                      ;;svn: Filesystem has no item
                      ;;svn: file not found: revision `15', path `/trunk/file.txt'
@@ -2592,21 +2843,22 @@
                  (buffer-string))))
           (find-file file-name-with-revision)
           (setq buffer-read-only nil)
-          (delete-region (point-min) (point-max))
+          (erase-buffer)  ;Widen, because we'll save the whole buffer.
           (insert content)
-          (save-buffer)))
-      (setq file-names (cdr file-names)))
-    (setq svn-status-get-specific-revision-file-info
-      (nreverse svn-status-get-specific-revision-file-info))
-    (message "svn-status-get-specific-revision-file-info: %S"
-             svn-status-get-specific-revision-file-info)))
+          (save-buffer)))))
+  (setq svn-status-get-specific-revision-file-info
+        (nreverse svn-status-get-specific-revision-file-info))
+  (message "svn-status-get-specific-revision-file-info: %S"
+           svn-status-get-specific-revision-file-info))
 
 
 (defun svn-status-ediff-with-revision (arg)
   "Run ediff on the current file with a previous revision.
 If ARG then prompt for revision to diff against."
   (interactive "P")
-  (svn-status-get-specific-revision-internal t arg)
+  (svn-status-get-specific-revision-internal
+   (list (svn-status-get-line-information))
+   (if arg :ask :auto))
   (let* ((ediff-after-quit-destination-buffer (current-buffer))
          (my-buffer (find-file-noselect (caar svn-status-get-specific-revision-file-info)))
          (base-buff (find-file-noselect (cdar svn-status-get-specific-revision-file-info)))
@@ -2677,6 +2929,7 @@
       (message "No valid file selected - No property listing possible"))))
 
 (defun svn-status-proplist-start ()
+  (svn-status-ensure-cursor-on-file)
   (svn-run-svn t t 'proplist-parse "proplist" (svn-status-line-info->filename
                                                (svn-status-get-line-information))))
 (defun svn-status-property-edit-one-entry (arg)
@@ -2700,7 +2953,6 @@
   ;(svn-status-show-process-buffer-internal t)
   (message "svn-status-property-parse-property-names")
   (let ((pl)
-        (pfl)
         (prop-name)
         (prop-value))
     (save-excursion
@@ -2768,6 +3020,8 @@
     (setq svn-status-propedit-file-list file-info-list)
     (setq svn-status-pre-propedit-window-configuration (current-window-configuration))
     (pop-to-buffer commit-buffer)
+    ;; If the buffer has been narrowed, `svn-prop-edit-done' will use
+    ;; only the accessible part.  So we need not erase the rest here.
     (delete-region (point-min) (point-max))
     (setq default-directory dir)
     (insert prop-value)
@@ -2789,6 +3043,8 @@
   "Set a property on a given file list."
   (save-excursion
     (set-buffer (get-buffer-create "*svn-property-edit*"))
+    ;; If the buffer has been narrowed, `svn-prop-edit-do-it' will use
+    ;; only the accessible part.  So we need not erase the rest here.
     (delete-region (point-min) (point-max))
     (insert prop-value))
   (setq svn-status-propedit-file-list (svn-status-marked-files))
@@ -2969,7 +3225,9 @@
 (defun svn-prop-edit-svn-diff (arg)
   (interactive "P")
   (set-buffer svn-status-buffer-name)
-  (svn-status-show-svn-diff-for-marked-files arg))
+  ;; Because propedit is not recursive in our use, neither is this diff.
+  (svn-status-show-svn-diff-internal svn-status-propedit-file-list nil
+                                     (if arg :ask "BASE")))
 
 (defun svn-prop-edit-svn-log (arg)
   (interactive "P")
@@ -3068,8 +3326,11 @@
                  (string= "." (svn-status-line-info->filename (car svn-status-files-to-commit)))))
       (svn-status-create-arg-file svn-status-temp-arg-file ""
                                   svn-status-files-to-commit "")
-      (svn-run-svn t t 'commit "commit" "--targets" svn-status-temp-arg-file
-                   "-F" svn-status-temp-file-to-remove))
+      (svn-run-svn t t 'commit "commit"
+                   (unless svn-status-recursive-commit "--non-recursive")
+                   "--targets" svn-status-temp-arg-file
+                   "-F" svn-status-temp-file-to-remove
+                   svn-status-default-commit-arguments))
     (set-window-configuration svn-status-pre-commit-window-configuration)
     (message "svn-log editing done")))
 
@@ -3077,8 +3338,12 @@
   "Show the diff we are about to commit.
 If ARG then show diff between some other version of the selected files."
   (interactive "P")
-  (set-buffer svn-status-buffer-name)
-  (svn-status-show-svn-diff-for-marked-files arg))
+  (set-buffer svn-status-buffer-name)   ; TODO: is this necessary?
+  ;; This call is very much like `svn-status-show-svn-diff-for-marked-files'
+  ;; but uses commit-specific variables instead of the current marks.
+  (svn-status-show-svn-diff-internal svn-status-files-to-commit
+                                     svn-status-recursive-commit
+                                     (if arg :ask "BASE")))
 
 (defun svn-log-edit-svn-log (arg)
   (interactive "P")
@@ -3095,7 +3360,9 @@
 
 (defun svn-log-edit-show-files-to-commit ()
   (interactive)
-  (message "Files to commit: %S" (svn-log-edit-files-to-commit)))
+  (message "Files to commit%s: %S"
+           (if svn-status-recursive-commit " recursively" "")
+           (svn-log-edit-files-to-commit)))
 
 (defun svn-log-edit-save-message ()
   "Save the current log message to the file `svn-log-edit-file-name'."
@@ -3115,7 +3382,8 @@
     (save-excursion
       (goto-char (point-min))
       (insert "## Lines starting with '## ' will be removed from the log message.\n")
-      (insert "## File(s) to commit:\n")
+      (insert "## File(s) to commit"
+              (if svn-status-recursive-commit " recursively" "") ":\n")
       (let ((file-list svn-status-files-to-commit))
         (while file-list
           (insert (concat "## " (svn-status-line-info->filename (car file-list)) "\n"))
@@ -3178,7 +3446,7 @@
 (defun svn-log-revision-at-point ()
   (save-excursion
     (re-search-backward "^r\\([0-9]+\\)")
-    (match-string-no-properties 1)))
+    (svn-match-string-no-properties 1)))
 
 (defun svn-log-view-diff (arg)
   "Show the changeset for a given log entry.
@@ -3204,6 +3472,8 @@
                             (buffer-substring (point-min) (- (point-max) 1))
                           "")))
     (svn-status-pop-to-commit-buffer)
+    ;; If the buffer has been narrowed, `svn-log-edit-done' will use
+    ;; only the accessible part.  So we need not erase the rest here.
     (delete-region (point-min) (point-max))
     (insert log-message)
     (goto-char (point-min))
@@ -3217,18 +3487,18 @@
   (let ((base-dir (expand-file-name default-directory))
         (dot-svn-dir)
         (dir-below (expand-file-name default-directory)))
-    (setq dot-svn-dir (concat base-dir ".svn"))
+    (setq dot-svn-dir (concat base-dir (svn-wc-adm-dir-name)))
     (while (when (and dir-below (file-exists-p dot-svn-dir))
              (setq base-dir (file-name-directory dot-svn-dir))
              (string-match "\\(.+/\\).+/" dir-below)
              (setq dir-below (match-string 1 dir-below))
-             (setq dot-svn-dir (concat dir-below ".svn"))))
+             (setq dot-svn-dir (concat dir-below (svn-wc-adm-dir-name)))))
     base-dir))
 
 (defun svn-status-save-state ()
   (interactive)
   (let ((buf (find-file (concat (svn-status-base-dir) "++psvn.state"))))
-    (delete-region (point-min) (point-max))
+    (erase-buffer)        ;Widen, because we'll save the whole buffer.
     (setq svn-status-options
           (list
            (list "svn-trac-project-root" svn-trac-project-root)
@@ -3442,4 +3712,7 @@
 
 (provide 'psvn)
 
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
 ;;; psvn.el ends here


Index: subversion.spec
===================================================================
RCS file: /cvs/dist/rpms/subversion/devel/subversion.spec,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- subversion.spec	10 Nov 2005 13:00:18 -0000	1.58
+++ subversion.spec	2 Dec 2005 11:20:27 -0000	1.59
@@ -18,7 +18,7 @@
 Summary: Modern Version Control System designed to replace CVS
 Name: subversion
 Version: 1.2.3
-Release: 4
+Release: 5
 License: BSD
 Group: Development/Tools
 URL: http://subversion.tigris.org/
@@ -32,7 +32,7 @@
 Patch6: subversion-1.0.3-pie.patch
 Patch7: subversion-1.1.3-java.patch
 BuildRequires: autoconf, libtool, python, python-devel, texinfo, which
-BuildRequires: db4-devel >= 4.1.25, swig >= 1.3.20-1, docbook-style-xsl
+BuildRequires: db4-devel >= 4.1.25, swig >= 1.3.24, docbook-style-xsl
 BuildRequires: apr-devel >= 0.9.6-1, apr-util-devel >= 0.9.5-1
 BuildRequires: neon-devel >= 0:0.24.7-1
 BuildRoot: %{_tmppath}/%{name}-root
@@ -250,6 +250,9 @@
 %endif
 
 %changelog
+* Fri Dec  2 2005 Joe Orton <jorton at redhat.com> 1.2.3-5
+- rebuild for httpd-2.2/apr-1.2/apr-util-1.2
+
 * Thu Nov 10 2005 Tomas Mraz <tmraz at redhat.com> 1.2.3-4
 - rebuilt against new openssl
 




More information about the fedora-cvs-commits mailing list