- update to 1.3.1

- update to psvn.el r19138 (Stefan Reichoer)
- build -java on s390 again
This commit is contained in:
jorton 2006-04-04 09:21:08 +00:00
parent 054d8deaae
commit a73eb47ead
5 changed files with 601 additions and 233 deletions

300
psvn.el
View File

@ -1,8 +1,8 @@
;;; psvn.el --- Subversion interface for emacs ;;; psvn.el --- Subversion interface for emacs
;; Copyright (C) 2002-2005 by Stefan Reichoer ;; Copyright (C) 2002-2006 by Stefan Reichoer
;; Author: Stefan Reichoer, <stefan@xsteve.at> ;; Author: Stefan Reichoer, <stefan@xsteve.at>
;; $Id: psvn.el 17921 2005-12-22 23:06:36Z xsteve $ ;; $Id: psvn.el 19138 2006-04-03 19:10:26Z 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 el3 with svn 1.1.1 ;; freebsd5, red hat el3 with svn 1.2.3
;; psvn.el is an interface for the revision control tool subversion ;; psvn.el is an interface for the revision control tool subversion
;; (see http://subversion.tigris.org) ;; (see http://subversion.tigris.org)
@ -185,7 +185,11 @@
;;; Code: ;;; Code:
(require 'easymenu) (require 'easymenu)
(require 'diff-mode nil t)
(condition-case nil
(progn
(require 'diff-mode))
(error nil))
;;; user setable variables ;;; user setable variables
(defcustom svn-status-verbose t (defcustom svn-status-verbose t
@ -220,9 +224,11 @@ This can be toggled with \\[svn-status-toggle-hide-unmodified]."
:type 'boolean :type 'boolean
:group 'psvn) :group 'psvn)
(defcustom svn-status-sort-status-buffer t (defcustom svn-status-sort-status-buffer t
"Sort the `svn-status-buffer-name' buffer. "*Whether to sort the `svn-status-buffer-name' buffer.
Setting this variable to nil speeds up M-x svn-status.
However, it is possible, that the sorting is wrong in this case. Setting this variable to nil speeds up \[M-x svn-status], however the
listing may then become incorrect.
This can be toggled with \\[svn-status-toggle-sort-status-buffer]." This can be toggled with \\[svn-status-toggle-sort-status-buffer]."
:type 'boolean :type 'boolean
:group 'psvn) :group 'psvn)
@ -387,10 +393,11 @@ If you'd like to suppress whitespace changes use the following value:
This can be set with \\[svn-status-set-trac-project-root].") This can be set with \\[svn-status-set-trac-project-root].")
(defvar svn-status-module-name nil (defvar svn-status-module-name nil
"A nice short name for the actual project. "*A short name for the actual project.
This can be set with \\[svn-status-set-module-name].") This can be set with \\[svn-status-set-module-name].")
(defvar svn-status-load-state-before-svn-status t "Load the ++psvn.state file, before running svn-status") (defvar svn-status-load-state-before-svn-status t
"*Whether to automatically restore state from ++psvn.state file before running svn-status.")
;;; hooks ;;; hooks
(defvar svn-log-edit-mode-hook nil "Hook run when entering `svn-log-edit-mode'.") (defvar svn-log-edit-mode-hook nil "Hook run when entering `svn-log-edit-mode'.")
@ -401,7 +408,7 @@ This can be set with \\[svn-status-set-module-name].")
(defvar svn-status-coding-system nil (defvar svn-status-coding-system nil
"A special coding system is needed for the output of svn. "A special coding system is needed for the output of svn.
svn-status-coding-system is used in svn-run-svn, if it is not nil.") svn-status-coding-system is used in svn-run, if it is not nil.")
(defcustom svn-status-wash-control-M-in-process-buffers (defcustom svn-status-wash-control-M-in-process-buffers
(eq system-type 'windows-nt) (eq system-type 'windows-nt)
@ -488,6 +495,7 @@ This is nil if the log entry is for a new commit.")
(defvar svn-status-mode-line-process-edit-flag "") (defvar svn-status-mode-line-process-edit-flag "")
(defvar svn-status-edit-svn-command nil) (defvar svn-status-edit-svn-command nil)
(defvar svn-status-update-previous-process-output nil) (defvar svn-status-update-previous-process-output nil)
(defvar svn-pre-run-asynch-recent-keys nil)
(defvar svn-status-temp-dir (defvar svn-status-temp-dir
(expand-file-name (expand-file-name
(or (or
@ -579,7 +587,7 @@ See also `svn-status-short-mod-flag-p'."
(((class color) (background light)) (:foreground "blue4")) (((class color) (background light)) (:foreground "blue4"))
(((class color) (background dark)) (:foreground "lightskyblue1")) (((class color) (background dark)) (:foreground "lightskyblue1"))
(t (:weight bold))) (t (:weight bold)))
"Face for directories in svn status buffers. "Face for directories in *svn-status* buffers.
See `svn-status--line-info->directory-p' for what counts as a directory." See `svn-status--line-info->directory-p' for what counts as a directory."
:group 'psvn-faces) :group 'psvn-faces)
@ -587,7 +595,7 @@ See `svn-status--line-info->directory-p' for what counts as a directory."
(defface svn-status-filename-face (defface svn-status-filename-face
'((((class color) (background light)) (:foreground "chocolate")) '((((class color) (background light)) (:foreground "chocolate"))
(((class color) (background dark)) (:foreground "beige"))) (((class color) (background dark)) (:foreground "beige")))
"Face for non-directories in svn status buffers. "Face for non-directories in *svn-status* buffers.
See `svn-status--line-info->directory-p' for what counts as a directory." See `svn-status--line-info->directory-p' for what counts as a directory."
:group 'psvn-faces) :group 'psvn-faces)
@ -709,6 +717,9 @@ Use this instead of `alist', for XEmacs 21.4 compatibility."
,value-type))))) ,value-type)))))
widget)) widget))
;;; keymaps
(defvar svn-global-keymap nil "Global keymap for psvn.el. (defvar svn-global-keymap nil "Global keymap for psvn.el.
To bind this to a different key, customize `svn-status-prefix-key'.") To bind this to a different key, customize `svn-status-prefix-key'.")
(put 'svn-global-keymap 'risky-local-variable t) (put 'svn-global-keymap 'risky-local-variable t)
@ -718,7 +729,9 @@ To bind this to a different key, customize `svn-status-prefix-key'.")
(define-key svn-global-keymap (kbd "l") 'svn-status-show-svn-log) (define-key svn-global-keymap (kbd "l") 'svn-status-show-svn-log)
(define-key svn-global-keymap (kbd "u") 'svn-status-update-cmd) (define-key svn-global-keymap (kbd "u") 'svn-status-update-cmd)
(define-key svn-global-keymap (kbd "=") 'svn-status-show-svn-diff) (define-key svn-global-keymap (kbd "=") 'svn-status-show-svn-diff)
(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 "b") 'svn-status-switch-to-status-buffer)
(define-key svn-global-keymap (kbd "o") 'svn-status-pop-to-status-buffer))
(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.")
@ -778,7 +791,9 @@ inside loops."
;;;###autoload ;;;###autoload
(defun svn-status (dir &optional arg) (defun svn-status (dir &optional arg)
"Examine the status of Subversion working copy in directory DIR. "Examine the status of Subversion working copy in directory DIR.
If ARG then pass the -u argument to `svn status'." If ARG is -, allow editing of the parameters. One could add -N to
run svn status non recursively to make it faster.
For every other non nil ARG pass the -u argument to `svn status'."
(interactive (list (svn-read-directory-name "SVN status directory: " (interactive (list (svn-read-directory-name "SVN status directory: "
nil default-directory nil) nil default-directory nil)
current-prefix-arg)) current-prefix-arg))
@ -805,16 +820,20 @@ If ARG then pass the -u argument to `svn status'."
(setq svn-status-initial-window-configuration (current-window-configuration))) (setq svn-status-initial-window-configuration (current-window-configuration)))
(let* ((status-buf (get-buffer-create svn-status-buffer-name)) (let* ((status-buf (get-buffer-create svn-status-buffer-name))
(proc-buf (get-buffer-create "*svn-process*")) (proc-buf (get-buffer-create "*svn-process*"))
(status-option (if svn-status-verbose (want-edit (eq arg '-))
(if arg "-uv" "-v") (status-option (if want-edit
(if arg "-u" "")))) (if svn-status-verbose "-v" "")
(if svn-status-verbose
(if arg "-uv" "-v")
(if arg "-u" ""))))
(svn-status-edit-svn-command (or want-edit svn-status-edit-svn-command)))
(save-excursion (save-excursion
(set-buffer status-buf) (set-buffer status-buf)
(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))
(svn-run-svn t t 'status "status" status-option))))) (svn-run t t 'status "status" status-option)))))
(defun svn-status-this-directory (arg) (defun svn-status-this-directory (arg)
"Run `svn-status' for the `default-directory'" "Run `svn-status' for the `default-directory'"
@ -831,6 +850,9 @@ If ARG then pass the -u argument to `svn status'."
(svn-status dir) (svn-status dir)
(error "%s is not a directory" dir)))) (error "%s is not a directory" dir))))
(defun svn-had-user-input-since-asynch-run ()
(not (equal (recent-keys) svn-pre-run-asynch-recent-keys)))
(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
@ -850,7 +872,7 @@ the usual `process-environment'."
and when has-value and when has-value
collect elt)) collect elt))
(defun svn-run-svn (run-asynchron clear-process-buffer cmdtype &rest arglist) (defun svn-run (run-asynchron clear-process-buffer cmdtype &rest arglist)
"Run svn with arguments ARGLIST. "Run svn with arguments ARGLIST.
If RUN-ASYNCHRON is t then run svn asynchronously. If RUN-ASYNCHRON is t then run svn asynchronously.
@ -866,19 +888,20 @@ for example: '(\"revert\" \"file1\"\)
ARGLIST is flattened and any every nil value is discarded. ARGLIST is flattened and any every nil value is discarded.
If the variable `svn-status-edit-svn-command' is non-nil then the user If the variable `svn-status-edit-svn-command' is non-nil then the user
is prompted for give extra arguments, which are appended to ARGLIST." can edit ARGLIST before running svn."
(setq arglist (svn-status-flatten-list arglist)) (setq arglist (svn-status-flatten-list arglist))
(if (eq (process-status "svn") nil) (if (eq (process-status "svn") nil)
(progn (progn
(when svn-status-edit-svn-command (when svn-status-edit-svn-command
(setq arglist (append arglist (setq arglist (append
(split-string (list (car arglist))
(read-from-minibuffer (split-string
(format "Run `svn %s' with extra arguments: " (read-from-minibuffer
(mapconcat 'identity arglist " ")))))) (format "svn %s flags: " (car arglist))
(mapconcat 'identity (cdr arglist) " ")))))
(when (eq svn-status-edit-svn-command t) (when (eq svn-status-edit-svn-command t)
(svn-status-toggle-edit-cmd-flag t)) (svn-status-toggle-edit-cmd-flag t))
(message "svn-run-svn %s: %S" cmdtype arglist)) (message "svn-run %s: %S" cmdtype arglist))
(let* ((proc-buf (get-buffer-create "*svn-process*")) (let* ((proc-buf (get-buffer-create "*svn-process*"))
(svn-exe svn-status-svn-executable) (svn-exe svn-status-svn-executable)
(svn-proc)) (svn-proc))
@ -900,6 +923,7 @@ is prompted for give extra arguments, which are appended to ARGLIST."
(if run-asynchron (if run-asynchron
(progn (progn
;;(message "running asynchron: %s %S" svn-exe arglist) ;;(message "running asynchron: %s %S" svn-exe arglist)
(setq svn-pre-run-asynch-recent-keys (recent-keys))
(let ((process-environment (svn-process-environment)) (let ((process-environment (svn-process-environment))
(process-connection-type nil)) (process-connection-type nil))
;; Communicate with the subprocess via pipes rather ;; Communicate with the subprocess via pipes rather
@ -924,9 +948,10 @@ is prompted for give extra arguments, which are appended to ARGLIST."
(svn-status-update-mode-line))))) (svn-status-update-mode-line)))))
(error "You can only run one svn process at once!"))) (error "You can only run one svn process at once!")))
(defun svn-process-sentinel-fixup-path-seperators() (defun svn-process-sentinel-fixup-path-seperators ()
"Convert all path separators to UNIX style.
\(This is a no-op unless `system-type' is windows-nt\)"
(when (eq system-type 'windows-nt) (when (eq system-type 'windows-nt)
;; convert path separator to UNIX style
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(while (search-forward "\\" nil t) (while (search-forward "\\" nil t)
@ -955,7 +980,9 @@ is prompted for give extra arguments, which are appended to ARGLIST."
(setq svn-status-update-previous-process-output nil)) (setq svn-status-update-previous-process-output nil))
(when svn-status-display-new-status-buffer (when svn-status-display-new-status-buffer
(set-window-configuration svn-status-initial-window-configuration) (set-window-configuration svn-status-initial-window-configuration)
(switch-to-buffer svn-status-buffer-name))) (if (svn-had-user-input-since-asynch-run)
(message "svn status finished")
(switch-to-buffer svn-status-buffer-name))))
((eq svn-process-cmd 'log) ((eq svn-process-cmd 'log)
(svn-status-show-process-output 'log t) (svn-status-show-process-output 'log t)
(pop-to-buffer svn-status-last-output-buffer-name) (pop-to-buffer svn-status-last-output-buffer-name)
@ -1038,7 +1065,7 @@ is prompted for give extra arguments, which are appended to ARGLIST."
(goto-char (point-max)) (goto-char (point-max))
(insert str) (insert str)
(save-excursion (save-excursion
(goto-char (line-beginning-position)) (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
@ -1464,7 +1491,7 @@ A and B must be line-info's."
["svn info" svn-status-info t] ["svn info" svn-status-info t]
["svn blame" svn-status-blame t])) ["svn blame" svn-status-blame t]))
(svn-status-face-set-temporary-during-popup (svn-status-face-set-temporary-during-popup
'svn-status-marked-popup-face (line-beginning-position) (line-end-position) 'svn-status-marked-popup-face (svn-point-at-bol) (svn-point-at-eol)
svn-status-actual-popup-menu)))) svn-status-actual-popup-menu))))
(defun svn-status-face-set-temporary-during-popup (face begin end menu &optional prefix) (defun svn-status-face-set-temporary-during-popup (face begin end menu &optional prefix)
@ -1536,6 +1563,29 @@ in use before `svn-status' was called."
(when (string= (buffer-name) svn-status-buffer-name) (when (string= (buffer-name) svn-status-buffer-name)
(bury-buffer)))))) (bury-buffer))))))
(defun svn-status-save-some-buffers (&optional tree)
"Save all buffers visiting a file in TREE.
If TREE is not given, try `svn-status-base-dir' as TREE."
(interactive)
(let ((ok t)
(tree (or (svn-status-base-dir)
tree)))
(unless tree
(error "Not in a svn project tree"))
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(when (buffer-modified-p)
(let ((file (buffer-file-name)))
(when file
(let ((root (svn-status-base-dir (file-name-directory file))))
(when (and root
(string= root tree)
;; buffer is modified and in the tree TREE.
(or (y-or-n-p (concat "Save buffer " (buffer-name) "? "))
(setq ok nil)))
(save-buffer))))))))
ok))
(defun svn-status-find-files () (defun svn-status-find-files ()
"Open selected file(s) for editing. "Open selected file(s) for editing.
See `svn-status-marked-files' for what counts as selected." See `svn-status-marked-files' for what counts as selected."
@ -1793,6 +1843,8 @@ When called with the prefix argument 0, use the full path name."
(setq tag-string " <added>")) (setq tag-string " <added>"))
((equal action 'deleted) ((equal action 'deleted)
(setq tag-string " <deleted>")) (setq tag-string " <deleted>"))
((equal action 'replaced)
(setq tag-string " <replaced>"))
((equal action 'added-wc) ((equal action 'added-wc)
(svn-status-line-info->set-filemark line-info ?A) (svn-status-line-info->set-filemark line-info ?A)
(svn-status-line-info->set-localrev line-info 0)) (svn-status-line-info->set-localrev line-info 0))
@ -1816,7 +1868,6 @@ When called with the prefix argument 0, use the full path name."
;; (svn-status-update-with-command-list '(("++ideas" committed) ("a.txt" committed) ("alf"))) ;; (svn-status-update-with-command-list '(("++ideas" committed) ("a.txt" committed) ("alf")))
;; (svn-status-update-with-command-list (svn-status-parse-commit-output)) ;; (svn-status-update-with-command-list (svn-status-parse-commit-output))
(defun svn-status-parse-commit-output () (defun svn-status-parse-commit-output ()
"Parse the output of svn commit. "Parse the output of svn commit.
Return a list that is suitable for `svn-status-update-with-command-list'" Return a list that is suitable for `svn-status-update-with-command-list'"
@ -1838,6 +1889,8 @@ Return a list that is suitable for `svn-status-update-with-command-list'"
(setq action 'added)) (setq action 'added))
((looking-at "Deleting") ((looking-at "Deleting")
(setq action 'deleted)) (setq action 'deleted))
((looking-at "Replacing")
(setq action 'replaced))
((looking-at "Transmitting file data") ((looking-at "Transmitting file data")
(setq skip t)) (setq skip t))
((looking-at "Committed revision \\([0-9]+\\)") ((looking-at "Committed revision \\([0-9]+\\)")
@ -1891,6 +1944,16 @@ Return a list that is suitable for `svn-status-update-with-command-list'"
;;(svn-status-parse-ar-output) ;;(svn-status-parse-ar-output)
;; (svn-status-update-with-command-list (svn-status-parse-ar-output)) ;; (svn-status-update-with-command-list (svn-status-parse-ar-output))
(defun svn-status-line-info->symlink-p (line-info)
"Return non-nil if LINE-INFO refers to a symlink, nil otherwise.
The value is the name of the file to which it is linked. \(See
`file-symlink-p'.\)
On win32 systems this won't work, even though symlinks are supported
by subversion on such systems."
;; on win32 would need to see how svn does symlinks
(file-symlink-p (svn-status-line-info->filename line-info)))
(defun svn-status-line-info->directory-p (line-info) (defun svn-status-line-info->directory-p (line-info)
"Return t if LINE-INFO refers to a directory, nil otherwise. "Return t if LINE-INFO refers to a directory, nil otherwise.
Symbolic links to directories count as directories (see `file-directory-p')." Symbolic links to directories count as directories (see `file-directory-p')."
@ -1941,7 +2004,24 @@ Symbolic links to directories count as directories (see `file-directory-p')."
(svn-status-line-info->directory-p line-info) (svn-status-line-info->directory-p line-info)
(svn-status-line-info->filename-nondirectory line-info) (svn-status-line-info->filename-nondirectory line-info)
'svn-status-directory-face 'svn-status-directory-face
'svn-status-filename-face))) 'svn-status-filename-face)
;; if it's a symlkink, add '-> target'
(let ((target (svn-status-line-info->symlink-p line-info)))
(when target
(concat " -> "
;; add face to target: could maybe
;; use different faces for
;; unversioned targets?
(svn-status-choose-face-to-add
(file-directory-p target)
(file-relative-name
target
(svn-status-line-info->directory-containing-line-info
line-info t)); name relative to dir of line-info, not '.'
'svn-status-directory-face
'svn-status-filename-face)
)))
))
(elide-hint (if (svn-status-line-info->show-user-elide-continuation line-info) " ..." ""))) (elide-hint (if (svn-status-line-info->show-user-elide-continuation line-info) " ..." "")))
(svn-puthash (svn-status-line-info->filename line-info) (svn-puthash (svn-status-line-info->filename line-info)
(point) (point)
@ -2060,12 +2140,12 @@ Show the repository url after this call in the `svn-status-buffer-name' buffer.
When called with the prefix argument 0, reset the information to nil. When called with the prefix argument 0, reset the information to nil.
This hides the repository information again. This hides the repository information again.
When ARG is t, don't update the svn status buffer. This useful for When ARG is t, don't update the svn status buffer. This is useful for
non-interactive use." non-interactive use."
(interactive "P") (interactive "P")
(if (eq arg 0) (if (eq arg 0)
(setq svn-status-base-info nil) (setq svn-status-base-info nil)
(svn-run-svn nil t 'parse-info "info" ".") (svn-run nil t 'parse-info "info" ".")
(svn-status-parse-info-result)) (svn-status-parse-info-result))
(unless (eq arg t) (unless (eq arg t)
(svn-status-update-buffer))) (svn-status-update-buffer)))
@ -2167,7 +2247,9 @@ The result may be parsed with the various `svn-status-line-info->...' functions.
(defun svn-status-get-file-list (use-marked-files) (defun svn-status-get-file-list (use-marked-files)
"Get either the marked files or the files, where the cursor is on." "Get either the selected files or the file under point.
USE-MARKED-FILES decides which we do.
See `svn-status-marked-files' for what counts as selected."
(if use-marked-files (if use-marked-files
(svn-status-marked-files) (svn-status-marked-files)
(list (svn-status-get-line-information)))) (list (svn-status-get-line-information))))
@ -2176,6 +2258,8 @@ The result may be parsed with the various `svn-status-line-info->...' functions.
(mapcar 'svn-status-line-info->filename (svn-status-get-file-list use-marked-files))) (mapcar 'svn-status-line-info->filename (svn-status-get-file-list use-marked-files)))
(defun svn-status-select-line () (defun svn-status-select-line ()
"Return information about the file under point.
\(Only used for debugging\)"
(interactive) (interactive)
(let ((info (svn-status-get-line-information))) (let ((info (svn-status-get-line-information)))
(if info (if info
@ -2184,6 +2268,7 @@ The result may be parsed with the various `svn-status-line-info->...' functions.
(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."
(unless (svn-status-get-line-information) (unless (svn-status-get-line-information)
(error "No file on the current line"))) (error "No file on the current line")))
@ -2506,7 +2591,6 @@ Consider svn-status-window-alist to choose the buffer name."
(other-window 1)) (other-window 1))
(svn-status-show-process-buffer-internal scroll-to-top))))) (svn-status-show-process-buffer-internal scroll-to-top)))))
(defun svn-status-show-svn-log (arg) (defun svn-status-show-svn-log (arg)
"Run `svn log' on selected files. "Run `svn log' on selected files.
The output is put into the *svn-log* buffer The output is put into the *svn-log* buffer
@ -2523,7 +2607,7 @@ See `svn-status-marked-files' for what counts as selected."
(arg '("-v")) (arg '("-v"))
(t svn-status-default-log-arguments)))) (t svn-status-default-log-arguments))))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(svn-run-svn t t 'log "log" "--targets" svn-status-temp-arg-file switches) (svn-run t t 'log "log" "--targets" svn-status-temp-arg-file switches)
(save-excursion (save-excursion
(set-buffer "*svn-process*") (set-buffer "*svn-process*")
(svn-log-view-mode)))) (svn-log-view-mode))))
@ -2533,14 +2617,14 @@ See `svn-status-marked-files' for what counts as selected."
See `svn-status-marked-files' for what counts as selected." See `svn-status-marked-files' for what counts as selected."
(interactive) (interactive)
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(svn-run-svn t t 'info "info" "--targets" svn-status-temp-arg-file)) (svn-run t t 'info "info" "--targets" svn-status-temp-arg-file))
;; Todo: add possiblity to specify the revision ;; Todo: add possiblity to specify the revision
(defun svn-status-blame () (defun svn-status-blame ()
"Run `svn blame' on the current file." "Run `svn blame' on the current file."
(interactive) (interactive)
;;(svn-run-svn t t 'blame "blame" "-r" "BASE" (svn-status-line-info->filename (svn-status-get-line-information)))) ;;(svn-run t t 'blame "blame" "-r" "BASE" (svn-status-line-info->filename (svn-status-get-line-information))))
(svn-run-svn t t 'blame "blame" (svn-status-line-info->filename (svn-status-get-line-information)))) (svn-run t t 'blame "blame" (svn-status-line-info->filename (svn-status-get-line-information))))
(defun svn-status-show-svn-diff (arg) (defun svn-status-show-svn-diff (arg)
"Run `svn diff' on the current file. "Run `svn diff' on the current file.
@ -2580,7 +2664,7 @@ If ARG then prompt for revision to diff against, else compare working copy with
(let ((clear-buf t) (let ((clear-buf t)
(beginning nil)) (beginning nil))
(dolist (line-info line-infos) (dolist (line-info line-infos)
(svn-run-svn nil clear-buf 'diff "diff" svn-status-default-diff-arguments (svn-run nil clear-buf 'diff "diff" svn-status-default-diff-arguments
"-r" (if (eq revision :auto) "-r" (if (eq revision :auto)
(if (svn-status-line-info->update-available line-info) (if (svn-status-line-info->update-available line-info)
"HEAD" "BASE") "HEAD" "BASE")
@ -2639,7 +2723,6 @@ Commands:
major-mode mode-name) major-mode mode-name)
(diff-mode))) (diff-mode)))
(defun svn-status-show-process-buffer () (defun svn-status-show-process-buffer ()
"Show the content of the *svn-process* buffer" "Show the content of the *svn-process* buffer"
(interactive) (interactive)
@ -2653,7 +2736,7 @@ When this function is called with a prefix argument, use the actual file instead
(interactive "P") (interactive "P")
(message "adding: %S" (svn-status-get-file-list-names (not arg))) (message "adding: %S" (svn-status-get-file-list-names (not arg)))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-get-file-list (not arg)) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-get-file-list (not arg)) "")
(svn-run-svn t t 'add "add" "--targets" svn-status-temp-arg-file)) (svn-run t t 'add "add" "--targets" svn-status-temp-arg-file))
(defun svn-status-add-file (arg) (defun svn-status-add-file (arg)
"Run `svn add' on all selected files. "Run `svn add' on all selected files.
@ -2664,7 +2747,7 @@ When this function is called with a prefix argument, use the actual file instead
(interactive "P") (interactive "P")
(message "adding: %S" (svn-status-get-file-list-names (not arg))) (message "adding: %S" (svn-status-get-file-list-names (not arg)))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-get-file-list (not arg)) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-get-file-list (not arg)) "")
(svn-run-svn t t 'add "add" "--non-recursive" "--targets" svn-status-temp-arg-file)) (svn-run t t 'add "add" "--non-recursive" "--targets" svn-status-temp-arg-file))
(defun svn-status-make-directory (dir) (defun svn-status-make-directory (dir)
"Run `svn mkdir DIR'." "Run `svn mkdir DIR'."
@ -2674,7 +2757,7 @@ When this function is called with a prefix argument, use the actual file instead
(svn-status-directory-containing-point t)))) (svn-status-directory-containing-point t))))
(unless (string-match "^[^:/]+://" dir) ; Is it a URI? (unless (string-match "^[^:/]+://" dir) ; Is it a URI?
(setq dir (file-relative-name dir))) (setq dir (file-relative-name dir)))
(svn-run-svn t t 'mkdir "mkdir" "--" dir)) (svn-run t t 'mkdir "mkdir" "--" dir))
;;TODO: write a svn-status-cp similar to this---maybe a common ;;TODO: write a svn-status-cp similar to this---maybe a common
;;function to do both? ;;function to do both?
@ -2703,7 +2786,8 @@ itself) before running mv."
;; file into. ;; file into.
(setq dest (read-file-name (format "Rename %s to: " (setq dest (read-file-name (format "Rename %s to: "
(svn-status-line-info->filename (car marked-files))) (svn-status-line-info->filename (car marked-files)))
(svn-status-directory-containing-point t))) (svn-status-directory-containing-point t)
(svn-status-line-info->full-path (car marked-files))))
;;multiple files selected, so prompt for existing directory to mv them into. ;;multiple files selected, so prompt for existing directory to mv them into.
(setq dest (svn-read-directory-name (format "Move %d files to directory: " num-of-files) (setq dest (svn-read-directory-name (format "Move %d files to directory: " num-of-files)
(svn-status-directory-containing-point t) nil t)) (svn-status-directory-containing-point t) nil t))
@ -2716,7 +2800,7 @@ itself) before running mv."
; ;
;;do the move: svn mv only lets us move things once at a time, so ;;do the move: svn mv only lets us move things once at a time, so
;;we need to run svn mv once for each file (hence second arg to ;;we need to run svn mv once for each file (hence second arg to
;;svn-run-svn is nil.) ;;svn-run is nil.)
;;TODO: before doing any moving, For every marked directory, ;;TODO: before doing any moving, For every marked directory,
;;ensure none of its contents are also marked, since we dont want ;;ensure none of its contents are also marked, since we dont want
@ -2739,7 +2823,7 @@ itself) before running mv."
(eq original-propmarks 77)) ;;original has local prop mods: maybe do `svn mv --force' (eq original-propmarks 77)) ;;original has local prop mods: maybe do `svn mv --force'
(if (yes-or-no-p (format "%s has local modifications; use `--force' to really move it? " (if (yes-or-no-p (format "%s has local modifications; use `--force' to really move it? "
original-name)) original-name))
(svn-run-svn nil t 'mv "mv" "--force" "--" original-name dest) (svn-run nil t 'mv "mv" "--force" "--" original-name dest)
(message "Not moving %s" original-name))) (message "Not moving %s" original-name)))
((eq original-filemarks 63) ;;original is unversioned: maybe do plain `mv' ((eq original-filemarks 63) ;;original is unversioned: maybe do plain `mv'
(if (yes-or-no-p (format "%s is unversioned. Use plain `mv -i %s %s'? " (if (yes-or-no-p (format "%s is unversioned. Use plain `mv -i %s %s'? "
@ -2751,12 +2835,12 @@ itself) before running mv."
(message "Not moving %s (try committing it first)" original-name)) (message "Not moving %s (try committing it first)" original-name))
((eq original-filemarks 32) ;;original is unmodified: can use `svn mv' ((eq original-filemarks 32) ;;original is unmodified: can use `svn mv'
(svn-run-svn nil t 'mv "mv" "--" original-name dest)) (svn-run nil t 'mv "mv" "--" original-name dest))
;;file is conflicted in some way? ;;file is conflicted in some way?
(t (t
(if (yes-or-no-p (format "The status of %s looks scary. Risk moving it anyway? " original-name)) (if (yes-or-no-p (format "The status of %s looks scary. Risk moving it anyway? " original-name))
(svn-run-svn nil t 'mv "mv" "--" original-name dest) (svn-run nil t 'mv "mv" "--" original-name dest)
(message "Not moving %s" original-name)))))) (message "Not moving %s" original-name))))))
(svn-status-update))) (svn-status-update)))
@ -2772,7 +2856,7 @@ See `svn-status-marked-files' for what counts as selected."
(format "Revert %d files? " num-of-files))) (format "Revert %d files? " num-of-files)))
(message "reverting: %S" (svn-status-marked-file-names)) (message "reverting: %S" (svn-status-marked-file-names))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(svn-run-svn t t 'revert "revert" "--targets" svn-status-temp-arg-file)))) (svn-run t t 'revert "revert" "--targets" svn-status-temp-arg-file))))
(defun svn-status-rm (force) (defun svn-status-rm (force)
"Run `svn rm' on all selected files. "Run `svn rm' on all selected files.
@ -2788,15 +2872,15 @@ When called with a prefix argument add the command line switch --force."
(message "removing: %S" (svn-status-marked-file-names)) (message "removing: %S" (svn-status-marked-file-names))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(if force (if force
(svn-run-svn t t 'rm "rm" "--force" "--targets" svn-status-temp-arg-file) (svn-run t t 'rm "rm" "--force" "--targets" svn-status-temp-arg-file)
(svn-run-svn t t 'rm "rm" "--targets" svn-status-temp-arg-file))))) (svn-run t t 'rm "rm" "--targets" svn-status-temp-arg-file)))))
(defun svn-status-update-cmd () (defun svn-status-update-cmd ()
"Run svn update." "Run svn update."
(interactive) (interactive)
(message "Running svn-update for %s" default-directory) (message "Running svn-update for %s" default-directory)
;TODO: use file names also ;TODO: use file names also
(svn-run-svn t t 'update "update")) (svn-run t t 'update "update"))
(defun svn-status-commit () (defun svn-status-commit ()
"Commit selected files. "Commit selected files.
@ -2805,6 +2889,7 @@ this is because marking a directory with \\[svn-status-set-user-mark]
normally marks all of its files as well. normally marks all of its files as well.
If no files have been marked, commit recursively the file at point." If no files have been marked, commit recursively the file at point."
(interactive) (interactive)
(svn-status-save-some-buffers)
(let* ((selected-files (svn-status-marked-files)) (let* ((selected-files (svn-status-marked-files))
(marked-files-p (svn-status-some-files-marked-p))) (marked-files-p (svn-status-some-files-marked-p)))
(setq svn-status-files-to-commit selected-files (setq svn-status-files-to-commit selected-files
@ -2827,6 +2912,16 @@ If no files have been marked, commit recursively the file at point."
(insert-file-contents svn-log-edit-file-name))) (insert-file-contents svn-log-edit-file-name)))
(svn-log-edit-mode))) (svn-log-edit-mode)))
(defun svn-status-switch-to-status-buffer ()
"Switch to the `svn-status-buffer-name' buffer."
(interactive)
(switch-to-buffer svn-status-buffer-name))
(defun svn-status-pop-to-status-buffer ()
"Pop to the `svn-status-buffer-name' buffer."
(interactive)
(pop-to-buffer svn-status-buffer-name))
(defun svn-status-export () (defun svn-status-export ()
"Run `svn export' for the current working copy. "Run `svn export' for the current working copy.
Ask the user for the destination path. Ask the user for the destination path.
@ -2835,7 +2930,7 @@ Ask the user for the destination path.
(let* ((src default-directory) (let* ((src default-directory)
(dir1-name (nth 1 (nreverse (split-string src "/")))) (dir1-name (nth 1 (nreverse (split-string src "/"))))
(dest (read-file-name (format "Export %s to " src) (concat svn-status-default-export-directory dir1-name)))) (dest (read-file-name (format "Export %s to " src) (concat svn-status-default-export-directory dir1-name))))
(svn-run-svn t t 'export "export" (expand-file-name src) (expand-file-name dest)) (svn-run t t 'export "export" (expand-file-name src) (expand-file-name dest))
(message "svn-status-export %s %s" src dest))) (message "svn-status-export %s %s" src dest)))
(defun svn-status-cleanup (arg) (defun svn-status-cleanup (arg)
@ -2847,7 +2942,7 @@ When this function is called with a prefix argument, use the actual file instead
(if file-names (if file-names
(progn (progn
(message "svn-status-cleanup %S" file-names) (message "svn-status-cleanup %S" file-names)
(svn-run-svn t t 'cleanup (append (list "cleanup") file-names))) (svn-run t t 'cleanup (append (list "cleanup") file-names)))
(message "No valid file selected - No status cleanup possible")))) (message "No valid file selected - No status cleanup possible"))))
(defun svn-status-resolved () (defun svn-status-resolved ()
@ -2862,7 +2957,7 @@ See `svn-status-marked-files' for what counts as selected."
(format "Resolve %d files? " num-of-files))) (format "Resolve %d files? " num-of-files)))
(message "resolving: %S" (svn-status-marked-file-names)) (message "resolving: %S" (svn-status-marked-file-names))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "") (svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(svn-run-svn t t 'resolved "resolved" "--targets" svn-status-temp-arg-file)))) (svn-run t t 'resolved "resolved" "--targets" svn-status-temp-arg-file))))
(defun svn-status-svnversion () (defun svn-status-svnversion ()
@ -3008,7 +3103,7 @@ names are relative to the directory where `svn-status' was run."
(file-name-nondirectory file-name) (file-name-nondirectory file-name)
".svn-base")) ".svn-base"))
(progn (progn
(svn-run-svn nil t 'cat "cat" "-r" revision file-name) (svn-run nil t 'cat "cat" "-r" revision file-name)
;;todo: error processing ;;todo: error processing
;;svn: Filesystem has no item ;;svn: Filesystem has no item
;;svn: file not found: revision `15', path `/trunk/file.txt' ;;svn: file not found: revision `15', path `/trunk/file.txt'
@ -3098,12 +3193,12 @@ Note: use C-q C-j to send a line termination character."
(let ((file-names (svn-status-marked-file-names))) (let ((file-names (svn-status-marked-file-names)))
(if file-names (if file-names
(progn (progn
(svn-run-svn t t 'proplist (append (list "proplist" "-v") file-names))) (svn-run t t 'proplist (append (list "proplist" "-v") file-names)))
(message "No valid file selected - No property listing possible")))) (message "No valid file selected - No property listing possible"))))
(defun svn-status-proplist-start () (defun svn-status-proplist-start ()
(svn-status-ensure-cursor-on-file) (svn-status-ensure-cursor-on-file)
(svn-run-svn t t 'proplist-parse "proplist" (svn-status-line-info->filename (svn-run t t 'proplist-parse "proplist" (svn-status-line-info->filename
(svn-status-get-line-information)))) (svn-status-get-line-information))))
(defun svn-status-property-edit-one-entry (arg) (defun svn-status-property-edit-one-entry (arg)
"Edit a property. "Edit a property.
@ -3158,7 +3253,7 @@ When called with a prefix argument, it is possible to enter a new property."
(svn-status-marked-file-names)) (svn-status-marked-file-names))
(let ((file-names (svn-status-marked-file-names))) (let ((file-names (svn-status-marked-file-names)))
(when file-names (when file-names
(svn-run-svn nil t 'propset (svn-run nil t 'propset
(append (list "propset" prop-name prop-value) file-names)) (append (list "propset" prop-name prop-value) file-names))
) )
) )
@ -3173,7 +3268,7 @@ When called with a prefix argument, it is possible to enter a new property."
(let ((file-names (svn-status-marked-file-names))) (let ((file-names (svn-status-marked-file-names)))
(when file-names (when file-names
(message "Going to delete prop %s for %s" prop-name file-names) (message "Going to delete prop %s for %s" prop-name file-names)
(svn-run-svn t t 'propdel (svn-run t t 'propdel
(append (list "propdel" prop-name) file-names)))))))))) (append (list "propdel" prop-name) file-names))))))))))
(defun svn-status-property-edit (file-info-list prop-name &optional new-prop-value) (defun svn-status-property-edit (file-info-list prop-name &optional new-prop-value)
@ -3183,7 +3278,7 @@ When called with a prefix argument, it is possible to enter a new property."
(file-name (svn-status-line-info->filename (car file-info-list))) (file-name (svn-status-line-info->filename (car file-info-list)))
(prop-value)) (prop-value))
(message "Edit property %s for file %s" prop-name file-name) (message "Edit property %s for file %s" prop-name file-name)
(svn-run-svn nil t 'propget-parse "propget" prop-name file-name) (svn-run nil t 'propget-parse "propget" prop-name file-name)
(save-excursion (save-excursion
(set-buffer "*svn-process*") (set-buffer "*svn-process*")
(setq prop-value (if (> (point-max) 1) (setq prop-value (if (> (point-max) 1)
@ -3388,7 +3483,7 @@ Commands:
(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 "")
(setq svn-status-propedit-file-list nil) (setq svn-status-propedit-file-list nil)
(svn-run-svn async t 'propset "propset" (svn-run async t 'propset "propset"
svn-status-propedit-property-name svn-status-propedit-property-name
"--targets" svn-status-temp-arg-file "--targets" svn-status-temp-arg-file
"-F" (concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix)) "-F" (concat svn-status-temp-dir "svn-prop-edit.txt" svn-temp-suffix))
@ -3426,7 +3521,6 @@ Commands:
(define-derived-mode svn-log-edit-mode log-edit-mode "svn-log-edit" (define-derived-mode svn-log-edit-mode log-edit-mode "svn-log-edit"
"Wrapper around `log-edit-mode' for psvn.el" "Wrapper around `log-edit-mode' for psvn.el"
(easy-menu-add svn-log-edit-mode-menu) (easy-menu-add svn-log-edit-mode-menu)
(run-hooks 'svn-log-edit-mode-hook)
(setq svn-log-edit-update-log-entry nil) (setq svn-log-edit-update-log-entry nil)
(set (make-local-variable 'log-edit-callback) 'svn-log-edit-done) (set (make-local-variable 'log-edit-callback) 'svn-log-edit-done)
(set (make-local-variable 'log-edit-listfun) 'svn-log-edit-files-to-commit) (set (make-local-variable 'log-edit-listfun) 'svn-log-edit-files-to-commit)
@ -3479,6 +3573,7 @@ Commands:
(defun svn-log-edit-done () (defun svn-log-edit-done ()
(interactive) (interactive)
(svn-status-save-some-buffers)
(save-excursion (save-excursion
(set-buffer (get-buffer "*svn-log-edit*")) (set-buffer (get-buffer "*svn-log-edit*"))
(when svn-log-edit-insert-files-to-commit (when svn-log-edit-insert-files-to-commit
@ -3488,11 +3583,12 @@ Commands:
(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-status-temp-file-to-remove
(concat svn-status-temp-dir "svn-log-edit.txt" svn-temp-suffix)) (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))) (write-region (point-min) (point-max) svn-status-temp-file-to-remove nil 1))
(bury-buffer))
(if svn-log-edit-update-log-entry (if svn-log-edit-update-log-entry
(when (y-or-n-p "Update the log entry? ") (when (y-or-n-p "Update the log entry? ")
;; svn propset svn:log --revprop -r11672 -F file ;; svn propset svn:log --revprop -r11672 -F file
(svn-run-svn 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-status-temp-file-to-remove)
(save-excursion (save-excursion
@ -3504,7 +3600,7 @@ Commands:
(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-svn 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-status-temp-file-to-remove
@ -3592,17 +3688,37 @@ If ARG then show diff between some other version of the selected files."
(define-key svn-log-view-mode-map (kbd "e") 'svn-log-edit-log-entry) (define-key svn-log-view-mode-map (kbd "e") 'svn-log-edit-log-entry)
(define-key svn-log-view-mode-map (kbd "q") 'bury-buffer)) (define-key svn-log-view-mode-map (kbd "q") 'bury-buffer))
(defvar svn-log-view-popup-menu-map ()
"Keymap used to show popup menu in `svn-log-view-mode' buffers.")
(put 'svn-log-view-popup-menu-map 'risky-local-variable t) ;for Emacs 20.7
(when (not svn-log-view-popup-menu-map)
(setq svn-log-view-popup-menu-map (make-sparse-keymap))
(suppress-keymap svn-log-view-popup-menu-map)
(define-key svn-log-view-popup-menu-map [down-mouse-3] 'svn-log-view-popup-menu))
(easy-menu-define svn-log-view-mode-menu svn-log-view-mode-map (easy-menu-define svn-log-view-mode-menu svn-log-view-mode-map
"'svn-log-view-mode' menu" "'svn-log-view-mode' menu"
'("SVN-LogView" '("SVN-LogView"
["Show Changeset" svn-log-view-diff t] ["Show Changeset" svn-log-view-diff t]
["Edit log message" svn-log-edit-log-entry t])) ["Edit log message" svn-log-edit-log-entry t]))
(defvar svn-log-view-font-lock-keywords (defun svn-log-view-popup-menu (event)
'(("^r.+" . font-lock-keyword-face) (interactive "e")
"Keywords in svn-log-view-mode.")) (mouse-set-point event)
(put 'svn-log-view-font-lock-keywords 'risky-local-variable t) ;for Emacs 20.7 (let* ((rev (svn-log-revision-at-point)))
(when rev
(svn-status-face-set-temporary-during-popup
'svn-status-marked-popup-face (svn-point-at-bol) (svn-point-at-eol)
svn-log-view-mode-menu))))
(defvar svn-log-view-font-lock-keywords
'(("^r[0-9]+ .+" (0 `(face
font-lock-keyword-face
mouse-face
highlight
keymap ,svn-log-view-popup-menu-map))))
"Keywords in svn-log-view-mode.")
(put 'svn-log-view-font-lock-keywords 'risky-local-variable t) ;for Emacs 20.7
(define-derived-mode svn-log-view-mode fundamental-mode "svn-log-view" (define-derived-mode svn-log-view-mode fundamental-mode "svn-log-view"
"Major Mode to show the output from svn log. "Major Mode to show the output from svn log.
@ -3637,7 +3753,7 @@ When called with a prefix argument, ask the user for the revision."
(rev-arg (concat lower-rev ":" upper-rev))) (rev-arg (concat lower-rev ":" upper-rev)))
(when arg (when arg
(setq rev-arg (read-string "Revision for changeset: " rev-arg))) (setq rev-arg (read-string "Revision for changeset: " rev-arg)))
(svn-run-svn nil t 'diff "diff" (concat "-r" rev-arg)) (svn-run nil t 'diff "diff" (concat "-r" rev-arg))
(svn-status-activate-diff-mode))) (svn-status-activate-diff-mode)))
(defun svn-log-edit-log-entry () (defun svn-log-edit-log-entry ()
@ -3645,7 +3761,7 @@ When called with a prefix argument, ask the user for the revision."
(interactive) (interactive)
(let ((rev (svn-log-revision-at-point)) (let ((rev (svn-log-revision-at-point))
(log-message)) (log-message))
(svn-run-svn nil t 'propget-parse "propget" "--revprop" (concat "-r" rev) "svn:log") (svn-run nil t 'propget-parse "propget" "--revprop" (concat "-r" rev) "svn:log")
(save-excursion (save-excursion
(set-buffer "*svn-process*") (set-buffer "*svn-process*")
(setq log-message (if (> (point-max) 1) (setq log-message (if (> (point-max) 1)
@ -3663,19 +3779,24 @@ When called with a prefix argument, ask the user for the revision."
;; svn status persistent options ;; svn status persistent options
;; -------------------------------------------------------------------------------- ;; --------------------------------------------------------------------------------
(defun svn-status-base-dir () (defun svn-status-base-dir (&optional start-directory)
(let ((base-dir (expand-file-name default-directory)) "Find the svn root directory for the current working copy.
(dot-svn-dir) Return nil, if not in a svn working copy."
(dir-below (expand-file-name default-directory))) (let* ((base-dir (expand-file-name (or start-directory default-directory)))
(setq dot-svn-dir (concat base-dir (svn-wc-adm-dir-name))) (dot-svn-dir (concat base-dir (svn-wc-adm-dir-name)))
(in-tree (file-exists-p dot-svn-dir))
(dir-below (expand-file-name default-directory)))
(while (when (and dir-below (file-exists-p dot-svn-dir)) (while (when (and dir-below (file-exists-p dot-svn-dir))
(setq base-dir (file-name-directory dot-svn-dir)) (setq base-dir (file-name-directory dot-svn-dir))
(string-match "\\(.+/\\).+/" dir-below) (string-match "\\(.+/\\).+/" dir-below)
(setq dir-below (match-string 1 dir-below)) (setq dir-below
(and (string-match "\(.*/\)[^/]+/" dir-below)
(match-string 1 dir-below)))
(setq dot-svn-dir (concat dir-below (svn-wc-adm-dir-name))))) (setq dot-svn-dir (concat dir-below (svn-wc-adm-dir-name)))))
base-dir)) (and in-tree base-dir)))
(defun svn-status-save-state () (defun svn-status-save-state ()
"Save psvn persistent options for this working copy to a file."
(interactive) (interactive)
(let ((buf (find-file (concat (svn-status-base-dir) "++psvn.state")))) (let ((buf (find-file (concat (svn-status-base-dir) "++psvn.state"))))
(erase-buffer) ;Widen, because we'll save the whole buffer. (erase-buffer) ;Widen, because we'll save the whole buffer.
@ -3690,6 +3811,7 @@ When called with a prefix argument, ask the user for the revision."
(kill-buffer buf))) (kill-buffer buf)))
(defun svn-status-load-state (&optional no-error) (defun svn-status-load-state (&optional no-error)
"Load psvn persistent options for this working copy from a file."
(interactive) (interactive)
(let ((file (concat (svn-status-base-dir) "++psvn.state"))) (let ((file (concat (svn-status-base-dir) "++psvn.state")))
(if (file-readable-p file) (if (file-readable-p file)
@ -3709,14 +3831,16 @@ When called with a prefix argument, ask the user for the revision."
(unless no-error (error "psvn.el: %s is not readable." file))))) (unless no-error (error "psvn.el: %s is not readable." file)))))
(defun svn-status-toggle-sort-status-buffer () (defun svn-status-toggle-sort-status-buffer ()
"If you turn off sorting, you can speed up M-x svn-status. "Toggle sorting of the *svn-status* buffer.
However, the buffer is not correct sorted then.
This function will be removed again, when a faster parsing and If you turn off sorting, you can speed up \[svn-status]. However,
display routine for svn-status is available." the buffer is not correctly sorted then. This function will be
removed again, when a faster parsing and display routine for
`svn-status' is available."
(interactive) (interactive)
(setq svn-status-sort-status-buffer (not svn-status-sort-status-buffer)) (setq svn-status-sort-status-buffer (not svn-status-sort-status-buffer))
(message "The %s buffer will be%s sorted." svn-status-buffer-name (message "The %s buffer will %sbe sorted." svn-status-buffer-name
(if svn-status-sort-status-buffer "" " not"))) (if svn-status-sort-status-buffer "" "not ")))
(defun svn-status-toggle-display-full-path () (defun svn-status-toggle-display-full-path ()
"Toggle displaying the full path in the `svn-status-buffer-name' buffer" "Toggle displaying the full path in the `svn-status-buffer-name' buffer"

View File

@ -1 +1 @@
0d91a7fe152d0373044c47c54deb2c9a subversion-1.3.0.tar.gz 6d650e918255596ef8b74255b3938547 subversion-1.3.1.tar.gz

View File

@ -2,8 +2,8 @@
%define make_check 1 %define make_check 1
%ifarch s390 %ifarch s390
# weird gjnih error on s390 # weird gjnih error on s390?
%define with_java 0 %define with_java 1
%else %else
%define with_java 1 %define with_java 1
%endif %endif
@ -15,8 +15,8 @@
Summary: Modern Version Control System designed to replace CVS Summary: Modern Version Control System designed to replace CVS
Name: subversion Name: subversion
Version: 1.3.0 Version: 1.3.1
Release: 5 Release: 3
License: BSD License: BSD
Group: Development/Tools Group: Development/Tools
URL: http://subversion.tigris.org/ URL: http://subversion.tigris.org/
@ -24,7 +24,6 @@ Source0: http://subversion.tigris.org/tarballs/subversion-%{version}.tar.gz
Source1: subversion.conf Source1: subversion.conf
Source3: filter-requires.sh Source3: filter-requires.sh
Source4: http://www.xsteve.at/prg/emacs/psvn.el Source4: http://www.xsteve.at/prg/emacs/psvn.el
Patch1: subversion-1.3.0-neonver.patch
Patch2: subversion-0.20.1-deplibs.patch Patch2: subversion-0.20.1-deplibs.patch
Patch3: subversion-0.31.0-rpath.patch Patch3: subversion-0.31.0-rpath.patch
Patch6: subversion-1.0.3-pie.patch Patch6: subversion-1.0.3-pie.patch
@ -102,7 +101,6 @@ This package includes the Ruby bindings to the Subversion libraries.
%prep %prep
%setup -q %setup -q
%patch1 -p1 -b .neonver
%patch2 -p1 -b .deplibs %patch2 -p1 -b .deplibs
%patch3 -p1 -b .rpath %patch3 -p1 -b .rpath
%patch6 -p1 -b .pie %patch6 -p1 -b .pie
@ -253,6 +251,11 @@ rm -rf ${RPM_BUILD_ROOT}
%endif %endif
%changelog %changelog
* Tue Apr 4 2006 Joe Orton <jorton@redhat.com> 1.3.1-3
- update to 1.3.1
- update to psvn.el r19138 (Stefan Reichoer)
- build -java on s390 again
* Thu Feb 16 2006 Florian La Roche <laroche@redhat.com> - 1.3.0-5 * Thu Feb 16 2006 Florian La Roche <laroche@redhat.com> - 1.3.0-5
- do not package libs within subversion-ruby, these are already - do not package libs within subversion-ruby, these are already
available via the main package available via the main package

View File

@ -1 +1 @@
subversion-1.3.0.tar.gz subversion-1.3.1.tar.gz

View File

@ -1,5 +1,5 @@
-----BEGIN PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.1 (GNU/Linux) Version: GnuPG v1.4.2.2 (GNU/Linux)
mQGiBDZHWLsRBACtzInKFFsS4RgRU4NTxvDXWcrasf8Bilpz2+BYqTl+TbKQETkc mQGiBDZHWLsRBACtzInKFFsS4RgRU4NTxvDXWcrasf8Bilpz2+BYqTl+TbKQETkc
181PYu3sApuIuXwlya4X5bCceo+yThdM8dN+4nktDLl3i6E2+tXfAsIR6MEQWzsI 181PYu3sApuIuXwlya4X5bCceo+yThdM8dN+4nktDLl3i6E2+tXfAsIR6MEQWzsI
@ -92,140 +92,381 @@ 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
n3XvPxBbvJUFwy3Y7bEr4YW/Cy9f AJ4uYBKHVbiKgPoLyYcM35Lak5PUTIhGBBMRAgAGBQJC32zKAAoJEN26ZLosMS0v
=4sB1 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
ue5s0DtZ1WJgpzQU
=0Kc2
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----