diff --git a/.cvsignore b/.cvsignore index 1fd0408..8a07085 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1,3 @@ subversion-1.6.5.tar.bz2 subversion-1.6.6.tar.bz2 +subversion-1.6.9.tar.bz2 diff --git a/psvn.el b/psvn.el index 643afa3..6af3a2b 100644 --- a/psvn.el +++ b/psvn.el @@ -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 -;; $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 ;; 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) diff --git a/sources b/sources index cfb214d..ae6f6fb 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -e5109da756d74c7d98f683f004a539af subversion-1.6.6.tar.bz2 +9c30a47b1d48664e7afef68bb4834c53 subversion-1.6.9.tar.bz2 diff --git a/subversion-1.6.6.tar.bz2.asc b/subversion-1.6.6.tar.bz2.asc deleted file mode 100644 index 5d0321d..0000000 --- a/subversion-1.6.6.tar.bz2.asc +++ /dev/null @@ -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----- diff --git a/subversion-1.6.9.tar.bz2.asc b/subversion-1.6.9.tar.bz2.asc new file mode 100644 index 0000000..517fa6d --- /dev/null +++ b/subversion-1.6.9.tar.bz2.asc @@ -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----- diff --git a/subversion.conf b/subversion.conf index 0199daa..e3671d4 100644 --- a/subversion.conf +++ b/subversion.conf @@ -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 # # diff --git a/subversion.spec b/subversion.spec index 8bf2c45..a1c38db 100644 --- a/subversion.spec +++ b/subversion.spec @@ -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 - 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ä - 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. diff --git a/upstream b/upstream index 398431b..78c0c49 100644 --- a/upstream +++ b/upstream @@ -1 +1 @@ -subversion-1.6.6.tar.bz2 +subversion-1.6.9.tar.bz2 diff --git a/upstream-key.gpg b/upstream-key.gpg index 29b0207..4a9c45e 100644 --- a/upstream-key.gpg +++ b/upstream-key.gpg @@ -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-----