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

362
psvn.el
View File

@ -1,8 +1,8 @@
;;; 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>
;; $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
;; it under the terms of the GNU General Public License as published by
@ -22,7 +22,7 @@
;;; Commentary
;; 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
;; 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
;; ? - svn-status-toggle-hide-unknown
;; _ - svn-status-toggle-hide-unmodified
;; z - svn-status-toggle-hide-externals
;; m - svn-status-set-user-mark
;; u - svn-status-unset-user-mark
;; $ - svn-status-toggle-elide
@ -103,6 +104,7 @@
;; P i - svn-status-property-ignore-file
;; P I - svn-status-property-ignore-file-extension
;; 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 i - svn-status-property-set-keyword-id
;; P K d - svn-status-property-set-keyword-date
@ -245,6 +247,7 @@
(eval-when-compile (require 'dired))
(eval-when-compile (require 'ediff-util))
(eval-when-compile (require 'ediff-wind))
(eval-when-compile (require 'vc-hooks))
(eval-when-compile (require 'elp))
(eval-when-compile (require 'pp))
@ -253,7 +256,7 @@
(require 'diff-mode))
(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.")
;;; 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]."
:type 'boolean
: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
"*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)
;; 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
'((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.
@ -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)
;; 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")
(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)
(if (fboundp 'substring-no-properties)
(substring-no-properties string from to)
(substring string from to)))
(substring string (or from 0) to)))
; xemacs
;; 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)
(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.
;; To find out whether the `alist' widget exists, we cannot check just
;; (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 "c") 'svn-status-commit)
(define-key svn-global-keymap (kbd "S") 'svn-status-switch-to-status-buffer)
(define-key svn-global-keymap (kbd "o") 'svn-status-pop-to-status-buffer))
(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 ()
"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" "")))))
(save-excursion
(set-buffer status-buf)
(buffer-disable-undo)
(setq default-directory dir)
(set-buffer proc-buf)
(setq default-directory dir
svn-status-remote (when arg t))
(set-buffer cur-buf)
(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)))))
@ -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 ()
(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 ()
"Construct the environment for the svn process.
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-mode-line-process-status (format " running %s" cmdtype))
(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))
(if run-asynchron
(progn
@ -1320,8 +1357,8 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(replace-match "/")))))
(defun svn-process-sentinel (process event)
"Called after a svn process has finished."
;;(princ (format "Process: %s had the event `%s'" process event)))
;;(save-excursion
(let ((act-buf (current-buffer)))
(when svn-pre-run-mode-line-process
(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))
;; find last error message and show it.
(goto-char (point-max))
(if (re-search-backward "^svn: \\(.*\\)" nil t)
(svn-process-handle-error (match-string 1))
(if (re-search-backward "^svn: " nil t)
(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)))
(t
(message "svn process had unknown event: %s" event))
(svn-status-show-process-output nil t))))
(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)
(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 ()
(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."))))))
(if help-msg
(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))))
(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)
@ -1485,17 +1535,17 @@ The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
(insert str)
(save-excursion
(goto-char (svn-point-at-bol))
(when (looking-at "Password for '\\(.+\\)': ")
(when (looking-at "Password for '\\(.*\\)': ")
;(svn-status-show-process-buffer)
(let ((passwd (read-passwd
(format "Enter svn password for %s: " (match-string 1)))))
(svn-process-send-string-and-newline passwd t)))
(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)))
(when (looking-at "(R)eject, accept (t)emporarily or accept (p)ermanently")
(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)))))))
(defun svn-revert-some-buffers (&optional tree)
@ -1696,10 +1746,10 @@ The results are used to build the `svn-status-info' variable."
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-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
(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
(when (eq svn-property-mark ?\ ) (setq svn-property-mark nil))
(when (eq svn-wc-locked-mark ?\ ) (setq svn-wc-locked-mark nil))
(when (eq svn-with-history-mark ?\ ) (setq svn-with-history-mark nil))
@ -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))))))
;;(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)
"Return t if A should appear before B in the `svn-status-buffer-name' buffer.
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)
(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
;;(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t] "PCL-CVS")
(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t])
@ -1877,10 +1942,10 @@ A and B must be line-info's."
;; XEmacs allows simultaneous connections to multiple devices with
;; different keyboards.
(define-key svn-status-mode-map
(if (member (kbd "DEL") '([(delete)] [delete]))
[(backspace)] ; XEmacs
(kbd "DEL")) ; GNU Emacs
'svn-status-unset-user-mark-backwards)
(if (member (kbd "DEL") '([(delete)] [delete]))
[(backspace)] ; XEmacs
(kbd "DEL")) ; GNU Emacs
'svn-status-unset-user-mark-backwards)
(define-key svn-status-mode-map (kbd "$") 'svn-status-toggle-elide)
(define-key svn-status-mode-map (kbd "w") 'svn-status-copy-current-line-info)
(define-key svn-status-mode-map (kbd ".") 'svn-status-goto-root-or-return)
@ -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 "?") 'svn-status-toggle-hide-unknown)
(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-recursively)
(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'.
(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 "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 "Ki") 'svn-status-property-set-keyword-id)
(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]
["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]
["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]
@ -2100,6 +2169,8 @@ A and B must be line-info's."
:style toggle :selected svn-status-hide-unknown]
["Hide Unmodified" svn-status-toggle-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]
["Prepare bug report" svn-prepare-bug-report t]
))
@ -2145,7 +2216,7 @@ PREFIX is passed to `popup-menu'."
(progn
(setq o (make-overlay begin end))
(overlay-put o 'face face)
(sit-for 0)
(save-excursion (sit-for 0))
(popup-menu menu prefix))
(delete-overlay o))))
@ -2332,7 +2403,7 @@ history, when it will be \"+\"."
(defun svn-status-line-info->switched (line-info)
"Return whether LINE-INFO is switched relative to its parent.
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))
(defun svn-status-line-info->repo-locked (line-info)
"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"
(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-externals 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->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
(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)
(and svn-status-custom-hide-function
(apply svn-status-custom-hide-function (list line-info))))
@ -2491,26 +2567,27 @@ When called with a prefix argument, toggle the hiding of all subdirectories for
(len-test)
(elided-list)
(elide-mark))
(while st-info
(setq fname (svn-status-line-info->filename (car st-info)))
(setq len-fname (length fname))
(setq elided-list svn-status-elided-list)
(setq elide-mark nil)
(while elided-list
(setq test (car elided-list))
(when (string= test ".")
(setq test ""))
(setq len-test (length test))
(when (and (>= len-fname len-test)
(string= (substring fname 0 len-test) test))
(setq elide-mark t)
(when (or (string= fname ".")
(and (= len-fname len-test) (svn-status-line-info->directory-p (car st-info))))
(setq elide-mark 'directory)))
(setq elided-list (cdr elided-list)))
;;(message "fname: %s elide-mark: %S" fname elide-mark)
(setcar (nthcdr 1 (svn-status-line-info->ui-status (car st-info))) elide-mark)
(setq st-info (cdr st-info))))
(when svn-status-elided-list
(while st-info
(setq fname (svn-status-line-info->filename (car st-info)))
(setq len-fname (length fname))
(setq elided-list svn-status-elided-list)
(setq elide-mark nil)
(while elided-list
(setq test (car elided-list))
(when (string= test ".")
(setq test ""))
(setq len-test (length test))
(when (and (>= len-fname len-test)
(string= (substring fname 0 len-test) test))
(setq elide-mark t)
(when (or (string= fname ".")
(and (= len-fname len-test) (svn-status-line-info->directory-p (car st-info))))
(setq elide-mark 'directory)))
(setq elided-list (cdr elided-list)))
;;(message "fname: %s elide-mark: %S" fname elide-mark)
(setcar (nthcdr 1 (svn-status-line-info->ui-status (car st-info))) elide-mark)
(setq st-info (cdr st-info)))))
(svn-status-update-buffer))
(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
(concat
(if (or svn-status-display-full-path
svn-status-hide-unmodified)
svn-status-hide-unmodified
svn-status-hide-externals)
(svn-add-face
(let ((dir-name (file-name-as-directory
(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 ]")
(t " [ REPO-LOCK-UNKNOWN ]")))
'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)
elide-hint)
'svn-status-marked-face)
@ -2891,6 +2969,7 @@ Additionally clear the psvn-extra-info field in all line-info lists."
(overlay)
(unmodified-count 0) ;how many unmodified 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
(marked-count 0) ;how many files are elided
(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)))
((svn-status-line-info->hide-because-unmodified (car st-info))
(setq unmodified-count (1+ unmodified-count)))
((svn-status-line-info->hide-because-externals (car st-info))
(setq externals-count (1+ externals-count)))
(t
(svn-insert-line-in-status-buffer (car st-info))))
(when (svn-status-line-info->has-usermark (car st-info))
(setq marked-count (+ marked-count 1)))
(setq overlay (make-overlay start-pos (point)))
(overlay-put overlay 'svn-info (car st-info))
(overlay-put overlay 'evaporate t)
(setq st-info (cdr st-info)))
;; Insert status information at the buffer beginning
(goto-char (point-min))
@ -2949,6 +3031,10 @@ Additionally clear the psvn-extra-info field in all line-info lists."
(insert
(format "%d Unmodified file(s) are hidden - press `_' to toggle hiding\n"
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)
(insert
(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)
(svn-status-get-line-information))
(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))))))
(defun svn-status-select-line ()
@ -3197,12 +3283,12 @@ When called from a file buffer provide a structure that contains the filename."
(interactive)
(let ((info (svn-status-get-line-information)))
(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-unmodified info))
(svn-status-line-info->hide-because-unmodified info)
(svn-status-line-info->hide-because-externals info))
(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."
(unless (svn-status-get-line-information)
(error "No file on the current line")))
@ -3390,13 +3476,15 @@ This means we mark
* all modified files
* all files scheduled for addition
* all files scheduled for deletion
* all files with modified properties
The last two categories include all copied and moved files.
If called with a prefix ARG, unmark all such files."
(interactive "P")
(svn-status-mark-added 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 ()
(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))
(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)
"Find the buffer position for a file.
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)
"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
(insert prefix)
(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."
(interactive "P")
(let* ((selective-update (or (and (numberp arg) (< arg 0)) (eq arg '-)))
(update-extra-arg)
(rev (when arg (svn-status-read-revision-string
(if selective-update
(format "Selected entries: Run svn update -r ")
(format "Directory: %s: Run svn update -r " default-directory))
(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
(progn
(message "Running svn-update for %s" (svn-status-marked-file-names))
(svn-run t t 'update "update"
(when rev (list "-r" rev))
(list "--non-interactive")
update-extra-arg
(svn-status-marked-file-names)))
(message "Running svn-update for %s" default-directory)
(svn-run t t 'update "update"
(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 ()
"Commit selected files.
@ -4332,7 +4436,11 @@ static char * data[] = {
(defsubst svn-status-in-vc-mode? ()
"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
(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)))
(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 ()
"Edit the svn:keywords property on the marked files."
(interactive)
@ -4943,22 +5062,22 @@ Commands:
(set-buffer (get-buffer "*svn-property-edit*"))
(when (fboundp 'set-buffer-file-coding-system)
(set-buffer-file-coding-system svn-status-svn-file-coding-system nil))
(setq svn-status-temp-file-to-remove
(concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix))
(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
(svn-status-create-arg-file svn-status-temp-arg-file ""
svn-status-propedit-file-list "")
(setq svn-status-propedit-file-list nil)
(svn-run async t 'propset "propset"
svn-status-propedit-property-name
"--targets" svn-status-temp-arg-file
(when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8"))
"-F" (concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix))
(unless async (svn-status-remove-temp-file-maybe)))
(when svn-status-pre-propedit-window-configuration
(set-window-configuration svn-status-pre-propedit-window-configuration)))
(let ((svn-propedit-file-name (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)
(when svn-status-propedit-file-list ; there are files to change properties
(svn-status-create-arg-file svn-status-temp-arg-file ""
svn-status-propedit-file-list "")
(setq svn-status-propedit-file-list nil)
(svn-run async t 'propset "propset"
svn-status-propedit-property-name
"--targets" svn-status-temp-arg-file
(when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8"))
"-F" svn-propedit-file-name)
(unless async (svn-status-remove-temp-file-maybe)))
(when svn-status-pre-propedit-window-configuration
(set-window-configuration svn-status-pre-propedit-window-configuration)))))
(defun svn-prop-edit-svn-diff (arg)
(interactive "P")
@ -5050,41 +5169,41 @@ Commands:
"Finish editing the log message and run svn commit."
(interactive)
(svn-status-save-some-buffers)
(save-excursion
(set-buffer (get-buffer svn-log-edit-buffer-name))
(when svn-log-edit-insert-files-to-commit
(svn-log-edit-remove-comment-lines))
(when (fboundp 'set-buffer-file-coding-system)
(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)
(setq svn-status-temp-file-to-remove
(concat svn-status-temp-dir "svn-log-edit.txt" svn-temp-suffix))
(write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1))
(bury-buffer))
(if svn-log-edit-update-log-entry
(when (y-or-n-p "Update the log entry? ")
;; svn propset svn:log --revprop -r11672 -F file
(svn-run nil t 'propset "propset" "svn:log" "--revprop"
(concat "-r" svn-log-edit-update-log-entry)
"-F" svn-status-temp-file-to-remove)
(save-excursion
(set-buffer svn-process-buffer-name)
(message "%s" (buffer-substring (point-min) (- (point-max) 1)))))
(when svn-status-files-to-commit ; there are files to commit
(setq svn-status-operated-on-dot
(and (= 1 (length 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-files-to-commit "")
(svn-run t t 'commit "commit"
(unless svn-status-recursive-commit "--non-recursive")
"--targets" svn-status-temp-arg-file
"-F" svn-status-temp-file-to-remove
(when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8"))
svn-status-default-commit-arguments))
(set-window-configuration svn-status-pre-commit-window-configuration)
(message "svn-log editing done")))
(let ((svn-logedit-file-name))
(save-excursion
(set-buffer (get-buffer svn-log-edit-buffer-name))
(when svn-log-edit-insert-files-to-commit
(svn-log-edit-remove-comment-lines))
(when (fboundp 'set-buffer-file-coding-system)
(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)
(setq svn-log-edit-file-name (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))
(bury-buffer))
(if svn-log-edit-update-log-entry
(when (y-or-n-p "Update the log entry? ")
;; svn propset svn:log --revprop -r11672 -F file
(svn-run nil t 'propset "propset" "svn:log" "--revprop"
(concat "-r" svn-log-edit-update-log-entry)
"-F" svn-log-edit-file-name)
(save-excursion
(set-buffer svn-process-buffer-name)
(message "%s" (buffer-substring (point-min) (- (point-max) 1)))))
(when svn-status-files-to-commit ; there are files to commit
(setq svn-status-operated-on-dot
(and (= 1 (length 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-files-to-commit "")
(svn-run t t 'commit "commit"
(unless svn-status-recursive-commit "--non-recursive")
"--targets" svn-status-temp-arg-file
"-F" svn-log-edit-file-name
(when (eq svn-status-svn-file-coding-system 'utf-8)
'("--encoding" "UTF-8"))
svn-status-default-commit-arguments))
(set-window-configuration svn-status-pre-commit-window-configuration)
(message "svn-log editing done"))))
(defun svn-log-edit-svn-diff (arg)
"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))))
(save-excursion
(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"
(if svn-status-recursive-commit " recursively" "") ":\n")
(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."
(interactive)
(let ((start-pos)
(point-at-partner-rev))
(point-at-partner-rev)
(overlay))
(dolist (ov (overlays-in (point-min) (point-max)))
(when (overlay-get ov 'svn-log-partner-revision)
(setq point-at-partner-rev (and (>= (point) (overlay-start ov))
@ -5803,23 +5923,33 @@ The optional prefix argument ARG determines which switches are passed to `svn lo
"Show statistics for the current blame buffer."
(interactive)
(let ((author-map (make-hash-table :test 'equal))
(revision-map (make-hash-table :test 'equal))
(rev-info)
(author-list)
(author))
(author)
(revision-list)
(revision))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(dolist (ov (overlays-in (svn-point-at-bol) (line-end-position)))
(when (overlay-get ov 'svn-blame-line-info)
(setq author (cadr (overlay-get ov 'rev-info)))
(svn-puthash author
(+ (gethash author author-map 0) 1)
author-map)))
(setq rev-info (overlay-get ov 'rev-info))
(setq author (cadr rev-info))
(setq revision (string-to-number (car rev-info)))
(svn-puthash author (+ (gethash author author-map 0) 1) author-map)
(svn-puthash revision (+ (gethash revision revision-map 0) 1) revision-map)))
(forward-line))
(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))))
(erase-buffer)
(insert (propertize "Authors:\n" 'face 'font-lock-function-name-face))
(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 (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)))))
(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
# # svnadmin create 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>

View File

@ -16,8 +16,8 @@
Summary: A Modern Concurrent Version Control System
Name: subversion
Version: 1.6.6
Release: 5%{?dist}
Version: 1.6.9
Release: 1%{?dist}
License: ASL 1.1
Group: Development/Tools
URL: http://subversion.tigris.org/
@ -391,6 +391,11 @@ rm -rf ${RPM_BUILD_ROOT}
%{_mandir}/man1/svn2cl.1*
%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
- Include svn2cl and its man page only in the -svn2cl subpackage (#558598).
- 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==
=/QO8
-----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-----