- update to 1.6.11

This commit is contained in:
jorton 2010-04-30 09:22:52 +00:00
parent 67de2a23a6
commit 30b78cbd38
5 changed files with 881 additions and 124 deletions

234
psvn.el
View File

@ -1,8 +1,8 @@
;;; psvn.el --- Subversion interface for emacs ;;; psvn.el --- Subversion interface for emacs
;; Copyright (C) 2002-2008 by Stefan Reichoer ;; Copyright (C) 2002-2009 by Stefan Reichoer
;; Author: Stefan Reichoer <stefan@xsteve.at> ;; Author: Stefan Reichoer <stefan@xsteve.at>
;; $Id: psvn.el 33557 2008-10-08 20:01:12Z xsteve $ ;; $Id: psvn.el 40299 2009-10-29 19:38:54Z xsteve $
;; psvn.el is free software; you can redistribute it and/or modify ;; psvn.el is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by ;; it under the terms of the GNU General Public License as published by
@ -22,7 +22,7 @@
;;; Commentary ;;; Commentary
;; psvn.el is tested with GNU Emacs 21.3 on windows, debian linux, ;; psvn.el is tested with GNU Emacs 21.3 on windows, debian linux,
;; freebsd5, red hat el4, ubuntu edgy with svn 1.4.0 ;; freebsd5, red hat el4, ubuntu intrepid with svn 1.5.1
;; psvn.el needs at least svn 1.1.0 ;; psvn.el needs at least svn 1.1.0
;; if you upgrade to a higher version, you need to do a fresh checkout ;; if you upgrade to a higher version, you need to do a fresh checkout
@ -73,6 +73,7 @@
;; e - svn-status-toggle-edit-cmd-flag ;; e - svn-status-toggle-edit-cmd-flag
;; ? - svn-status-toggle-hide-unknown ;; ? - svn-status-toggle-hide-unknown
;; _ - svn-status-toggle-hide-unmodified ;; _ - svn-status-toggle-hide-unmodified
;; z - svn-status-toggle-hide-externals
;; m - svn-status-set-user-mark ;; m - svn-status-set-user-mark
;; u - svn-status-unset-user-mark ;; u - svn-status-unset-user-mark
;; $ - svn-status-toggle-elide ;; $ - svn-status-toggle-elide
@ -103,6 +104,7 @@
;; P i - svn-status-property-ignore-file ;; P i - svn-status-property-ignore-file
;; P I - svn-status-property-ignore-file-extension ;; P I - svn-status-property-ignore-file-extension
;; P C-i - svn-status-property-edit-svn-ignore ;; P C-i - svn-status-property-edit-svn-ignore
;; P X e - svn-status-property-edit-svn-externals
;; P k - svn-status-property-set-keyword-list ;; P k - svn-status-property-set-keyword-list
;; P K i - svn-status-property-set-keyword-id ;; P K i - svn-status-property-set-keyword-id
;; P K d - svn-status-property-set-keyword-date ;; P K d - svn-status-property-set-keyword-date
@ -245,6 +247,7 @@
(eval-when-compile (require 'dired)) (eval-when-compile (require 'dired))
(eval-when-compile (require 'ediff-util)) (eval-when-compile (require 'ediff-util))
(eval-when-compile (require 'ediff-wind)) (eval-when-compile (require 'ediff-wind))
(eval-when-compile (require 'vc-hooks))
(eval-when-compile (require 'elp)) (eval-when-compile (require 'elp))
(eval-when-compile (require 'pp)) (eval-when-compile (require 'pp))
@ -253,7 +256,7 @@
(require 'diff-mode)) (require 'diff-mode))
(error nil)) (error nil))
(defconst svn-psvn-revision "$Id: psvn.el 33557 2008-10-08 20:01:12Z xsteve $" (defconst svn-psvn-revision "$Id: psvn.el 40299 2009-10-29 19:38:54Z xsteve $"
"The revision number of psvn.") "The revision number of psvn.")
;;; user setable variables ;;; user setable variables
@ -302,6 +305,11 @@ This can be toggled with \\[svn-status-toggle-hide-unknown]."
This can be toggled with \\[svn-status-toggle-hide-unmodified]." This can be toggled with \\[svn-status-toggle-hide-unmodified]."
:type 'boolean :type 'boolean
:group 'psvn) :group 'psvn)
(defcustom svn-status-hide-externals nil
"*Hide external files in `svn-status-buffer-name' buffer.
This can be toggled with \\[svn-status-toggle-hide-externals]."
:type 'boolean
:group 'psvn)
(defcustom svn-status-sort-status-buffer t (defcustom svn-status-sort-status-buffer t
"*Whether to sort the `svn-status-buffer-name' buffer. "*Whether to sort the `svn-status-buffer-name' buffer.
@ -414,6 +422,12 @@ Any non-nil value overrides that variable, with the same syntax."
;; (put 'svn-browse-url-function 'risky-local-variable t) ;; (put 'svn-browse-url-function 'risky-local-variable t)
;; already implied by "-function" suffix ;; already implied by "-function" suffix
(defcustom svn-log-edit-header
"## Lines starting with '## ' will be removed from the log message.\n"
"*Header content of the *svn-log* buffer"
:type 'string
:group 'psvn)
(defcustom svn-status-window-alist (defcustom svn-status-window-alist
'((diff "*svn-diff*") (log "*svn-log*") (info t) (blame t) (proplist t) (update t)) '((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. "An alist to specify which windows should be used for svn command outputs.
@ -562,7 +576,7 @@ These link handlers must be registered via `svn-log-register-link-handler'")
;; (put 'svn-log-edit-done-hook 'risky-local-variable t) ;; (put 'svn-log-edit-done-hook 'risky-local-variable t)
;; already implied by "-hook" suffix ;; already implied by "-hook" suffix
(defvar svn-post-process-svn-output-hook nil "Hook that can be used to preprocess the output from svn. (defvar svn-post-process-svn-output-hook 'svn-fixup-tramp-output-maybe "Hook that can be used to preprocess the output from svn.
The function `svn-status-remove-control-M' can be useful for that hook") The function `svn-status-remove-control-M' can be useful for that hook")
(when (eq system-type 'windows-nt) (when (eq system-type 'windows-nt)
@ -936,7 +950,7 @@ If POS is nil, use current buffer location."
(defun svn-substring-no-properties (string &optional from to) (defun svn-substring-no-properties (string &optional from to)
(if (fboundp 'substring-no-properties) (if (fboundp 'substring-no-properties)
(substring-no-properties string from to) (substring-no-properties string from to)
(substring string from to))) (substring string (or from 0) to)))
; xemacs ; xemacs
;; Evaluate the defsubst at compile time, so that the byte compiler ;; Evaluate the defsubst at compile time, so that the byte compiler
@ -948,6 +962,14 @@ If POS is nil, use current buffer location."
(defsubst svn-match-string-no-properties (match) (defsubst svn-match-string-no-properties (match)
(buffer-substring-no-properties (match-beginning match) (match-end match))))) (buffer-substring-no-properties (match-beginning match) (match-end match)))))
; XEmacs doesn't have a function `help-buffer'
(eval-and-compile
(if (fboundp 'help-buffer)
(defalias 'svn-help-buffer 'help-buffer) ; FSF Emacs
(defun svn-help-buffer ()
(buffer-name (get-buffer-create (help-buffer-name "SVN")))))) ; XEmacs
;; XEmacs 21.4.17 does not have an `alist' widget. Define a replacement. ;; 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 ;; To find out whether the `alist' widget exists, we cannot check just
;; (get 'alist 'widget-type), because GNU Emacs 21.4 defines it in ;; (get 'alist 'widget-type), because GNU Emacs 21.4 defines it in
@ -1010,7 +1032,8 @@ To bind this to a different key, customize `svn-status-prefix-key'.")
(define-key svn-global-keymap (kbd "f r") 'svn-file-revert) (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 "c") 'svn-status-commit)
(define-key svn-global-keymap (kbd "S") 'svn-status-switch-to-status-buffer) (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)) (define-key svn-global-keymap (kbd "o") 'svn-status-pop-to-status-buffer)
(define-key svn-global-keymap (kbd "C-k") 'svn-process-kill))
(defvar svn-status-diff-mode-map () (defvar svn-status-diff-mode-map ()
"Keymap used in `svn-status-diff-mode' for additional commands that are not defined in diff-mode.") "Keymap used in `svn-status-diff-mode' for additional commands that are not defined in diff-mode.")
@ -1161,13 +1184,14 @@ If there is no .svn directory, examine if there is CVS and run
(if arg "-u" ""))))) (if arg "-u" "")))))
(save-excursion (save-excursion
(set-buffer status-buf) (set-buffer status-buf)
(buffer-disable-undo)
(setq default-directory dir) (setq default-directory dir)
(set-buffer proc-buf) (set-buffer proc-buf)
(setq default-directory dir (setq default-directory dir
svn-status-remote (when arg t)) svn-status-remote (when arg t))
(set-buffer cur-buf) (set-buffer cur-buf)
(if want-edit (if want-edit
(let (svn-status-edit-svn-command t) (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))
(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)))))
@ -1196,6 +1220,19 @@ If there is no .svn directory, examine if there is CVS and run
(defun svn-had-user-input-since-asynch-run () (defun svn-had-user-input-since-asynch-run ()
(not (equal (recent-keys) svn-pre-run-asynch-recent-keys))) (not (equal (recent-keys) svn-pre-run-asynch-recent-keys)))
(defun svn-expand-filename-for-remote-access (file-name)
"Convert the given local part of a filename to a full file name to allow accessing remote files"
;; when running svn on a remote host: expand local file names to get full names to access the file on the remote host via emacs
(if (and (fboundp 'file-remote-p) (file-remote-p default-directory))
(concat (file-remote-p default-directory) file-name)
file-name))
(defun svn-local-filename-for-remote-access (file-name)
"Convert a full file name to a local file name that can be used for a local svn invocation."
(if (and (fboundp 'file-remote-p) (file-remote-p file-name))
(tramp-file-name-localname (tramp-dissect-file-name file-name))
file-name))
(defun svn-process-environment () (defun svn-process-environment ()
"Construct the environment for the svn process. "Construct the environment for the svn process.
It is a combination of `svn-status-svn-environment-var-list' and It is a combination of `svn-status-svn-environment-var-list' and
@ -1272,7 +1309,7 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(setq svn-status-last-commit-author nil) (setq svn-status-last-commit-author nil)
(setq svn-status-mode-line-process-status (format " running %s" cmdtype)) (setq svn-status-mode-line-process-status (format " running %s" cmdtype))
(svn-status-update-mode-line) (svn-status-update-mode-line)
(sit-for 0.1) (save-excursion (sit-for 0.1))
(ring-insert svn-last-cmd-ring (list (current-time-string) arglist default-directory)) (ring-insert svn-last-cmd-ring (list (current-time-string) arglist default-directory))
(if run-asynchron (if run-asynchron
(progn (progn
@ -1320,8 +1357,8 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(replace-match "/"))))) (replace-match "/")))))
(defun svn-process-sentinel (process event) (defun svn-process-sentinel (process event)
"Called after a svn process has finished."
;;(princ (format "Process: %s had the event `%s'" process event))) ;;(princ (format "Process: %s had the event `%s'" process event)))
;;(save-excursion
(let ((act-buf (current-buffer))) (let ((act-buf (current-buffer)))
(when svn-pre-run-mode-line-process (when svn-pre-run-mode-line-process
(with-current-buffer svn-status-pre-run-svn-buffer (with-current-buffer svn-status-pre-run-svn-buffer
@ -1452,17 +1489,30 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(while (accept-process-output process 0 100)) (while (accept-process-output process 0 100))
;; find last error message and show it. ;; find last error message and show it.
(goto-char (point-max)) (goto-char (point-max))
(if (re-search-backward "^svn: \\(.*\\)" nil t) (if (re-search-backward "^svn: " nil t)
(svn-process-handle-error (match-string 1)) (let ((error-strings)
(beginning-of-buffer))
(while (and (looking-at "^svn: ") (not beginning-of-buffer))
(setq error-strings (append error-strings (list (buffer-substring-no-properties (+ 5 (svn-point-at-bol)) (svn-point-at-eol)))))
(setq beginning-of-buffer (bobp))
(forward-line -1))
(svn-process-handle-error (mapconcat 'identity (reverse error-strings) "\n")))
(message "svn failed: %s" event))) (message "svn failed: %s" event)))
(t (t
(message "svn process had unknown event: %s" event)) (message "svn process had unknown event: %s" event))
(svn-status-show-process-output nil t)))) (svn-status-show-process-output nil t))))
(defvar svn-process-handle-error-msg nil) (defvar svn-process-handle-error-msg nil)
(defvar svn-handle-error-function nil
"A function that will be called with an error string received from the svn client.
When this function resets `svn-process-handle-error-msg' to nil, the default error handling
(just show the error message) is not executed.")
(defun svn-process-handle-error (error-msg) (defun svn-process-handle-error (error-msg)
(let ((svn-process-handle-error-msg error-msg)) (let ((svn-process-handle-error-msg error-msg))
(electric-helpify 'svn-process-help-with-error-msg))) (when (functionp svn-handle-error-function)
(funcall svn-handle-error-function error-msg))
(when svn-process-handle-error-msg
(electric-helpify 'svn-process-help-with-error-msg))))
(defun svn-process-help-with-error-msg () (defun svn-process-help-with-error-msg ()
(interactive) (interactive)
@ -1471,9 +1521,9 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
"Please unmark all files and position point at the directory you would like to remove.\nThen run commit again.")))))) "Please unmark all files and position point at the directory you would like to remove.\nThen run commit again."))))))
(if help-msg (if help-msg
(save-excursion (save-excursion
(with-output-to-temp-buffer (help-buffer) (with-output-to-temp-buffer (svn-help-buffer)
(princ (format "svn failed: %s\n\n%s" svn-process-handle-error-msg help-msg)))) (princ (format "svn failed: %s\n\n%s" svn-process-handle-error-msg help-msg))))
(message "svn failed: %s" svn-process-handle-error-msg)))) (message "svn failed:\n%s" svn-process-handle-error-msg))))
(defun svn-process-filter (process str) (defun svn-process-filter (process str)
@ -1485,17 +1535,17 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(insert str) (insert str)
(save-excursion (save-excursion
(goto-char (svn-point-at-bol)) (goto-char (svn-point-at-bol))
(when (looking-at "Password for '\\(.+\\)': ") (when (looking-at "Password for '\\(.*\\)': ")
;(svn-status-show-process-buffer) ;(svn-status-show-process-buffer)
(let ((passwd (read-passwd (let ((passwd (read-passwd
(format "Enter svn password for %s: " (match-string 1))))) (format "Enter svn password for %s: " (match-string 1)))))
(svn-process-send-string-and-newline passwd t))) (svn-process-send-string-and-newline passwd t)))
(when (looking-at "Username: ") (when (looking-at "Username: ")
(let ((user-name (read-string "Username for svn operation: "))) (let ((user-name (with-local-quit (read-string "Username for svn operation: "))))
(svn-process-send-string-and-newline user-name))) (svn-process-send-string-and-newline user-name)))
(when (looking-at "(R)eject, accept (t)emporarily or accept (p)ermanently") (when (looking-at "(R)eject, accept (t)emporarily or accept (p)ermanently")
(svn-status-show-process-buffer) (svn-status-show-process-buffer)
(let ((answer (read-string "(R)eject, accept (t)emporarily or accept (p)ermanently? "))) (let ((answer (with-local-quit (read-string "(R)eject, accept (t)emporarily or accept (p)ermanently? "))))
(svn-process-send-string (substring answer 0 1))))))) (svn-process-send-string (substring answer 0 1)))))))
(defun svn-revert-some-buffers (&optional tree) (defun svn-revert-some-buffers (&optional tree)
@ -1696,7 +1746,7 @@ The results are used to build the `svn-status-info' variable."
svn-property-mark (elt svn-marks 1) ; 2nd column - M,C (properties) svn-property-mark (elt svn-marks 1) ; 2nd column - M,C (properties)
svn-wc-locked-mark (elt svn-marks 2) ; 3rd column - L or blank svn-wc-locked-mark (elt svn-marks 2) ; 3rd column - L or blank
svn-with-history-mark (elt svn-marks 3) ; 4th column - + or blank svn-with-history-mark (elt svn-marks 3) ; 4th column - + or blank
svn-switched-mark (elt svn-marks 4) ; 5th column - S or blank svn-switched-mark (elt svn-marks 4) ; 5th column - S,X or blank
svn-repo-locked-mark (elt svn-marks 5)) ; 6th column - K,O,T,B or blank svn-repo-locked-mark (elt svn-marks 5)) ; 6th column - K,O,T,B or blank
(when svn-status-remote (when svn-status-remote
(setq svn-update-mark (elt svn-marks 7))) ; 8th column - * or blank (setq svn-update-mark (elt svn-marks 7))) ; 8th column - * or blank
@ -1783,7 +1833,7 @@ The results are used to build the `svn-status-info' variable."
(setq svn-status-info (sort svn-status-info 'svn-status-sort-predicate)))))) (setq svn-status-info (sort svn-status-info 'svn-status-sort-predicate))))))
;;(string-lessp "." "%") => nil ;;(string-lessp "." "%") => nil
;(svn-status-sort-predicate '(t t t ".") '(t t t "%")) => t ;;(svn-status-sort-predicate '(t t t ".") '(t t t "%")) => t
(defun svn-status-sort-predicate (a b) (defun svn-status-sort-predicate (a b)
"Return t if A should appear before B in the `svn-status-buffer-name' buffer. "Return t if A should appear before B in the `svn-status-buffer-name' buffer.
A and B must be line-info's." A and B must be line-info's."
@ -1809,6 +1859,21 @@ A and B must be line-info's."
(while (re-search-forward "\r$" (point-max) t) (while (re-search-forward "\r$" (point-max) t)
(replace-match "" nil nil)))))) (replace-match "" nil nil))))))
(defun svn-fixup-tramp-exit ()
"Helper function to handle tramp connections stopping with an exit output."
(goto-char (point-max))
(when (eq (svn-point-at-bol) (svn-point-at-eol))
(forward-line -1))
(beginning-of-line)
(when (looking-at "exit")
(delete-region (point) (svn-point-at-eol))))
(defun svn-fixup-tramp-output-maybe ()
"Fixup leftover output when running via tramp"
(when (fboundp 'file-remote-p)
(when (file-remote-p default-directory)
(svn-fixup-tramp-exit))))
(condition-case nil (condition-case nil
;;(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t] "PCL-CVS") ;;(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t] "PCL-CVS")
(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t]) (easy-menu-add-item nil '("tools") ["SVN Status" svn-status t])
@ -1888,6 +1953,7 @@ A and B must be line-info's."
(define-key svn-status-mode-map (kbd "V") 'svn-status-svnversion) (define-key svn-status-mode-map (kbd "V") 'svn-status-svnversion)
(define-key svn-status-mode-map (kbd "?") 'svn-status-toggle-hide-unknown) (define-key svn-status-mode-map (kbd "?") 'svn-status-toggle-hide-unknown)
(define-key svn-status-mode-map (kbd "_") 'svn-status-toggle-hide-unmodified) (define-key svn-status-mode-map (kbd "_") 'svn-status-toggle-hide-unmodified)
(define-key svn-status-mode-map (kbd "z") 'svn-status-toggle-hide-externals)
(define-key svn-status-mode-map (kbd "a") 'svn-status-add-file) (define-key svn-status-mode-map (kbd "a") 'svn-status-add-file)
(define-key svn-status-mode-map (kbd "A") 'svn-status-add-file-recursively) (define-key svn-status-mode-map (kbd "A") 'svn-status-add-file-recursively)
(define-key svn-status-mode-map (kbd "+") 'svn-status-make-directory) (define-key svn-status-mode-map (kbd "+") 'svn-status-make-directory)
@ -1954,6 +2020,7 @@ A and B must be line-info's."
;; reducing clutter in `where-is'. ;; reducing clutter in `where-is'.
(define-key svn-status-mode-property-map [(control ?i)] 'svn-status-property-edit-svn-ignore) (define-key svn-status-mode-property-map [(control ?i)] 'svn-status-property-edit-svn-ignore)
(define-key svn-status-mode-property-map (kbd "TAB") 'svn-status-property-edit-svn-ignore) (define-key svn-status-mode-property-map (kbd "TAB") 'svn-status-property-edit-svn-ignore)
(define-key svn-status-mode-property-map (kbd "Xe") 'svn-status-property-edit-svn-externals)
(define-key svn-status-mode-property-map (kbd "k") 'svn-status-property-set-keyword-list) (define-key svn-status-mode-property-map (kbd "k") 'svn-status-property-set-keyword-list)
(define-key svn-status-mode-property-map (kbd "Ki") 'svn-status-property-set-keyword-id) (define-key svn-status-mode-property-map (kbd "Ki") 'svn-status-property-set-keyword-id)
(define-key svn-status-mode-property-map (kbd "Kd") 'svn-status-property-set-keyword-date) (define-key svn-status-mode-property-map (kbd "Kd") 'svn-status-property-set-keyword-date)
@ -2045,6 +2112,8 @@ A and B must be line-info's."
["svn:ignore File Extension..." svn-status-property-ignore-file-extension t] ["svn:ignore File Extension..." svn-status-property-ignore-file-extension t]
["Edit svn:ignore Property" svn-status-property-edit-svn-ignore t] ["Edit svn:ignore Property" svn-status-property-edit-svn-ignore t]
"---" "---"
["Edit svn:externals Property" svn-status-property-edit-svn-externals t]
"---"
["Edit svn:keywords List" svn-status-property-set-keyword-list t] ["Edit svn:keywords List" svn-status-property-set-keyword-list t]
["Add/Remove Id to/from svn:keywords" svn-status-property-set-keyword-id t] ["Add/Remove Id to/from svn:keywords" svn-status-property-set-keyword-id t]
["Add/Remove Date to/from svn:keywords" svn-status-property-set-keyword-date t] ["Add/Remove Date to/from svn:keywords" svn-status-property-set-keyword-date t]
@ -2100,6 +2169,8 @@ A and B must be line-info's."
:style toggle :selected svn-status-hide-unknown] :style toggle :selected svn-status-hide-unknown]
["Hide Unmodified" svn-status-toggle-hide-unmodified ["Hide Unmodified" svn-status-toggle-hide-unmodified
:style toggle :selected svn-status-hide-unmodified] :style toggle :selected svn-status-hide-unmodified]
["Hide Externals" svn-status-toggle-hide-externals
:style toggle :selected svn-status-hide-externals]
["Show Client versions" svn-status-version t] ["Show Client versions" svn-status-version t]
["Prepare bug report" svn-prepare-bug-report t] ["Prepare bug report" svn-prepare-bug-report t]
)) ))
@ -2145,7 +2216,7 @@ PREFIX is passed to `popup-menu'."
(progn (progn
(setq o (make-overlay begin end)) (setq o (make-overlay begin end))
(overlay-put o 'face face) (overlay-put o 'face face)
(sit-for 0) (save-excursion (sit-for 0))
(popup-menu menu prefix)) (popup-menu menu prefix))
(delete-overlay o)))) (delete-overlay o))))
@ -2332,7 +2403,7 @@ history, when it will be \"+\"."
(defun svn-status-line-info->switched (line-info) (defun svn-status-line-info->switched (line-info)
"Return whether LINE-INFO is switched relative to its parent. "Return whether LINE-INFO is switched relative to its parent.
This is column five of the output from `svn status'. This is column five of the output from `svn status'.
The result will be nil or \"S\"." The result will be \"S\", \"X\" or nil."
(nth 10 line-info)) (nth 10 line-info))
(defun svn-status-line-info->repo-locked (line-info) (defun svn-status-line-info->repo-locked (line-info)
"Return whether LINE-INFO contains some locking information. "Return whether LINE-INFO contains some locking information.
@ -2349,6 +2420,7 @@ This list holds currently only one element:
"Return whether the line is visible or not" "Return whether the line is visible or not"
(or (not (or (svn-status-line-info->hide-because-unknown line-info) (or (not (or (svn-status-line-info->hide-because-unknown line-info)
(svn-status-line-info->hide-because-unmodified line-info) (svn-status-line-info->hide-because-unmodified line-info)
(svn-status-line-info->hide-because-externals line-info)
(svn-status-line-info->hide-because-custom-hide-function line-info) (svn-status-line-info->hide-because-custom-hide-function line-info)
(svn-status-line-info->hide-because-user-elide line-info))) (svn-status-line-info->hide-because-user-elide line-info)))
(svn-status-line-info->update-available line-info) ;; show the line, if an update is available (svn-status-line-info->update-available line-info) ;; show the line, if an update is available
@ -2359,6 +2431,10 @@ This list holds currently only one element:
(and svn-status-hide-unknown (and svn-status-hide-unknown
(eq (svn-status-line-info->filemark line-info) ??))) (eq (svn-status-line-info->filemark line-info) ??)))
(defun svn-status-line-info->hide-because-externals (line-info)
(and svn-status-hide-externals
(eq (svn-status-line-info->filemark line-info) ?X)))
(defun svn-status-line-info->hide-because-custom-hide-function (line-info) (defun svn-status-line-info->hide-because-custom-hide-function (line-info)
(and svn-status-custom-hide-function (and svn-status-custom-hide-function
(apply svn-status-custom-hide-function (list line-info)))) (apply svn-status-custom-hide-function (list line-info))))
@ -2491,6 +2567,7 @@ When called with a prefix argument, toggle the hiding of all subdirectories for
(len-test) (len-test)
(elided-list) (elided-list)
(elide-mark)) (elide-mark))
(when svn-status-elided-list
(while st-info (while st-info
(setq fname (svn-status-line-info->filename (car st-info))) (setq fname (svn-status-line-info->filename (car st-info)))
(setq len-fname (length fname)) (setq len-fname (length fname))
@ -2510,7 +2587,7 @@ When called with a prefix argument, toggle the hiding of all subdirectories for
(setq elided-list (cdr elided-list))) (setq elided-list (cdr elided-list)))
;;(message "fname: %s elide-mark: %S" fname elide-mark) ;;(message "fname: %s elide-mark: %S" fname elide-mark)
(setcar (nthcdr 1 (svn-status-line-info->ui-status (car st-info))) elide-mark) (setcar (nthcdr 1 (svn-status-line-info->ui-status (car st-info))) elide-mark)
(setq st-info (cdr st-info)))) (setq st-info (cdr st-info)))))
(svn-status-update-buffer)) (svn-status-update-buffer))
(defun svn-status-update-with-command-list (cmd-list) (defun svn-status-update-with-command-list (cmd-list)
@ -2794,7 +2871,8 @@ Symbolic links to directories count as directories (see `file-directory-p')."
(filename ;; <indentation>file or /path/to/file (filename ;; <indentation>file or /path/to/file
(concat (concat
(if (or svn-status-display-full-path (if (or svn-status-display-full-path
svn-status-hide-unmodified) svn-status-hide-unmodified
svn-status-hide-externals)
(svn-add-face (svn-add-face
(let ((dir-name (file-name-as-directory (let ((dir-name (file-name-as-directory
(svn-status-line-info->directory-containing-line-info (svn-status-line-info->directory-containing-line-info
@ -2859,7 +2937,7 @@ Symbolic links to directories count as directories (see `file-directory-p')."
((eq flag ?B) " [ REPO-LOCK-BROKEN ]") ((eq flag ?B) " [ REPO-LOCK-BROKEN ]")
(t " [ REPO-LOCK-UNKNOWN ]"))) (t " [ REPO-LOCK-UNKNOWN ]")))
'svn-status-locked-face) 'svn-status-locked-face)
(svn-status-maybe-add-string (svn-status-line-info->switched line-info) (svn-status-maybe-add-string (eq (svn-status-line-info->switched line-info) ?S)
" (switched)" 'svn-status-switched-face) " (switched)" 'svn-status-switched-face)
elide-hint) elide-hint)
'svn-status-marked-face) 'svn-status-marked-face)
@ -2891,6 +2969,7 @@ Additionally clear the psvn-extra-info field in all line-info lists."
(overlay) (overlay)
(unmodified-count 0) ;how many unmodified files are hidden (unmodified-count 0) ;how many unmodified files are hidden
(unknown-count 0) ;how many unknown files are hidden (unknown-count 0) ;how many unknown files are hidden
(externals-count 0) ;how many svn:externals files are hidden
(custom-hide-count 0) ;how many files are hidden via svn-status-custom-hide-function (custom-hide-count 0) ;how many files are hidden via svn-status-custom-hide-function
(marked-count 0) ;how many files are elided (marked-count 0) ;how many files are elided
(user-elide-count 0) (user-elide-count 0)
@ -2920,12 +2999,15 @@ Additionally clear the psvn-extra-info field in all line-info lists."
(setq unknown-count (1+ unknown-count))) (setq unknown-count (1+ unknown-count)))
((svn-status-line-info->hide-because-unmodified (car st-info)) ((svn-status-line-info->hide-because-unmodified (car st-info))
(setq unmodified-count (1+ unmodified-count))) (setq unmodified-count (1+ unmodified-count)))
((svn-status-line-info->hide-because-externals (car st-info))
(setq externals-count (1+ externals-count)))
(t (t
(svn-insert-line-in-status-buffer (car st-info)))) (svn-insert-line-in-status-buffer (car st-info))))
(when (svn-status-line-info->has-usermark (car st-info)) (when (svn-status-line-info->has-usermark (car st-info))
(setq marked-count (+ marked-count 1))) (setq marked-count (+ marked-count 1)))
(setq overlay (make-overlay start-pos (point))) (setq overlay (make-overlay start-pos (point)))
(overlay-put overlay 'svn-info (car st-info)) (overlay-put overlay 'svn-info (car st-info))
(overlay-put overlay 'evaporate t)
(setq st-info (cdr st-info))) (setq st-info (cdr st-info)))
;; Insert status information at the buffer beginning ;; Insert status information at the buffer beginning
(goto-char (point-min)) (goto-char (point-min))
@ -2949,6 +3031,10 @@ Additionally clear the psvn-extra-info field in all line-info lists."
(insert (insert
(format "%d Unmodified file(s) are hidden - press `_' to toggle hiding\n" (format "%d Unmodified file(s) are hidden - press `_' to toggle hiding\n"
unmodified-count))) unmodified-count)))
(when svn-status-hide-externals
(insert
(format "%d Externals file(s) are hidden - press `z' to toggle hiding\n"
externals-count)))
(when (> custom-hide-count 0) (when (> custom-hide-count 0)
(insert (insert
(format "%d file(s) are hidden via the svn-status-custom-hide-function\n" (format "%d file(s) are hidden via the svn-status-custom-hide-function\n"
@ -3188,7 +3274,7 @@ When called from a file buffer provide a structure that contains the filename."
(cond ((eq major-mode 'svn-status-mode) (cond ((eq major-mode 'svn-status-mode)
(svn-status-get-line-information)) (svn-status-get-line-information))
(t (t
;; a fake strukture that contains the buffername for the current buffer ;; a fake structure that contains the buffername for the current buffer
(svn-status-make-line-info (buffer-file-name (current-buffer)))))) (svn-status-make-line-info (buffer-file-name (current-buffer))))))
(defun svn-status-select-line () (defun svn-status-select-line ()
@ -3197,11 +3283,11 @@ When called from a file buffer provide a structure that contains the filename."
(interactive) (interactive)
(let ((info (svn-status-get-line-information))) (let ((info (svn-status-get-line-information)))
(if info (if info
(message "%S hide-because-unknown: %S hide-because-unmodified: %S" info (message "%S hide-because-unknown: %S hide-because-unmodified: %S hide-because-externals: %S" info
(svn-status-line-info->hide-because-unknown info) (svn-status-line-info->hide-because-unknown info)
(svn-status-line-info->hide-because-unmodified info)) (svn-status-line-info->hide-because-unmodified info)
(svn-status-line-info->hide-because-externals info))
(message "No file on this line")))) (message "No file on this line"))))
(defun svn-status-ensure-cursor-on-file () (defun svn-status-ensure-cursor-on-file ()
"Raise an error unless point is on a valid file." "Raise an error unless point is on a valid file."
(unless (svn-status-get-line-information) (unless (svn-status-get-line-information)
@ -3390,13 +3476,15 @@ This means we mark
* all modified files * all modified files
* all files scheduled for addition * all files scheduled for addition
* all files scheduled for deletion * all files scheduled for deletion
* all files with modified properties
The last two categories include all copied and moved files. The last two categories include all copied and moved files.
If called with a prefix ARG, unmark all such files." If called with a prefix ARG, unmark all such files."
(interactive "P") (interactive "P")
(svn-status-mark-added arg) (svn-status-mark-added arg)
(svn-status-mark-modified arg) (svn-status-mark-modified arg)
(svn-status-mark-deleted arg)) (svn-status-mark-deleted arg)
(svn-status-mark-modified-properties arg))
(defun svn-status-unset-all-usermarks () (defun svn-status-unset-all-usermarks ()
(interactive) (interactive)
@ -3455,6 +3543,11 @@ If the function is called with a prefix arg, unmark all these files."
(setq svn-status-hide-unmodified (not svn-status-hide-unmodified)) (setq svn-status-hide-unmodified (not svn-status-hide-unmodified))
(svn-status-update-buffer)) (svn-status-update-buffer))
(defun svn-status-toggle-hide-externals ()
(interactive)
(setq svn-status-hide-externals (not svn-status-hide-externals))
(svn-status-update-buffer))
(defun svn-status-get-file-name-buffer-position (name) (defun svn-status-get-file-name-buffer-position (name)
"Find the buffer position for a file. "Find the buffer position for a file.
If the file is not found, return nil." If the file is not found, return nil."
@ -3551,6 +3644,10 @@ if no files have been marked."
(defun svn-status-create-arg-file (file-name prefix file-info-list postfix) (defun svn-status-create-arg-file (file-name prefix file-info-list postfix)
"Create an svn client argument file"
;; create the arg file on the remote host when we will run svn on this host!
(setq file-name (svn-expand-filename-for-remote-access file-name))
;; (message "svn-status-create-arg-file %s: %s" default-directory file-name)
(with-temp-file file-name (with-temp-file file-name
(insert prefix) (insert prefix)
(let ((st-info file-info-list)) (let ((st-info file-info-list))
@ -4099,22 +4196,29 @@ When called with a prefix argument, ask the user for the revision to update to.
When called with a negative prefix argument, only update the selected files." When called with a negative prefix argument, only update the selected files."
(interactive "P") (interactive "P")
(let* ((selective-update (or (and (numberp arg) (< arg 0)) (eq arg '-))) (let* ((selective-update (or (and (numberp arg) (< arg 0)) (eq arg '-)))
(update-extra-arg)
(rev (when arg (svn-status-read-revision-string (rev (when arg (svn-status-read-revision-string
(if selective-update (if selective-update
(format "Selected entries: Run svn update -r ") (format "Selected entries: Run svn update -r ")
(format "Directory: %s: Run svn update -r " default-directory)) (format "Directory: %s: Run svn update -r " default-directory))
(if selective-update "HEAD" nil))))) (if selective-update "HEAD" nil)))))
(unless svn-client-version
(svn-status-version))
(if (and (<= (car svn-client-version) 1) (< (cadr svn-client-version) 5))
(setq update-extra-arg (list "--non-interactive")) ;; svn version < 1.5
(setq update-extra-arg (list "--accept" "postpone"))) ;; svn version >= 1.5
(if selective-update (if selective-update
(progn (progn
(message "Running svn-update for %s" (svn-status-marked-file-names)) (message "Running svn-update for %s" (svn-status-marked-file-names))
(svn-run t t 'update "update" (svn-run t t 'update "update"
(when rev (list "-r" rev)) (when rev (list "-r" rev))
(list "--non-interactive") update-extra-arg
(svn-status-marked-file-names))) (svn-status-marked-file-names)))
(message "Running svn-update for %s" default-directory) (message "Running svn-update for %s" default-directory)
(svn-run t t 'update "update" (svn-run t t 'update "update"
(when rev (list "-r" rev)) (when rev (list "-r" rev))
(list "--non-interactive") (expand-file-name default-directory))))) update-extra-arg
(svn-local-filename-for-remote-access (expand-file-name default-directory))))))
(defun svn-status-commit () (defun svn-status-commit ()
"Commit selected files. "Commit selected files.
@ -4332,7 +4436,11 @@ static char * data[] = {
(defsubst svn-status-in-vc-mode? () (defsubst svn-status-in-vc-mode? ()
"Is vc-svn active?" "Is vc-svn active?"
(and vc-mode (string-match "^ SVN" (svn-substring-no-properties vc-mode)))) (cond
((fboundp 'vc-backend)
(eq 'SVN (vc-backend buffer-file-name)))
((and (boundp 'vc-mode) vc-mode)
(string-match "^ SVN" (svn-substring-no-properties vc-mode)))))
(when svn-status-fancy-file-state-in-modeline (when svn-status-fancy-file-state-in-modeline
(defadvice vc-find-file-hook (after svn-status-vc-svn-find-file-hook activate) (defadvice vc-find-file-hook (after svn-status-vc-svn-find-file-hook activate)
@ -4831,6 +4939,17 @@ When called with a prefix argument, it is possible to enter a new property."
(message "Edit svn:ignore on %s" dir))) (message "Edit svn:ignore on %s" dir)))
(defun svn-status-property-edit-svn-externals ()
(interactive)
(let* ((line-info (svn-status-get-line-information))
(dir (if (svn-status-line-info->directory-p line-info)
(svn-status-line-info->filename line-info)
(svn-status-get-directory line-info))))
(svn-status-property-edit
(list (svn-status-find-info-for-file-name dir)) "svn:externals")
(message "Edit svn:externals on %s" dir)))
(defun svn-status-property-set-keyword-list () (defun svn-status-property-set-keyword-list ()
"Edit the svn:keywords property on the marked files." "Edit the svn:keywords property on the marked files."
(interactive) (interactive)
@ -4943,9 +5062,9 @@ Commands:
(set-buffer (get-buffer "*svn-property-edit*")) (set-buffer (get-buffer "*svn-property-edit*"))
(when (fboundp 'set-buffer-file-coding-system) (when (fboundp 'set-buffer-file-coding-system)
(set-buffer-file-coding-system svn-status-svn-file-coding-system nil)) (set-buffer-file-coding-system svn-status-svn-file-coding-system nil))
(setq svn-status-temp-file-to-remove (let ((svn-propedit-file-name (concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix)))
(concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix)) (setq svn-status-temp-file-to-remove (svn-expand-filename-for-remote-access svn-propedit-file-name))
(write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1)) (write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1)
(when svn-status-propedit-file-list ; there are files to change properties (when svn-status-propedit-file-list ; there are files to change properties
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-create-arg-file svn-status-temp-arg-file ""
svn-status-propedit-file-list "") svn-status-propedit-file-list "")
@ -4955,10 +5074,10 @@ Commands:
"--targets" svn-status-temp-arg-file "--targets" svn-status-temp-arg-file
(when (eq svn-status-svn-file-coding-system 'utf-8) (when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8")) '("--encoding" "UTF-8"))
"-F" (concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix)) "-F" svn-propedit-file-name)
(unless async (svn-status-remove-temp-file-maybe))) (unless async (svn-status-remove-temp-file-maybe)))
(when svn-status-pre-propedit-window-configuration (when svn-status-pre-propedit-window-configuration
(set-window-configuration svn-status-pre-propedit-window-configuration))) (set-window-configuration svn-status-pre-propedit-window-configuration)))))
(defun svn-prop-edit-svn-diff (arg) (defun svn-prop-edit-svn-diff (arg)
(interactive "P") (interactive "P")
@ -5050,6 +5169,7 @@ Commands:
"Finish editing the log message and run svn commit." "Finish editing the log message and run svn commit."
(interactive) (interactive)
(svn-status-save-some-buffers) (svn-status-save-some-buffers)
(let ((svn-logedit-file-name))
(save-excursion (save-excursion
(set-buffer (get-buffer svn-log-edit-buffer-name)) (set-buffer (get-buffer svn-log-edit-buffer-name))
(when svn-log-edit-insert-files-to-commit (when svn-log-edit-insert-files-to-commit
@ -5057,8 +5177,8 @@ Commands:
(when (fboundp 'set-buffer-file-coding-system) (when (fboundp 'set-buffer-file-coding-system)
(set-buffer-file-coding-system svn-status-svn-file-coding-system nil)) (set-buffer-file-coding-system svn-status-svn-file-coding-system nil))
(when (or svn-log-edit-update-log-entry svn-status-files-to-commit) (when (or svn-log-edit-update-log-entry svn-status-files-to-commit)
(setq svn-status-temp-file-to-remove (setq svn-log-edit-file-name (concat svn-status-temp-dir "svn-log-edit.txt" svn-temp-suffix))
(concat svn-status-temp-dir "svn-log-edit.txt" svn-temp-suffix)) (setq svn-status-temp-file-to-remove (svn-expand-filename-for-remote-access svn-log-edit-file-name))
(write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1)) (write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1))
(bury-buffer)) (bury-buffer))
(if svn-log-edit-update-log-entry (if svn-log-edit-update-log-entry
@ -5066,7 +5186,7 @@ Commands:
;; svn propset svn:log --revprop -r11672 -F file ;; svn propset svn:log --revprop -r11672 -F file
(svn-run nil t 'propset "propset" "svn:log" "--revprop" (svn-run nil t 'propset "propset" "svn:log" "--revprop"
(concat "-r" svn-log-edit-update-log-entry) (concat "-r" svn-log-edit-update-log-entry)
"-F" svn-status-temp-file-to-remove) "-F" svn-log-edit-file-name)
(save-excursion (save-excursion
(set-buffer svn-process-buffer-name) (set-buffer svn-process-buffer-name)
(message "%s" (buffer-substring (point-min) (- (point-max) 1))))) (message "%s" (buffer-substring (point-min) (- (point-max) 1)))))
@ -5074,17 +5194,16 @@ Commands:
(setq svn-status-operated-on-dot (setq svn-status-operated-on-dot
(and (= 1 (length svn-status-files-to-commit)) (and (= 1 (length svn-status-files-to-commit))
(string= "." (svn-status-line-info->filename (car svn-status-files-to-commit))))) (string= "." (svn-status-line-info->filename (car svn-status-files-to-commit)))))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-create-arg-file svn-status-temp-arg-file "" svn-status-files-to-commit "")
svn-status-files-to-commit "")
(svn-run t t 'commit "commit" (svn-run t t 'commit "commit"
(unless svn-status-recursive-commit "--non-recursive") (unless svn-status-recursive-commit "--non-recursive")
"--targets" svn-status-temp-arg-file "--targets" svn-status-temp-arg-file
"-F" svn-status-temp-file-to-remove "-F" svn-log-edit-file-name
(when (eq svn-status-svn-file-coding-system 'utf-8) (when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8")) '("--encoding" "UTF-8"))
svn-status-default-commit-arguments)) svn-status-default-commit-arguments))
(set-window-configuration svn-status-pre-commit-window-configuration) (set-window-configuration svn-status-pre-commit-window-configuration)
(message "svn-log editing done"))) (message "svn-log editing done"))))
(defun svn-log-edit-svn-diff (arg) (defun svn-log-edit-svn-diff (arg)
"Show the diff we are about to commit. "Show the diff we are about to commit.
@ -5136,7 +5255,7 @@ If ARG then show diff between some other version of the selected files."
(let ((buf-size (- (point-max) (point-min)))) (let ((buf-size (- (point-max) (point-min))))
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(insert "## Lines starting with '## ' will be removed from the log message.\n") (insert svn-log-edit-header)
(insert "## File(s) to commit" (insert "## File(s) to commit"
(if svn-status-recursive-commit " recursively" "") ":\n") (if svn-status-recursive-commit " recursively" "") ":\n")
(let ((file-list svn-status-files-to-commit)) (let ((file-list svn-status-files-to-commit))
@ -5359,7 +5478,8 @@ Commands:
"Mark the revision at point to be used as diff against revision." "Mark the revision at point to be used as diff against revision."
(interactive) (interactive)
(let ((start-pos) (let ((start-pos)
(point-at-partner-rev)) (point-at-partner-rev)
(overlay))
(dolist (ov (overlays-in (point-min) (point-max))) (dolist (ov (overlays-in (point-min) (point-max)))
(when (overlay-get ov 'svn-log-partner-revision) (when (overlay-get ov 'svn-log-partner-revision)
(setq point-at-partner-rev (and (>= (point) (overlay-start ov)) (setq point-at-partner-rev (and (>= (point) (overlay-start ov))
@ -5803,23 +5923,33 @@ The optional prefix argument ARG determines which switches are passed to `svn lo
"Show statistics for the current blame buffer." "Show statistics for the current blame buffer."
(interactive) (interactive)
(let ((author-map (make-hash-table :test 'equal)) (let ((author-map (make-hash-table :test 'equal))
(revision-map (make-hash-table :test 'equal))
(rev-info)
(author-list) (author-list)
(author)) (author)
(revision-list)
(revision))
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(while (not (eobp)) (while (not (eobp))
(dolist (ov (overlays-in (svn-point-at-bol) (line-end-position))) (dolist (ov (overlays-in (svn-point-at-bol) (line-end-position)))
(when (overlay-get ov 'svn-blame-line-info) (when (overlay-get ov 'svn-blame-line-info)
(setq author (cadr (overlay-get ov 'rev-info))) (setq rev-info (overlay-get ov 'rev-info))
(svn-puthash author (setq author (cadr rev-info))
(+ (gethash author author-map 0) 1) (setq revision (string-to-number (car rev-info)))
author-map))) (svn-puthash author (+ (gethash author author-map 0) 1) author-map)
(svn-puthash revision (+ (gethash revision revision-map 0) 1) revision-map)))
(forward-line)) (forward-line))
(maphash '(lambda (key value) (add-to-list 'author-list (list key value))) author-map) (maphash '(lambda (key value) (add-to-list 'author-list (list key value))) author-map)
(maphash '(lambda (key value) (add-to-list 'revision-list (list key value))) revision-map)
(pop-to-buffer (get-buffer-create (replace-regexp-in-string "svn-blame:" "svn-blame-statistics:" (buffer-name)))) (pop-to-buffer (get-buffer-create (replace-regexp-in-string "svn-blame:" "svn-blame-statistics:" (buffer-name))))
(erase-buffer) (erase-buffer)
(insert (propertize "Authors:\n" 'face 'font-lock-function-name-face))
(dolist (line (sort author-list '(lambda (v1 v2) (> (cadr v1) (cadr v2))))) (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")))) (insert (format "%s: %s line%s\n" (car line) (cadr line) (if (eq (cadr line) 1) "" "s"))))
(insert (propertize "\nRevisions:\n" 'face 'font-lock-function-name-face))
(dolist (line (sort revision-list '(lambda (v1 v2) (< (car v1) (car v2)))))
(insert (format "%s: %s line%s\n" (car line) (cadr line) (if (eq (cadr line) 1) "" "s"))))
(goto-char (point-min))))) (goto-char (point-min)))))
(defun svn-blame-highlight-author-field (ov) (defun svn-blame-highlight-author-field (ov)

View File

@ -1 +1 @@
e5109da756d74c7d98f683f004a539af subversion-1.6.6.tar.bz2 75419159b50661092c4137449940b5cc subversion-1.6.11.tar.bz2

View File

@ -19,7 +19,7 @@ kde4-config to report the directory which contains the .so files.
LIBS="$LIBS $SVN_KWALLET_LIBS" LIBS="$LIBS $SVN_KWALLET_LIBS"
qt_lib_dirs="`$PKG_CONFIG --libs-only-L QtCore QtDBus QtGui`" qt_lib_dirs="`$PKG_CONFIG --libs-only-L QtCore QtDBus QtGui`"
- LDFLAGS="$old_LDFLAGS $qt_lib_dirs -L$kde_dir/lib`$kde4_config --libsuffix`" - LDFLAGS="$old_LDFLAGS $qt_lib_dirs -L$kde_dir/lib`$kde4_config --libsuffix`"
+ LDFLAGS="$old_LDFLAGS $qt_lib_dirs -L/usr/lib`$kde4_config --libsuffix`/kde4/devel" + LDFLAGS="$old_LDFLAGS $qt_lib_dirs -L$libdir/kde4/devel"
AC_LANG(C++) AC_LANG(C++)
AC_LINK_IFELSE([ AC_LINK_IFELSE([
#include <kwallet.h> #include <kwallet.h>

View File

@ -16,11 +16,11 @@
Summary: A Modern Concurrent Version Control System Summary: A Modern Concurrent Version Control System
Name: subversion Name: subversion
Version: 1.6.6 Version: 1.6.11
Release: 1%{?dist} Release: 1%{?dist}
License: ASL 1.1 License: ASL 1.1
Group: Development/Tools Group: Development/Tools
URL: http://subversion.tigris.org/ URL: http://subversion.apache.org/
Source0: http://subversion.tigris.org/downloads/subversion-%{version}.tar.bz2 Source0: http://subversion.tigris.org/downloads/subversion-%{version}.tar.bz2
Source1: subversion.conf Source1: subversion.conf
Source3: filter-requires.sh Source3: filter-requires.sh
@ -170,6 +170,8 @@ if [ "$v" != "%{svn2cl_version}" ]; then
exit 1 exit 1
fi fi
mv tools/client-side/bash_completion .
%build %build
# Regenerate the buildsystem, so that: # Regenerate the buildsystem, so that:
# 1) patches applied to configure.in take effect # 1) patches applied to configure.in take effect
@ -192,7 +194,8 @@ export CC=gcc CXX=g++ JAVA_HOME=%{jdk_path} CFLAGS="$RPM_OPT_FLAGS"
--disable-static --with-sasl=%{_prefix} \ --disable-static --with-sasl=%{_prefix} \
--disable-neon-version-check \ --disable-neon-version-check \
--with-gnome-keyring \ --with-gnome-keyring \
--with-kwallet --with-kwallet \
--with-berkeley-db || (cat config.log; exit 1)
make %{?_smp_mflags} all make %{?_smp_mflags} all
make swig-py swig-py-lib %{swigdirs} make swig-py swig-py-lib %{swigdirs}
make swig-pl swig-pl-lib swig-rb swig-rb-lib make swig-pl swig-pl-lib swig-rb swig-rb-lib
@ -259,10 +262,11 @@ install -m 644 $RPM_SOURCE_DIR/psvn-init.el \
# Rename authz_svn INSTALL doc for docdir # Rename authz_svn INSTALL doc for docdir
ln -f subversion/mod_authz_svn/INSTALL mod_authz_svn-INSTALL ln -f subversion/mod_authz_svn/INSTALL mod_authz_svn-INSTALL
# Trim exported dependencies to SVN and APR libraries only: # Trim exported dependencies to APR libraries only:
sed -i "/^dependency_libs/{ sed -i "/^dependency_libs/{
s, -l[^ ']*, ,g; s, -l[^ ']*, ,g;
s,%{_libdir}/lib[^sa][^vp][^nr].*.la, ,g; s, -L[^ ']*, ,g;
s,%{_libdir}/lib[^a][^p][^r][^ ']*.la, ,g;
}" $RPM_BUILD_ROOT%{_libdir}/*.la }" $RPM_BUILD_ROOT%{_libdir}/*.la
# Install svn2cl # Install svn2cl
@ -274,7 +278,7 @@ install -Dpm 644 svn2cl.1 $RPM_BUILD_ROOT%{_mandir}/man1/svn2cl.1
popd popd
# Install bash completion # Install bash completion
install -Dpm 644 tools/client-side/bash_completion \ install -Dpm 644 bash_completion \
$RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d/%{name} $RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d/%{name}
%find_lang %{name} %find_lang %{name}
@ -318,8 +322,10 @@ rm -rf ${RPM_BUILD_ROOT}
%doc contrib/client-side/svnmerge/*.{README,py} %doc contrib/client-side/svnmerge/*.{README,py}
%doc contrib/client-side/wcgrep %doc contrib/client-side/wcgrep
%{_bindir}/* %{_bindir}/*
%exclude %{_bindir}/svn2cl
%{_libdir}/libsvn_*.so.* %{_libdir}/libsvn_*.so.*
%{_mandir}/man*/* %{_mandir}/man*/*
%exclude %{_mandir}/man1/svn2cl.1*
%{python_sitearch}/svn %{python_sitearch}/svn
%{python_sitearch}/libsvn %{python_sitearch}/libsvn
%{_datadir}/emacs/site-lisp/*.el %{_datadir}/emacs/site-lisp/*.el
@ -385,6 +391,31 @@ rm -rf ${RPM_BUILD_ROOT}
%{_mandir}/man1/svn2cl.1* %{_mandir}/man1/svn2cl.1*
%changelog %changelog
* Sat Apr 17 2010 Joe Orton <jorton@redhat.com> - 1.6.11-1
- update to 1.6.11
* Sat Feb 13 2010 Joe Orton <jorton@redhat.com> - 1.6.9-2
- fix detection of libkdecore
* Mon Feb 8 2010 Joe Orton <jorton@redhat.com> - 1.6.9-1
- update to 1.6.9 (#561810)
- fix comments in subversion.conf (#551484)
- update to psvn.el r40299
* Mon Jan 25 2010 Ville Skyttä <ville.skytta@iki.fi> - 1.6.6-5
- Include svn2cl and its man page only in the -svn2cl subpackage (#558598).
- Do not include bash completion in docs, it's installed.
* Mon Dec 7 2009 Stepan Kasal <skasal@redhat.com> - 1.6.6-4
- rebuild against perl 5.10.1
* Thu Nov 26 2009 Joe Orton <jorton@redhat.com> - 1.6.6-3
- rebuild for new db4
- trim libsvn_* from dependency_libs in *.la
* Wed Nov 25 2009 Kevin Kofler <Kevin@tigcc.ticalc.org> 1.6.6-2
- rebuild for Qt 4.6.0 RC1 in F13 (was built against Beta 1 with unstable ABI)
* Sun Nov 8 2009 Joe Orton <jorton@redhat.com> - 1.6.6-1 * Sun Nov 8 2009 Joe Orton <jorton@redhat.com> - 1.6.6-1
- update to 1.6.6 - update to 1.6.6

View File

@ -1259,3 +1259,599 @@ ePMv0mMRDHwkFCGAYG3VNPTu3kxjqXenc6CArh5UH7q2p44t6zdSJ4cfIyJrrREF
9ccVt/By4ioL6XI/gINS5/JCAJ4ixpserlf0PeelTtVrkLpHylWyhg== 9ccVt/By4ioL6XI/gINS5/JCAJ4ixpserlf0PeelTtVrkLpHylWyhg==
=/QO8 =/QO8
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
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
7er0at7C8YwwLvB0aEONMR81
=RMom
-----END PGP PUBLIC KEY BLOCK-----