rpms/subversion/devel subversion-1.5.3.tar.gz.asc, NONE, 1.1 .cvsignore, 1.25, 1.26 psvn.el, 1.8, 1.9 sources, 1.32, 1.33 subversion.spec, 1.123, 1.124 upstream, 1.18, 1.19

Joe Orton jorton at fedoraproject.org
Mon Oct 13 09:49:55 UTC 2008


Author: jorton

Update of /cvs/extras/rpms/subversion/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv3692

Modified Files:
	.cvsignore psvn.el sources subversion.spec upstream 
Added Files:
	subversion-1.5.3.tar.gz.asc 
Log Message:
* Mon Oct 13 2008 Joe Orton <jorton at redhat.com> 1.5.3-2
- update to 1.5.3 (#466674)
- update psvn.el to r33557



--- NEW FILE subversion-1.5.3.tar.gz.asc ---
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBI7Y4MCwOubk4kUXwRApWvAKDV/bGoUIh8BGZpXmC5esCrZPaJpQCeOJ5b
5DIq+fMMkT+MdkzurImGZ7g=
=c5Pp
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iD8DBQBI7eIDNR8z5DU+JbwRAu2MAJ9zbxncg+HinohwP5Ar+kKOIcoB6QCbBsiB
bLlGmJiG9HmPCzg19sGwXtk=
=smmB
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEABECAAYFAkjvYhQACgkQ/P1jBZgh97Jr8gCbBgK1YupuALSuJCs+FT4uIOyM
jwYAn3hystxtjbJS7p7q3mTR36BpEtwo
=LaHL
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBI7wms9o1G+2zNQDgRAjmnAJ4iaMgPTOytDHd2NOw2FW+B/zCr3wCgrlCj
+egZQjk1zwPmNHuGdIiwvBA=
=IFK3
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Darwin)

iEYEABECAAYFAkjvfkwACgkQJl34oANalqkVqQCgguM0c7CvRQZXq46KGG9n4zfZ
25kAoL5cSuwQr+tT7P9vm62X18Mv5zLm
=uY5a
-----END PGP SIGNATURE-----


Index: .cvsignore
===================================================================
RCS file: /cvs/extras/rpms/subversion/devel/.cvsignore,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- .cvsignore	12 Sep 2008 16:10:42 -0000	1.25
+++ .cvsignore	13 Oct 2008 09:49:23 -0000	1.26
@@ -1 +1 @@
-subversion-1.5.2.tar.gz
+subversion-1.5.3.tar.gz


Index: psvn.el
===================================================================
RCS file: /cvs/extras/rpms/subversion/devel/psvn.el,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- psvn.el	5 Dec 2007 19:51:30 -0000	1.8
+++ psvn.el	13 Oct 2008 09:49:23 -0000	1.9
@@ -1,5 +1,5 @@
 ;;; psvn.el --- Subversion interface for emacs
-;; Copyright (C) 2002-2007 by Stefan Reichoer
+;; Copyright (C) 2002-2008 by Stefan Reichoer
 
 ;; Author: Stefan Reichoer <stefan at xsteve.at>
 ;; $Id$
@@ -66,6 +66,8 @@
 ;; ~     - svn-status-get-specific-revision
 ;; E     - svn-status-ediff-with-revision
 ;; X X   - svn-status-resolve-conflicts
+;; S g   - svn-status-grep-files
+;; S s   - svn-status-search-files
 ;; s     - svn-status-show-process-buffer
 ;; h     - svn-status-pop-to-partner-buffer
 ;; e     - svn-status-toggle-edit-cmd-flag
@@ -80,10 +82,13 @@
 ;; * ?   - svn-status-mark-unknown
 ;; * A   - svn-status-mark-added
 ;; * M   - svn-status-mark-modified
+;; * P   - svn-status-mark-modified-properties
 ;; * D   - svn-status-mark-deleted
 ;; * *   - svn-status-mark-changed
 ;; * .   - svn-status-mark-by-file-ext
 ;; * %   - svn-status-mark-filename-regexp
+;; * s   - svn-status-store-usermarks
+;; * l   - svn-status-load-usermarks
 ;; .     - svn-status-goto-root-or-return
 ;; f     - svn-status-find-file
 ;; o     - svn-status-find-file-other-window
@@ -185,6 +190,35 @@
 ;; Trac ticket links can be enabled in the *svn-log* buffers when using the following:
 ;; (setq svn-log-link-handlers '(trac-ticket-short))
 
+;; ---------------------------
+;; Frequently asked questions:
+;; ---------------------------
+
+;; Q1: I need support for user names with blanks/spaces
+;; A1: Add the user names to svn-user-names-including-blanks and set the
+;;     svn-pre-parse-status-hook.
+;;     The problem is, that the user names and the file names from the svn status
+;;     output can both contain blanks. Blanks in file names are supported.
+;;     the svn-user-names-including-blanks list is used to replace the spaces
+;;     in the user names with - to overcome this problem
+
+;; Q2: My svn-update command it taking a really long time. How can I
+;;     see what's going on?
+;; A2: In the *svn-status* buffer press "s".
+
+;; Q3: How do I enter a username and password?
+;; A3: In the *svn-status* buffer press "s", switch to the
+;;     *svn-process* buffer and press enter. You will be prompted for
+;;     username and password.
+
+;; Q4: What does "?", "M", and "C" in the first column of the
+;;     *svn-status* buffer mean?
+;; A4: "?" means the file(s) is not under Subversion control
+;;     "M" means you have a locally modified file
+;;     "C" means there is a conflict
+;;     "@$&#!" means someone is saying nasty things to you
+
+
 ;; Comments / suggestions and bug reports are welcome!
 
 ;; Development notes
@@ -210,6 +244,7 @@
 
 (eval-when-compile (require 'dired))
 (eval-when-compile (require 'ediff-util))
+(eval-when-compile (require 'ediff-wind))
 (eval-when-compile (require 'elp))
 (eval-when-compile (require 'pp))
 
@@ -238,6 +273,10 @@
   "*Insert the filelist to commit in the *svn-log* buffer"
   :type 'boolean
   :group 'psvn)
+(defcustom svn-log-edit-show-diff-for-commit nil
+  "*Show the diff being committed when you run `svn-status-commit.'."
+  :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
@@ -308,6 +347,11 @@
   :type 'boolean
   :group 'psvn)
 
+(defcustom svn-status-fancy-file-state-in-modeline t
+  "*Show a color dot in the modeline that describes the state of the current file."
+  :type 'boolean
+  :group 'psvn)
+
 (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'."
@@ -468,9 +512,21 @@
   :group 'psvn)
 (put 'svn-status-default-diff-arguments 'risky-local-variable t)
 
+(defcustom svn-status-default-status-arguments '()
+  "*A list of arguments that is passed to the svn status command.
+The following options are available: --ignore-externals
+
+"
+  :type '(repeat string)
+  :group 'psvn)
+(put 'svn-status-default-status-arguments 'risky-local-variable t)
+
 (defcustom svn-status-default-blame-arguments '("-x" "--ignore-eol-style")
   "*A list of arguments that is passed to the svn blame command.
-See `svn-status-default-diff-arguments' for some examples.")
+See `svn-status-default-diff-arguments' for some examples."
+  :type '(repeat string)
+  :group 'psvn)
+
 (put 'svn-status-default-blame-arguments 'risky-local-variable t)
 
 (defvar svn-trac-project-root nil
@@ -657,12 +713,14 @@
 (defvar svn-ediff-result)
 (defvar svn-status-last-diff-options nil)
 (defvar svn-status-blame-file-name nil)
+(defvar svn-status-blame-revision nil)
 (defvar svn-admin-last-repository-dir nil "The last repository url for various operations.")
 (defvar svn-last-cmd-ring (make-ring 30) "Ring that holds the last executed svn commands (for debugging purposes)")
 (defvar svn-status-cached-version-string nil)
 (defvar svn-client-version nil "The version number of the used svn client")
 (defvar svn-status-get-line-information-for-file nil)
 (defvar svn-status-base-dir-cache (make-hash-table :test 'equal :weakness nil))
+(defvar svn-status-usermark-storage (make-hash-table :test 'equal :weakness nil))
 (defvar svn-log-registered-link-handlers (make-hash-table :test 'eql :weakness nil))
 
 (defvar svn-status-partner-buffer nil "The partner buffer for this svn related buffer")
@@ -787,6 +845,21 @@
     "Default face for highlighting a line in svn status blame mode."
     :group 'psvn-faces))
 
+(if svn-xemacsp
+    (defface svn-log-partner-highlight-face
+      '((((type tty) (class color)) (:foreground "yellow" :weight light))
+        (((class color) (background light)) (:foreground "gold"))
+        (((class color) (background dark)) (:foreground "gold"))
+        (t (:weight bold)))
+      "Default face for highlighting the partner in svn log mode."
+      :group 'psvn-faces)
+  (defface svn-log-partner-highlight-face
+  '((((class color) (background light))
+     (:background "light goldenrod" :weight bold))
+    (t (:weight bold)))
+    "Default face for highlighting the partner in svn log mode."
+    :group 'psvn-faces))
+
 (defface svn-status-blame-rev-number-face
   '((((class color) (background light)) (:foreground "DarkGoldenrod"))
     (((class color) (background dark)) (:foreground "LightGoldenrod"))
@@ -860,6 +933,11 @@
         (forward-line 0)
         (1+ (count-lines start (point)))))))
 
+(defun svn-substring-no-properties (string &optional from to)
+  (if (fboundp 'substring-no-properties)
+      (substring-no-properties string from to)
+    (substring string from to)))
+
 ; xemacs
 ;; Evaluate the defsubst at compile time, so that the byte compiler
 ;; knows the definition and can inline calls.  It cannot detect the
@@ -906,6 +984,10 @@
                                          ,value-type)))))
     widget))
 
+;; process launch functions
+(defvar svn-call-process-function (if (fboundp 'process-file) 'process-file 'call-process))
+(defvar svn-start-process-function (if (fboundp 'start-file-process) 'start-file-process 'start-process))
+
 
 ;;; keymaps
 
@@ -925,6 +1007,7 @@
   (define-key svn-global-keymap (kbd "f l") 'svn-status-show-svn-log)
   (define-key svn-global-keymap (kbd "f b") 'svn-status-blame)
   (define-key svn-global-keymap (kbd "f a") 'svn-file-add-to-changelog)
+  (define-key svn-global-keymap (kbd "f r") 'svn-file-revert)
   (define-key svn-global-keymap (kbd "c") 'svn-status-commit)
   (define-key svn-global-keymap (kbd "S") 'svn-status-switch-to-status-buffer)
   (define-key svn-global-keymap (kbd "o") 'svn-status-pop-to-status-buffer))
@@ -1075,9 +1158,7 @@
                             (if svn-status-verbose "-v" "")
                           (if svn-status-verbose
                               (if arg "-uv" "-v")
-                            (if arg "-u" ""))))
-         (svn-status-edit-svn-command
-          (or want-edit svn-status-edit-svn-command)))
+                            (if arg "-u" "")))))
     (save-excursion
       (set-buffer status-buf)
       (setq default-directory dir)
@@ -1085,7 +1166,10 @@
       (setq default-directory dir
             svn-status-remote (when arg t))
       (set-buffer cur-buf)
-      (svn-run t t 'status "status" status-option))))
+      (if want-edit
+          (let (svn-status-edit-svn-command t)
+            (svn-run t t 'status "status" svn-status-default-status-arguments status-option))
+        (svn-run t t 'status "status" svn-status-default-status-arguments status-option)))))
 
 (defun svn-status-this-directory (arg)
   "Run `svn-status' for the `default-directory'"
@@ -1098,7 +1182,9 @@
   (let* ((in-status-buffer (eq major-mode 'svn-status-mode))
          (hist (if in-status-buffer (cdr svn-status-directory-history) svn-status-directory-history))
          (dir (funcall svn-status-completing-read-function "svn-status on directory: " hist))
-         (svn-buffer-available (with-current-buffer (get-buffer svn-status-buffer-name) (string= default-directory dir))))
+         (svn-status-buffer (get-buffer svn-status-buffer-name))
+         (svn-buffer-available (and svn-status-buffer
+                                    (with-current-buffer svn-status-buffer-name (string= default-directory dir)))))
     (if (file-directory-p dir)
         (if svn-buffer-available
             (svn-status-switch-to-status-buffer)
@@ -1203,7 +1289,7 @@
                     ;; run on a TTY without $DISPLAY, this will fail; in
                     ;; such cases, the user should start ssh-agent and
                     ;; then run ssh-add explicitly.
-                    (setq svn-proc (apply 'start-process "svn" proc-buf svn-exe arglist)))
+                    (setq svn-proc (apply svn-start-process-function "svn" proc-buf svn-exe arglist)))
                   (when svn-status-svn-process-coding-system
                     (set-process-coding-system svn-proc svn-status-svn-process-coding-system
                                                svn-status-svn-process-coding-system))
@@ -1214,7 +1300,7 @@
               (let ((process-environment (svn-process-environment)))
                 ;; `call-process' ignores `process-connection-type' and
                 ;; never opens a pseudoterminal.
-                (apply 'call-process svn-exe nil proc-buf nil arglist))
+                (apply svn-call-process-function svn-exe nil proc-buf nil arglist))
               (setq svn-status-last-output-buffer-name svn-process-buffer-name)
               (run-hooks 'svn-post-process-svn-output-hook)
               (setq svn-status-mode-line-process-status "")
@@ -1309,7 +1395,9 @@
                   (run-hooks 'svn-log-edit-done-hook)
                   (setq svn-status-files-to-commit nil
                         svn-status-recursive-commit nil)
-                  (message "svn: Committed revision %s." svn-status-commit-rev-number))
+                  (if (null svn-status-commit-rev-number)
+                      (message "No revision to commit.")
+                    (message "svn: Committed revision %s." svn-status-commit-rev-number)))
                  ((eq svn-process-cmd 'update)
                   (svn-status-show-process-output 'update t)
                   (setq svn-status-update-list (svn-status-parse-update-output))
@@ -1333,6 +1421,7 @@
                  ((eq svn-process-cmd 'revert)
                   (when (member 'revert svn-status-unmark-files-after-list)
                     (svn-status-unset-all-usermarks))
+                  (svn-revert-some-buffers)
                   (svn-status-update)
                   (message "svn revert finished"))
                  ((eq svn-process-cmd 'resolved)
@@ -1370,6 +1459,7 @@
            (message "svn process had unknown event: %s" event))
           (svn-status-show-process-output nil t))))
 
+(defvar svn-process-handle-error-msg nil)
 (defun svn-process-handle-error (error-msg)
   (let ((svn-process-handle-error-msg error-msg))
     (electric-helpify 'svn-process-help-with-error-msg)))
@@ -1424,6 +1514,8 @@
                            (string= root tree)
                            ;; buffer is modified and in the tree TREE.
                            svn-status-auto-revert-buffers)
+                  (when svn-status-fancy-file-state-in-modeline
+                    (svn-status-update-modeline))
                   ;; (message "svn-revert-some-buffers: %s %s" (buffer-file-name) (verify-visited-file-modtime (current-buffer)))
                   ;; Keep the buffer if the file doesn't exist
                   (when (and (file-exists-p file) (not (verify-visited-file-modtime (current-buffer))))
@@ -1511,7 +1603,11 @@
         locked-repo-mark
         psvn-extra-info))
 
-(defvar svn-user-names-including-blanks nil "A list of svn user names that include blanks.")
+(defvar svn-user-names-including-blanks nil "A list of svn user names that include blanks.
+To add support for the names \"feng shui\" and \"mister blank\", place the following in your .emacs:
+ (setq svn-user-names-including-blanks '(\"feng shui\" \"mister blank\"))
+ (add-hook 'svn-pre-parse-status-hook 'svn-status-parse-fixup-user-names-including-blanks)
+")
 ;;(setq svn-user-names-including-blanks '("feng shui" "mister blank"))
 ;;(add-hook 'svn-pre-parse-status-hook 'svn-status-parse-fixup-user-names-including-blanks)
 
@@ -1588,9 +1684,12 @@
 
           ;; My attempt to merge the lines uses skip-double-external-dir-entry-name
           ;; and externals-map
-          (setq skip-double-external-dir-entry-name (match-string-no-properties 1))
+          (setq skip-double-external-dir-entry-name (svn-match-string-no-properties 1))
           ;; (message "Going to skip %s" skip-double-external-dir-entry-name)
           nil)
+         ((looking-at "--- Changelist") ; skip svn changelist header lines
+          ;; See: http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt
+          nil)
          (t
           (setq svn-marks (buffer-substring (point) (+ (point) svn-marks-length))
                 svn-file-mark (elt svn-marks 0)         ; 1st column - M,A,C,D,G,? etc
@@ -1735,6 +1834,9 @@
 (defvar svn-status-mode-branch-map ()
   "Subkeymap used in `svn-status-mode' for branching commands.")
 (put 'svn-status-mode-extension-map 'risky-local-variable t) ;for Emacs 20.7
+(defvar svn-status-mode-search-map ()
+  "Subkeymap used in `svn-status-mode' for search commands.")
+(put 'svn-status-mode-search-map      'risky-local-variable t) ;for Emacs 20.7
 
 (when (not svn-status-mode-map)
   (setq svn-status-mode-map (make-sparse-keymap))
@@ -1814,18 +1916,30 @@
   (define-key svn-status-mode-map (kbd "<down>") 'svn-status-next-line)
   (define-key svn-status-mode-map (kbd "<up>") 'svn-status-previous-line)
   (define-key svn-status-mode-map (kbd "C-x C-j") 'svn-status-dired-jump)
-  (define-key svn-status-mode-map [down-mouse-3] 'svn-status-popup-menu)
+  (define-key svn-status-mode-map [down-mouse-3] 'svn-status-popup-menu))
+
+(when (not svn-status-mode-mark-map)
   (setq svn-status-mode-mark-map (make-sparse-keymap))
   (define-key svn-status-mode-map (kbd "*") svn-status-mode-mark-map)
   (define-key svn-status-mode-mark-map (kbd "!") 'svn-status-unset-all-usermarks)
   (define-key svn-status-mode-mark-map (kbd "?") 'svn-status-mark-unknown)
   (define-key svn-status-mode-mark-map (kbd "A") 'svn-status-mark-added)
   (define-key svn-status-mode-mark-map (kbd "M") 'svn-status-mark-modified)
+  (define-key svn-status-mode-mark-map (kbd "P") 'svn-status-mark-modified-properties)
   (define-key svn-status-mode-mark-map (kbd "D") 'svn-status-mark-deleted)
   (define-key svn-status-mode-mark-map (kbd "*") 'svn-status-mark-changed)
   (define-key svn-status-mode-mark-map (kbd ".") 'svn-status-mark-by-file-ext)
   (define-key svn-status-mode-mark-map (kbd "%") 'svn-status-mark-filename-regexp)
+  (define-key svn-status-mode-mark-map (kbd "s") 'svn-status-store-usermarks)
+  (define-key svn-status-mode-mark-map (kbd "l") 'svn-status-load-usermarks)
   (define-key svn-status-mode-mark-map (kbd "u") 'svn-status-show-svn-diff-for-marked-files))
+
+(when (not svn-status-mode-search-map)
+  (setq svn-status-mode-search-map (make-sparse-keymap))
+  (define-key svn-status-mode-search-map (kbd "g") 'svn-status-grep-files)
+  (define-key svn-status-mode-search-map (kbd "s") 'svn-status-search-files)
+  (define-key svn-status-mode-map (kbd "S") svn-status-mode-search-map))
+
 (when (not svn-status-mode-property-map)
   (setq svn-status-mode-property-map (make-sparse-keymap))
   (define-key svn-status-mode-property-map (kbd "l") 'svn-status-property-list)
@@ -1897,6 +2011,10 @@
      ["svn ediff current file" svn-status-ediff-with-revision t]
      ["svn resolve conflicts" svn-status-resolve-conflicts]
      )
+    ("Search"
+     ["Grep marked files" svn-status-grep-files t]
+     ["Search marked files" svn-status-search-files t]
+     )
     ["svn cat ..." svn-status-get-specific-revision t]
     ["svn add" svn-status-add-file t]
     ["svn add recursively" svn-status-add-file-recursively t]
@@ -1968,12 +2086,15 @@
      ["Unmark all" svn-status-unset-all-usermarks t]
      "---"
      ["Mark/Unmark unknown" svn-status-mark-unknown t]
-     ["Mark/Unmark added" svn-status-mark-added t]
      ["Mark/Unmark modified" svn-status-mark-modified t]
+     ["Mark/Unmark modified properties" svn-status-mark-modified-properties t]
+     ["Mark/Unmark added" svn-status-mark-added t]
      ["Mark/Unmark deleted" svn-status-mark-deleted t]
      ["Mark/Unmark modified/added/deleted" svn-status-mark-changed t]
      ["Mark/Unmark filename by extension" svn-status-mark-by-file-ext t]
      ["Mark/Unmark filename by regexp" svn-status-mark-filename-regexp t]
+     ["Store Usermarks" svn-status-store-usermarks t]
+     ["Load Usermarks" svn-status-load-usermarks t]
      )
     ["Hide Unknown" svn-status-toggle-hide-unknown
      :style toggle :selected svn-status-hide-unknown]
@@ -2200,7 +2321,7 @@
   "Return whether LINE-INFO represents a locked file.
 This is column three of the `svn status' output.
 The result will be nil or \"L\".
-\(A file becomes locked when an operation is interupted; run \\[svn-status-cleanup]'
+\(A file becomes locked when an operation is interrupted; run \\[svn-status-cleanup]'
 to unlock it.\)"
   (nth 8 line-info))
 (defun svn-status-line-info->historymark (line-info)
@@ -2980,7 +3101,7 @@
 When called with a prefix argument advance the given number of lines."
   (interactive "p")
   (while (progn
-           (next-line nr-of-lines)
+           (forward-line nr-of-lines)
            (and (not (eobp))
                 (not (svn-status-get-line-information)))))
   (when (svn-status-get-line-information)
@@ -2991,7 +3112,7 @@
 When called with a prefix argument go back the given number of lines."
   (interactive "p")
   (while (progn
-           (previous-line nr-of-lines)
+           (forward-line (- nr-of-lines))
            (and (not (bobp))
                 (not (svn-status-get-line-information)))))
   (when (svn-status-get-line-information)
@@ -3001,10 +3122,14 @@
   "Jump to a dired buffer, containing the file at point."
   (interactive)
   (let* ((line-info (svn-status-get-line-information))
-         (file-full-path (svn-status-line-info->full-path line-info)))
+         (file-full-path (if line-info
+                             (svn-status-line-info->full-path line-info)
+                           default-directory)))
     (let ((default-directory
             (file-name-as-directory
-             (expand-file-name (svn-status-line-info->directory-containing-line-info line-info t)))))
+             (expand-file-name (if line-info
+                                   (svn-status-line-info->directory-containing-line-info line-info t)
+                                 default-directory)))))
       (if (fboundp 'dired-jump-back) (dired-jump-back) (dired-jump))) ;; Xemacs uses dired-jump-back
     (dired-goto-file file-full-path)))
 
@@ -3233,12 +3358,22 @@
 (defun svn-status-mark-modified (arg)
   "Mark all modified files.
 These are the files marked with 'M' in the `svn-status-buffer-name' buffer.
+Changed properties are considered.
 If the function is called with a prefix ARG, unmark all these files."
   (interactive "P")
   (svn-status-apply-usermark-checked
    '(lambda (info) (or (eq (svn-status-line-info->filemark info) ?M)
                        (eq (svn-status-line-info->filemark info)
-                           svn-status-file-modified-after-save-flag)))
+                           svn-status-file-modified-after-save-flag)
+                       (eq (svn-status-line-info->propmark info) ?M)))
+   (not arg)))
+
+(defun svn-status-mark-modified-properties (arg)
+  "Mark all files and directories with modified properties.
+If the function is called with a prefix ARG, unmark all these entries."
+  (interactive "P")
+  (svn-status-apply-usermark-checked
+   '(lambda (info) (or (eq (svn-status-line-info->propmark info) ?M)))
    (not arg)))
 
 (defun svn-status-mark-deleted (arg)
@@ -3267,6 +3402,22 @@
   (interactive)
   (svn-status-apply-usermark-checked '(lambda (info) t) nil))
 
+(defun svn-status-store-usermarks (arg)
+  "Store the current usermarks in `svn-status-usermark-storage'.
+When called with a prefix argument it is possible to store different sets of marks."
+  (interactive "P")
+  (let ((file-list (svn-status-get-file-list-names t)))
+    (svn-puthash arg file-list svn-status-usermark-storage)
+    (message "psvn stored %d user marks" (length file-list))))
+
+(defun svn-status-load-usermarks (arg)
+  "Load previously stored user marks from `svn-status-usermark-storage'.
+When called with a prefix argument it is possible to store/load different sets of marks."
+  (interactive "P")
+  (let ((file-list (gethash arg svn-status-usermark-storage)))
+    (svn-status-apply-usermark-checked
+     '(lambda (info) (member (svn-status-line-info->filename info) file-list)) t)))
+
 (defvar svn-status-regexp-history nil
   "History list of regular expressions used in svn status commands.")
 
@@ -3524,7 +3675,7 @@
     (svn-status-message 7 "last-changed-author for '%s': %s" path last-changed-author)
     (list last-changed-author)))
 
-(defun svn-status-blame (revision)
+(defun svn-status-blame (revision &optional file-name)
   "Run `svn blame' on the current file.
 When called with a prefix argument, ask the user for the REVISION to use.
 When called from a file buffer, go to the current line in the resulting blame output."
@@ -3532,19 +3683,35 @@
   (when current-prefix-arg
     (setq revision (svn-status-read-revision-string "Blame for version: " "BASE")))
   (unless revision (setq revision "BASE"))
-  (setq svn-status-blame-file-name (svn-status-line-info->filename (svn-status-get-file-information)))
+  (setq svn-status-blame-revision revision)
+  (setq svn-status-blame-file-name (if file-name
+                                       file-name
+                                     (svn-status-line-info->filename (svn-status-get-file-information))))
   (svn-run t t 'blame "blame" svn-status-default-blame-arguments "-r" revision svn-status-blame-file-name))
 
+(defun svn-blame-blame-again (arg)
+  "Run svn blame again, using the revision before the change at point.
+When point is at revision 3472, run it with 3471."
+  (interactive "P")
+  (let ((rev (svn-blame-rev-at-point)))
+    (setq rev (number-to-string (- (string-to-number rev) 1)))
+    (when current-prefix-arg
+      (setq rev (svn-status-read-revision-string (format "Svn blame for rev#? ") rev)))
+    (svn-status-blame rev svn-status-blame-file-name)))
+
 (defun svn-status-show-svn-diff (arg)
   "Run `svn diff' on the current file.
 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."
+If ARG then prompt for revision to diff against (unless arg is '-)
+When called with a negative prefix argument, do a non recursive diff."
   (interactive "P")
-  (svn-status-ensure-cursor-on-file)
-  (svn-status-show-svn-diff-internal (list (svn-status-get-line-information)) t
-                                     (if arg :ask :auto)))
+  (let ((non-recursive (or (and (numberp arg) (< arg 0)) (eq arg '-)))
+        (revision (if (and (not (eq arg '-)) arg) :ask :auto)))
+    (svn-status-ensure-cursor-on-file)
+    (svn-status-show-svn-diff-internal (list (svn-status-get-line-information)) (not non-recursive)
+                                       revision)))
 
 (defun svn-file-show-svn-diff (arg)
   "Run `svn diff' on the current file.
@@ -3567,15 +3734,15 @@
                                      (not (svn-status-some-files-marked-p))
                                      (if arg :ask "BASE")))
 
-(defun svn-status-diff-show-changeset (rev &optional user-confirmation)
+(defun svn-status-diff-show-changeset (rev &optional user-confirmation rev-against)
   "Show the changeset for a given log entry.
 When called with a prefix argument, ask the user for the revision."
-  (let* ((upper-rev rev)
-         (lower-rev (number-to-string (- (string-to-number upper-rev) 1)))
+  (let* ((upper-rev (if rev-against rev-against rev))
+         (lower-rev (if rev-against rev (number-to-string (- (string-to-number upper-rev) 1))))
          (rev-arg (concat lower-rev ":" upper-rev)))
     (when user-confirmation
       (setq rev-arg (read-string "Revision for changeset: " rev-arg)))
-    (svn-run nil t 'diff "diff" (concat "-r" rev-arg))
+    (svn-run nil t 'diff "diff" svn-status-default-diff-arguments (concat "-r" rev-arg))
     (svn-status-activate-diff-mode)))
 
 (defun svn-status-show-svn-diff-internal (line-infos recursive revision)
@@ -3826,6 +3993,7 @@
          ((eq original-filemarks ??) ;original is unversioned: use fallback
           (if (yes-or-no-p (format "%s is unversioned.  Use `%s -i -- %s %s'? "
                                    original-name fallback original-name dest))
+              ;; TODO: consider svn-call-process-function here also...
               (progn (call-process fallback nil (get-buffer-create svn-process-buffer-name) nil
                                    "-i" "--" original-name dest)
                      (setq moved t))
@@ -3893,6 +4061,12 @@
       (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
       (svn-run t t 'revert "revert" "--targets" svn-status-temp-arg-file))))
 
+(defun svn-file-revert ()
+  "Run `svn revert' on the current file."
+  (interactive)
+  (when (y-or-n-p (format "Revert %s? " buffer-file-name))
+    (svn-run t t 'revert "revert" buffer-file-name)))
+
 (defun svn-status-rm (force)
   "Run `svn rm' on all selected files.
 See `svn-status-marked-files' for what counts as selected.
@@ -3940,7 +4114,7 @@
       (message "Running svn-update for %s" default-directory)
       (svn-run t t 'update "update"
                (when rev (list "-r" rev))
-               (list "--non-interactive")))))
+               (list "--non-interactive") (expand-file-name default-directory)))))
 
 (defun svn-status-commit ()
   "Commit selected files.
@@ -3956,7 +4130,9 @@
     (svn-log-edit-show-files-to-commit)
     (svn-status-pop-to-commit-buffer)
     (when svn-log-edit-insert-files-to-commit
-      (svn-log-edit-insert-files-to-commit))))
+      (svn-log-edit-insert-files-to-commit))
+    (when svn-log-edit-show-diff-for-commit
+      (svn-log-edit-svn-diff nil))))
 
 (defun svn-status-pop-to-commit-buffer ()
   "Pop to the svn commit buffer.
@@ -4102,6 +4278,104 @@
 (add-hook 'after-save-hook 'svn-status-after-save-hook)
 
 ;; --------------------------------------------------------------------------------
+;; vc-svn integration
+;; --------------------------------------------------------------------------------
+(defvar svn-status-state-mark-modeline t) ; modeline mark display or not
+(defvar svn-status-state-mark-tooltip nil) ; modeline tooltip display
+
+(defun svn-status-state-mark-modeline-dot (color)
+  (propertize "    "
+              'help-echo 'svn-status-state-mark-tooltip
+              'display
+              `(image :type xpm
+                      :data ,(format "/* XPM */
+static char * data[] = {
+\"18 13 3 1\",
+\"  c None\",
+\"+ c #000000\",
+\". c %s\",
+\"                  \",
+\"       +++++      \",
+\"      +.....+     \",
+\"     +.......+    \",
+\"    +.........+   \",
+\"    +.........+   \",
+\"    +.........+   \",
+\"    +.........+   \",
+\"    +.........+   \",
+\"     +.......+    \",
+\"      +.....+     \",
+\"       +++++      \",
+\"                  \"};"
+                                     color)
+                      :ascent center)))
+
+(defun svn-status-install-state-mark-modeline (color)
+  (push `(svn-status-state-mark-modeline
+          ,(svn-status-state-mark-modeline-dot color))
+        mode-line-format)
+  (force-mode-line-update t))
+
+(defun svn-status-uninstall-state-mark-modeline ()
+  (setq mode-line-format
+        (remove-if #'(lambda (mode) (eq (car-safe mode)
+                                        'svn-status-state-mark-modeline))
+                   mode-line-format))
+  (force-mode-line-update t))
+
+(defun svn-status-update-state-mark-tooltip (tooltip)
+  (setq svn-status-state-mark-tooltip tooltip))
+
+(defun svn-status-update-state-mark (color)
+  (svn-status-uninstall-state-mark-modeline)
+  (svn-status-install-state-mark-modeline color))
+
+(defsubst svn-status-in-vc-mode? ()
+  "Is vc-svn active?"
+  (and vc-mode (string-match "^ SVN" (svn-substring-no-properties vc-mode))))
+
+(when svn-status-fancy-file-state-in-modeline
+  (defadvice vc-find-file-hook (after svn-status-vc-svn-find-file-hook activate)
+    "vc-find-file-hook advice for synchronizing psvn with vc-svn interface"
+    (when (svn-status-in-vc-mode?) (svn-status-update-modeline)))
+
+  (defadvice vc-after-save (after svn-status-vc-svn-after-save activate)
+    "vc-after-save advice for synchronizing psvn when saving buffer"
+    (when (svn-status-in-vc-mode?) (svn-status-update-modeline)))
+
+  (defadvice ediff-refresh-mode-lines
+    (around svn-modeline-ediff-fixup activate compile)
+    "Fixup svn file status in the modeline when using ediff"
+    (ediff-with-current-buffer ediff-buffer-A
+                               (svn-status-uninstall-state-mark-modeline))
+    (ediff-with-current-buffer ediff-buffer-B
+                               (svn-status-uninstall-state-mark-modeline))
+    ad-do-it
+    (ediff-with-current-buffer ediff-buffer-A
+                               (svn-status-update-modeline))
+    (ediff-with-current-buffer ediff-buffer-B
+                               (svn-status-update-modeline))))
+
+(defun svn-status-update-modeline ()
+  "Update modeline state dot mark properly"
+  (when (and buffer-file-name (svn-status-in-vc-mode?))
+    (svn-status-update-state-mark
+     (svn-status-interprete-state-mode-color
+      (vc-svn-state buffer-file-name)))))
+
+(defsubst svn-status-interprete-state-mode-color (stat)
+  "Interpret vc-svn-state symbol to mode line color"
+  (case stat
+    ('edited "tomato"      )
+    ('up-to-date "GreenYellow" )
+    ;; what is missing here??
+    ;; ('unknown  "gray"        )
+    ;; ('added    "blue"        )
+    ;; ('deleted  "red"         )
+    ;; ('unmerged "purple"      )
+    (t "red")))
+
+;; --------------------------------------------------------------------------------
 ;; Getting older revisions
 ;; --------------------------------------------------------------------------------
 
@@ -4113,10 +4387,9 @@
 With a prefix argument: get only the actual file."
   (interactive "P")
   (svn-status-get-specific-revision-internal
-   (svn-status-get-file-list (not arg))
-   :ask))
+   (svn-status-get-file-list (not arg)) :ask t))
 
-(defun svn-status-get-specific-revision-internal (line-infos revision)
+(defun svn-status-get-specific-revision-internal (line-infos revision handle-relative-svn-status-dir)
   "Retrieve older revisions of files.
 LINE-INFOS is a list of line-info structures (see
 `svn-status-get-line-information').
@@ -4167,15 +4440,24 @@
              ;; 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-nondirectory file-name) ".~" revision "~"))
-             (default-directory (concat (svn-status-base-dir) (file-name-directory file-name))))
+             (default-directory (concat (svn-status-base-dir)
+                                        (if handle-relative-svn-status-dir
+                                            (file-relative-name default-directory (svn-status-base-dir))
+                                          "")
+                                        (file-name-directory file-name))))
         ;; `add-to-list' would unnecessarily check for duplicates.
-        (push (cons file-name (concat (file-name-directory file-name) file-name-with-revision)) svn-status-get-specific-revision-file-info)
-        ;; (message "file-name-with-revision: %s %S" file-name-with-revision (file-exists-p file-name-with-revision))
+        (push (cons file-name (concat (file-name-directory file-name) file-name-with-revision))
+              svn-status-get-specific-revision-file-info)
+        (svn-status-message 3 "svn-status-get-specific-revision-internal: file: %s, default-directory: %s"
+                            file-name default-directory)
+        (svn-status-message 3 "svn-status-get-specific-revision-internal: file-name-with-revision: %s %S"
+                            file-name-with-revision (file-exists-p file-name-with-revision))
         (save-excursion
           (if (or (not (file-exists-p file-name-with-revision)) ;; file does not exist
                   (not (string= (number-to-string (string-to-number revision)) revision))) ;; revision is not a number
               (progn
-                (message "getting revision %s for %s" revision file-name)
+                (message "Getting revision %s of %s, target: %s" revision file-name
+                         (expand-file-name(concat default-directory file-name-with-revision)))
                 (let ((content
                        (with-temp-buffer
                          (if (string= revision "BASE")
@@ -4184,7 +4466,8 @@
                                                            (file-name-nondirectory file-name)
                                                            ".svn-base"))
                            (progn
-                             (svn-run nil t 'cat "cat" "-r" revision (file-name-nondirectory file-name))
+                             (svn-run nil t 'cat "cat" "-r" revision
+                                      (concat default-directory (file-name-nondirectory file-name)))
                              ;;todo: error processing
                              ;;svn: Filesystem has no item
                              ;;svn: file not found: revision `15', path `/trunk/file.txt'
@@ -4195,7 +4478,9 @@
                   (erase-buffer) ;Widen, because we'll save the whole buffer.
                   (insert content)
                   (goto-char (point-min))
-                  (save-buffer)))
+                  (let ((write-file-functions nil)
+                        (require-final-newline nil))
+                    (save-buffer))))
             (find-file file-name-with-revision)))))
     ;;(message "default-directory: %s revision-file-info: %S" default-directory svn-status-get-specific-revision-file-info)
     (nreverse svn-status-get-specific-revision-file-info)))
@@ -4214,7 +4499,8 @@
                    (svn-status-base-dir))
                   nil nil nil nil nil nil
                   (svn-status-line-info->update-available (svn-status-get-line-information))))
-           (if arg :ask :auto)))
+           (if arg :ask :auto)
+           nil))
          (ediff-after-quit-destination-buffer (current-buffer))
          (default-directory (svn-status-base-dir))
          (my-buffer (find-file-noselect (caar svn-status-get-specific-revision-file-info)))
@@ -4303,6 +4589,25 @@
   (svn-process-send-string (concat string "\n") send-passwd))
 
 ;; --------------------------------------------------------------------------------
+;; Search interface
+;; --------------------------------------------------------------------------------
+
+(defun svn-status-grep-files (regexp)
+  "Run grep on selected file(s).
+See `svn-status-marked-files' for what counts as selected."
+  (interactive "sGrep files for: ")
+  (unless grep-command
+    (grep-compute-defaults))
+  (grep (format "%s %s %s" grep-command (shell-quote-argument regexp)
+                (mapconcat 'identity (svn-status-marked-file-names) " "))))
+
+(defun svn-status-search-files (search-string)
+  "Search selected file(s) for a fixed SEARCH-STRING.
+See `svn-status-marked-files' for what counts as selected."
+  (interactive "sSearch files for: ")
+  (svn-status-grep-files (regexp-quote search-string)))
+
+;; --------------------------------------------------------------------------------
 ;; Property List stuff
 ;; --------------------------------------------------------------------------------
 
@@ -4560,10 +4865,16 @@
                     (mapcar 'list '("native" "CRLF" "LF" "CR"))
                     nil t)))
 
-(defun svn-status-property-set-executable ()
-  "Set the svn:executable property on the marked files."
-  (interactive)
-  (svn-status-property-set-property (svn-status-marked-files) "svn:executable" "*"))
+(defun svn-status-property-set-executable (&optional unset)
+  "Set the svn:executable property on the marked files.
+When called with a prefix argument: unset the svn:executable property."
+  (interactive "P")
+  (if unset
+      (progn
+        (svn-run nil t 'propdel (append (list "propdel" "svn:executable") (svn-status-marked-file-names)))
+        (message "Unset the svn:executable property for %s" (svn-status-marked-file-names))
+        (svn-status-update))
+    (svn-status-property-set-property (svn-status-marked-files) "svn:executable" "*")))
 
 (defun svn-status-property-set-mime-type ()
   "Set the svn:mime-type property on the marked files."
@@ -4972,8 +5283,11 @@
   (define-key svn-log-view-mode-map (kbd "p") 'svn-log-view-prev)
   (define-key svn-log-view-mode-map (kbd "n") 'svn-log-view-next)
   (define-key svn-log-view-mode-map (kbd "~") 'svn-log-get-specific-revision)
+  (define-key svn-log-view-mode-map (kbd "f") 'svn-log-get-specific-revision)
   (define-key svn-log-view-mode-map (kbd "E") 'svn-log-ediff-specific-revision)
   (define-key svn-log-view-mode-map (kbd "=") 'svn-log-view-diff)
+  (define-key svn-log-view-mode-map (kbd "#") 'svn-log-mark-partner-revision)
+  (define-key svn-log-view-mode-map (kbd "x") 'svn-log-exchange-partner-mark-with-point)
   (define-key svn-log-view-mode-map (kbd "TAB") 'svn-log-next-link)
   (define-key svn-log-view-mode-map [backtab] 'svn-log-prev-link)
   (define-key svn-log-view-mode-map (kbd "RET") 'svn-log-find-file-at-point)
@@ -4994,6 +5308,8 @@
                     ["Show Changeset" svn-log-view-diff t]
                     ["Ediff file at point" svn-log-ediff-specific-revision t]
                     ["Find file at point" svn-log-find-file-at-point t]
+                    ["Mark as diff against revision" svn-log-mark-partner-revision t]
+                    ["Get older revision for file at point" svn-log-get-specific-revision t]
                     ["Edit log message" svn-log-edit-log-entry t]))
 
 (defun svn-log-view-popup-menu (event)
@@ -5012,6 +5328,7 @@
   "Basic keywords in `svn-log-view-mode'.")
 (put 'svn-log-view-font-basic-lock-keywords 'risky-local-variable t) ;for Emacs 20.7
 
+(defvar svn-log-view-font-lock-keywords)
 (define-derived-mode svn-log-view-mode fundamental-mode "svn-log-view"
   "Major Mode to show the output from svn log.
 Commands:
@@ -5038,6 +5355,50 @@
     (unless (looking-at "Changed paths:")
       (beginning-of-line 1))))
 
+(defun svn-log-mark-partner-revision ()
+  "Mark the revision at point to be used as diff against revision."
+  (interactive)
+  (let ((start-pos)
+        (point-at-partner-rev))
+    (dolist (ov (overlays-in (point-min) (point-max)))
+      (when (overlay-get ov 'svn-log-partner-revision)
+        (setq point-at-partner-rev (and (>= (point) (overlay-start ov))
+                                        (<= (point) (overlay-end ov))))
+        (delete-overlay ov)))
+    (unless point-at-partner-rev
+      (save-excursion
+        (when (re-search-backward "^r[0-9]+" nil t 1)
+          (setq start-pos (point))
+          (re-search-forward "^---------------")
+          (setq overlay (make-overlay start-pos (line-beginning-position 0)))
+          (overlay-put overlay 'face 'svn-log-partner-highlight-face)
+          (overlay-put overlay 'svn-log-partner-revision t))))))
+
+(defun svn-log-exchange-partner-mark-with-point ()
+  (interactive)
+  (let ((cur-pos (point))
+        (dest-pos))
+    (dolist (ov (overlays-in (point-min) (point-max)))
+      (when (overlay-get ov 'svn-log-partner-revision)
+        (setq dest-pos (overlay-start ov))))
+    (when dest-pos
+      (svn-log-mark-partner-revision)
+      (goto-char dest-pos)
+      (forward-line 3)
+      (svn-log-view-prev)
+      (svn-log-view-next))))
+
+(defun svn-log-revision-for-diff ()
+  (let ((rev))
+    (dolist (ov (overlays-in (point-min) (point-max)))
+      (when (overlay-get ov 'svn-log-partner-revision)
+        (save-excursion
+          (unless (and (>= (point) (overlay-start ov))
+                       (<= (point) (overlay-end ov)))
+            (goto-char (overlay-start ov))
+            (setq rev (svn-log-revision-at-point))))))
+    rev))
+
 (defun svn-log-revision-at-point ()
   (save-excursion
     (end-of-line)
@@ -5047,19 +5408,26 @@
 (defun svn-log-file-name-at-point (respect-checkout-prefix-path)
   (let ((full-file-name)
         (file-name)
-        (checkout-prefix-path (when respect-checkout-prefix-path (svn-status-checkout-prefix-path))))
+        (checkout-prefix-path (if respect-checkout-prefix-path
+                                  (url-unhex-string
+                                   (svn-status-checkout-prefix-path))
+                                "")))
     (save-excursion
       (beginning-of-line)
       (when (looking-at "   [MA] /\\(.+\\)$")
         (setq full-file-name (svn-match-string-no-properties 1))))
     (when (string= checkout-prefix-path "")
       (setq checkout-prefix-path "/"))
-    (setq file-name
-          (if (eq (string-match (regexp-quote (substring checkout-prefix-path 1)) full-file-name) 0)
-              (substring full-file-name (- (length checkout-prefix-path) (if (string= checkout-prefix-path "/") 1 0)))
-            full-file-name))
-    ;; (message "svn-log-file-name-at-point %s prefix: '%s', full-file-name: %s" file-name checkout-prefix-path full-file-name)
-    file-name))
+    (if (null full-file-name)
+        (progn
+          (message "No file at point")
+          nil)
+      (setq file-name
+            (if (eq (string-match (regexp-quote (substring checkout-prefix-path 1)) full-file-name) 0)
+                (substring full-file-name (- (length checkout-prefix-path) (if (string= checkout-prefix-path "/") 1 0)))
+              full-file-name))
+      ;; (message "svn-log-file-name-at-point %s prefix: '%s', full-file-name: %s" file-name checkout-prefix-path full-file-name)
+      file-name)))
 
 (defun svn-log-find-file-at-point ()
   (interactive)
@@ -5089,32 +5457,50 @@
   "Show the changeset for a given log entry.
 When called with a prefix argument, ask the user for the revision."
   (interactive "P")
-  (svn-status-diff-show-changeset (svn-log-revision-at-point) arg))
+  (svn-status-diff-show-changeset (svn-log-revision-at-point) arg (svn-log-revision-for-diff)))
 
 (defun svn-log-get-specific-revision ()
   "Get an older revision of the file at point via svn cat."
   (interactive)
   ;; (message "%S" (svn-status-make-line-info (svn-log-file-name-at-point t)))
-  (let ((default-directory (svn-status-base-dir)))
-    (svn-status-get-specific-revision-internal
-     (list (svn-status-make-line-info (svn-log-file-name-at-point nil)))
-     (svn-log-revision-at-point))))
+  (let ((default-directory (svn-status-base-dir))
+        (file-name (svn-log-file-name-at-point t)))
+    (if file-name
+        (svn-status-get-specific-revision-internal
+         (list (svn-status-make-line-info file-name))
+         (svn-log-revision-at-point)
+         nil)
+      (message "No file at point"))))
 
-(defun svn-log-ediff-specific-revision ()
-  "Call ediff for the file at point to view a changeset"
-  (interactive)
+(defun svn-log-ediff-specific-revision (&optional user-confirmation)
+  "Call ediff for the file at point to view a changeset.
+When called with a prefix argument, ask the user for the revision."
+  (interactive "P")
   ;; (message "svn-log-ediff-specific-revision: %s" (svn-log-file-name-at-point t))
   (let* ((cur-buf (current-buffer))
-         (upper-rev (svn-log-revision-at-point))
-         (lower-rev (number-to-string (- (string-to-number upper-rev) 1)))
+         (diff-rev (svn-log-revision-for-diff))
+         (upper-rev (if diff-rev
+                        diff-rev
+                      (svn-log-revision-at-point)))
+         (lower-rev (if diff-rev
+                        (svn-log-revision-at-point)
+                      (number-to-string (- (string-to-number upper-rev) 1))))
          (file-name (svn-log-file-name-at-point t))
          (default-directory (svn-status-base-dir))
-         (upper-rev-file-name (when file-name
+         (upper-rev-file-name)
+         (lower-rev-file-name)
+         (rev-arg))
+    (when user-confirmation
+      (setq rev-arg (read-string "Revision for changeset: " (concat lower-rev ":" upper-rev)))
+      (setq lower-rev (car (split-string rev-arg ":")))
+      (setq upper-rev (cadr (split-string rev-arg ":"))))
+    ;;(message "lower-rev: %s, upper-rev: %s" lower-rev upper-rev)
+    (setq upper-rev-file-name (when file-name
                                 (cdar (svn-status-get-specific-revision-internal
-                                       (list (svn-status-make-line-info file-name)) upper-rev))))
-         (lower-rev-file-name (when file-name
+                                       (list (svn-status-make-line-info file-name)) upper-rev nil))))
+    (setq lower-rev-file-name (when file-name
                                 (cdar (svn-status-get-specific-revision-internal
-                                       (list (svn-status-make-line-info file-name)) lower-rev)))))
+                                       (list (svn-status-make-line-info file-name)) lower-rev nil))))
     ;;(message "%S %S" upper-rev-file-name lower-rev-file-name)
     (if file-name
         (let* ((ediff-after-quit-destination-buffer cur-buf)
@@ -5193,7 +5579,7 @@
 (defun svn-log-resolve-trac-ticket-short (link-name)
   "Show the trac ticket specified by LINK-NAME via `svn-trac-browse-ticket'."
   (interactive)
-  (let ((ticket-nr (string-to-number (substring-no-properties link-name 1))))
+  (let ((ticket-nr (string-to-number (svn-substring-no-properties link-name 1))))
     (svn-trac-browse-ticket ticket-nr)))
 
 ;; register the out of the box provided link handlers
@@ -5240,6 +5626,8 @@
                            (progn (beginning-of-line) (re-search-forward ".. +") (point))
                            (line-end-position)))
                (pos))
+           (when (eq system-type 'windows-nt)
+             (setq file-name (replace-regexp-in-string "\\\\" "/" file-name)))
            (goto-char cur-pos)
            (with-current-buffer svn-status-buffer-name
              (setq pos (svn-status-get-file-name-buffer-position file-name)))
@@ -5253,8 +5641,8 @@
 
 (unless (assq 'svn-blame-mode minor-mode-alist)
   (setq minor-mode-alist
-	(cons (list 'svn-blame-mode " SvnBlame")
-          minor-mode-alist)))
+        (cons (list 'svn-blame-mode " SvnBlame")
+              minor-mode-alist)))
 
 (defvar svn-blame-mode-map () "Keymap used in `svn-blame-mode' buffers.")
 (put 'svn-blame-mode-map 'risky-local-variable t) ;for Emacs 20.7
@@ -5269,6 +5657,8 @@
   (define-key svn-blame-mode-map (kbd "r") 'svn-blame-highlight-revision)
   (define-key svn-blame-mode-map (kbd "=") 'svn-blame-show-changeset)
   (define-key svn-blame-mode-map (kbd "l") 'svn-blame-show-log)
+  (define-key svn-blame-mode-map (kbd "b") 'svn-blame-blame-again)
+  (define-key svn-blame-mode-map (kbd "s") 'svn-blame-show-statistics)
   (define-key svn-blame-mode-map [?q] 'bury-buffer))
 
 (easy-menu-define svn-blame-mode-menu svn-blame-mode-map
@@ -5277,12 +5667,14 @@
                     ["Jump to source location" svn-blame-open-source-file t]
                     ["Show changeset" svn-blame-show-changeset t]
                     ["Show log" svn-blame-show-log t]
+                    ["Show blame again" svn-blame-blame-again t]
+                    ["Show statistics" svn-blame-show-statistics t]
                     ["Highlight by author" svn-blame-highlight-author t]
                     ["Highlight by revision" svn-blame-highlight-revision t]))
 
 (or (assq 'svn-blame-mode minor-mode-map-alist)
     (setq minor-mode-map-alist
-	  (cons (cons 'svn-blame-mode svn-blame-mode-map) minor-mode-map-alist)))
+          (cons (cons 'svn-blame-mode svn-blame-mode-map) minor-mode-map-alist)))
 
 (make-variable-buffer-local 'svn-blame-mode)
 
@@ -5330,7 +5722,9 @@
         (delete-region (svn-point-at-bol) (+ (svn-point-at-bol) info-end-col))
         (forward-line)
         (setq line (1+ line)))))
-  (let* ((buf-name (format "*svn-blame: %s*" (file-relative-name svn-status-blame-file-name)))
+  (let* ((buf-name (format "*svn-blame: %s <%s>*"
+                           (file-relative-name svn-status-blame-file-name)
+                           svn-status-blame-revision))
          (buffer (get-buffer buf-name)))
     (when buffer
       (kill-buffer buffer))
@@ -5405,6 +5799,29 @@
               (overlay-put hl-ov 'face 'svn-status-blame-highlight-face))))
         (forward-line)))))
 
+(defun svn-blame-show-statistics ()
+  "Show statistics for the current blame buffer."
+  (interactive)
+  (let ((author-map (make-hash-table :test 'equal))
+        (author-list)
+        (author))
+    (save-excursion
+      (goto-char (point-min))
+      (while (not (eobp))
+        (dolist (ov (overlays-in (svn-point-at-bol) (line-end-position)))
+          (when (overlay-get ov 'svn-blame-line-info)
+            (setq author (cadr (overlay-get ov 'rev-info)))
+            (svn-puthash author
+                         (+ (gethash author author-map 0) 1)
+                         author-map)))
+        (forward-line))
+      (maphash '(lambda (key value) (add-to-list 'author-list (list key value))) author-map)
+      (pop-to-buffer (get-buffer-create (replace-regexp-in-string "svn-blame:" "svn-blame-statistics:" (buffer-name))))
+      (erase-buffer)
+      (dolist (line (sort author-list '(lambda (v1 v2) (> (cadr v1) (cadr v2)))))
+        (insert (format "%s: %s line%s\n" (car line) (cadr line) (if (eq (cadr line) 1) "" "s"))))
+      (goto-char (point-min)))))
+
 (defun svn-blame-highlight-author-field (ov)
   (cadr (overlay-get ov 'rev-info)))
 


Index: sources
===================================================================
RCS file: /cvs/extras/rpms/subversion/devel/sources,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- sources	12 Sep 2008 16:10:42 -0000	1.32
+++ sources	13 Oct 2008 09:49:23 -0000	1.33
@@ -1 +1 @@
-ec3ae55d43ee87c1c1f57e2411009459  subversion-1.5.2.tar.gz
+6a57efcc9e487e9bffc554931c98d3a0  subversion-1.5.3.tar.gz


Index: subversion.spec
===================================================================
RCS file: /cvs/extras/rpms/subversion/devel/subversion.spec,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- subversion.spec	30 Sep 2008 11:57:47 -0000	1.123
+++ subversion.spec	13 Oct 2008 09:49:23 -0000	1.124
@@ -14,8 +14,8 @@
 
 Summary: Modern Version Control System designed to replace CVS
 Name: subversion
-Version: 1.5.2
-Release: 3
+Version: 1.5.3
+Release: 2
 License: ASL 1.1
 Group: Development/Tools
 URL: http://subversion.tigris.org/
@@ -277,6 +277,10 @@
 %endif
 
 %changelog
+* Mon Oct 13 2008 Joe Orton <jorton at redhat.com> 1.5.3-2
+- update to 1.5.3 (#466674)
+- update psvn.el to r33557
+
 * Tue Sep 30 2008 Joe Orton <jorton at redhat.com> 1.5.2-3
 - enable SASL support (#464267)
 


Index: upstream
===================================================================
RCS file: /cvs/extras/rpms/subversion/devel/upstream,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- upstream	12 Sep 2008 16:10:42 -0000	1.18
+++ upstream	13 Oct 2008 09:49:23 -0000	1.19
@@ -1 +1 @@
-subversion-1.5.2.tar.gz
+subversion-1.5.3.tar.gz




More information about the fedora-extras-commits mailing list