- update to 1.6.9 (#561810)

- fix comments in subversion.conf (#551484)
- update to psvn.el r40299
This commit is contained in:
jorton 2010-02-08 21:44:43 +00:00
parent c3f2f9e55f
commit f41b0b2b4c
9 changed files with 793 additions and 156 deletions

View File

@ -1,2 +1,3 @@
subversion-1.6.5.tar.bz2 subversion-1.6.5.tar.bz2
subversion-1.6.6.tar.bz2 subversion-1.6.6.tar.bz2
subversion-1.6.9.tar.bz2

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 9c30a47b1d48664e7afef68bb4834c53 subversion-1.6.9.tar.bz2

View File

@ -1,35 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAkrXTlsACgkQCwOubk4kUXyyPgCeOJk5kVF+eoByU6GKZkzm2r9m
3mMAnjZusFZJ+qGd/MIT7fDc66Ey8TuQ
=3Uhc
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAkrX9ZkACgkQ9o1G+2zNQDh15wCglUp6nbw3tpP04O5ljud2QccS
7NcAmwViX8mR2X5itH3N0KVk1VQj0WOO
=v+Og
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)
iD8DBQBK2I/RNR8z5DU+JbwRAsgkAJ0dU8J/GakhF3qezvb/JgkpSDF6swCfQKHX
M2bPkCtBdNwjBDqeho4wRpg=
=jPxs
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)
iEYEABECAAYFAkre/ukACgkQ/P1jBZgh97JaEACgm58i2b7byLEQ3yGWv+yl/hj3
5yYAnROYRntwtZKCbaekYVxVhBtieugD
=tm1D
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAkrfLvsACgkQokEGqRcG/W7dxwCdFP46PMY3UyEoMBZN0OInI2VW
FpUAn0nnfdaWMN21My5Xhru9xGeK2XQ5
=ve9G
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,35 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAktXa4MACgkQCwOubk4kUXx7ygCfZhrG1g3yIXJFXzE43cvRa/Km
4twAoIwwFkYnPLScBDJLqV892Nj+66eV
=fTxc
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)
iEYEABECAAYFAktYGmcACgkQ/P1jBZgh97InrgCgrsdwyhVH3AqraTusUY7rcaZV
8hcAnA26+HHdB2hsV/SOR6vERCrE1Mdk
=72+d
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAktYI6AACgkQ9o1G+2zNQDjMugCfYS/nx1JBSjek3tSz3PWl5P7M
ngQAoKa6tZEUi90RGDx6g3IRk1JuliWU
=lrHM
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAktYaNsACgkQokEGqRcG/W6J0gCgwbrbld0pqpQvtHAbD+q1Z2+v
z3QAn3W/MbUedXAGTXFtT6yDEH8tnisC
=DBmT
-----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
iEYEABECAAYFAktYtHQACgkQNR8z5DU+JbxMiQCfdfOVHogW1sZnr0cOCrMBQwD5
FscAni6sZWK+c0eJtAUlyEHQyA4Mh7P7
=WVnC
-----END PGP SIGNATURE-----

View File

@ -20,7 +20,7 @@ LoadModule authz_svn_module modules/mod_authz_svn.so
# # cd /var/www/svn # # cd /var/www/svn
# # svnadmin create stuff # # svnadmin create stuff
# # chown -R apache.apache stuff # # chown -R apache.apache stuff
# # chcon -R -t -t http_sys_content_rw_t stuff # # chcon -R -t http_sys_content_t stuff
# #
#<Location /repos> #<Location /repos>

View File

@ -16,8 +16,8 @@
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.9
Release: 5%{?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.tigris.org/
@ -391,6 +391,11 @@ rm -rf ${RPM_BUILD_ROOT}
%{_mandir}/man1/svn2cl.1* %{_mandir}/man1/svn2cl.1*
%changelog %changelog
* 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 * 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). - Include svn2cl and its man page only in the -svn2cl subpackage (#558598).
- Do not include bash completion in docs, it's installed. - Do not include bash completion in docs, it's installed.

View File

@ -1 +1 @@
subversion-1.6.6.tar.bz2 subversion-1.6.9.tar.bz2

View File

@ -1259,3 +1259,504 @@ 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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
=B4XR
-----END PGP PUBLIC KEY BLOCK-----