- 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
;; Copyright (C) 2002-2005 by Stefan Reichoer
;; Copyright (C) 2002-2006 by Stefan Reichoer
;; 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
;; 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 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
;; (see http://subversion.tigris.org)
@ -185,7 +185,11 @@
;;; Code:
(require 'easymenu)
(require 'diff-mode nil t)
(condition-case nil
(progn
(require 'diff-mode))
(error nil))
;;; user setable variables
(defcustom svn-status-verbose t
@ -220,9 +224,11 @@ This can be toggled with \\[svn-status-toggle-hide-unmodified]."
:type 'boolean
:group 'psvn)
(defcustom svn-status-sort-status-buffer t
"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.
"*Whether to sort the `svn-status-buffer-name' buffer.
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]."
:type 'boolean
: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].")
(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].")
(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
(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
"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
(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-edit-svn-command nil)
(defvar svn-status-update-previous-process-output nil)
(defvar svn-pre-run-asynch-recent-keys nil)
(defvar svn-status-temp-dir
(expand-file-name
(or
@ -579,7 +587,7 @@ See also `svn-status-short-mod-flag-p'."
(((class color) (background light)) (:foreground "blue4"))
(((class color) (background dark)) (:foreground "lightskyblue1"))
(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."
: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
'((((class color) (background light)) (:foreground "chocolate"))
(((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."
:group 'psvn-faces)
@ -709,6 +717,9 @@ Use this instead of `alist', for XEmacs 21.4 compatibility."
,value-type)))))
widget))
;;; keymaps
(defvar svn-global-keymap nil "Global keymap for psvn.el.
To bind this to a different key, customize `svn-status-prefix-key'.")
(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 "u") 'svn-status-update-cmd)
(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 ()
"Keymap used in `svn-status-diff-mode' for additional commands that are not defined in diff-mode.")
@ -778,7 +791,9 @@ inside loops."
;;;###autoload
(defun svn-status (dir &optional arg)
"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: "
nil default-directory nil)
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)))
(let* ((status-buf (get-buffer-create svn-status-buffer-name))
(proc-buf (get-buffer-create "*svn-process*"))
(status-option (if svn-status-verbose
(if arg "-uv" "-v")
(if arg "-u" ""))))
(want-edit (eq arg '-))
(status-option (if want-edit
(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
(set-buffer status-buf)
(setq default-directory dir)
(set-buffer proc-buf)
(setq default-directory dir
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)
"Run `svn-status' for the `default-directory'"
@ -831,6 +850,9 @@ If ARG then pass the -u argument to `svn status'."
(svn-status 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 ()
"Construct the environment for the svn process.
It is a combination of `svn-status-svn-environment-var-list' and
@ -850,7 +872,7 @@ the usual `process-environment'."
and when has-value
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.
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.
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))
(if (eq (process-status "svn") nil)
(progn
(when svn-status-edit-svn-command
(setq arglist (append arglist
(split-string
(read-from-minibuffer
(format "Run `svn %s' with extra arguments: "
(mapconcat 'identity arglist " "))))))
(setq arglist (append
(list (car arglist))
(split-string
(read-from-minibuffer
(format "svn %s flags: " (car arglist))
(mapconcat 'identity (cdr arglist) " ")))))
(when (eq svn-status-edit-svn-command 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*"))
(svn-exe svn-status-svn-executable)
(svn-proc))
@ -900,6 +923,7 @@ is prompted for give extra arguments, which are appended to ARGLIST."
(if run-asynchron
(progn
;;(message "running asynchron: %s %S" svn-exe arglist)
(setq svn-pre-run-asynch-recent-keys (recent-keys))
(let ((process-environment (svn-process-environment))
(process-connection-type nil))
;; 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)))))
(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)
;; convert path separator to UNIX style
(save-excursion
(goto-char (point-min))
(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))
(when svn-status-display-new-status-buffer
(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)
(svn-status-show-process-output 'log t)
(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))
(insert str)
(save-excursion
(goto-char (line-beginning-position))
(goto-char (svn-point-at-bol))
(when (looking-at "Password for '\\(.+\\)': ")
;(svn-status-show-process-buffer)
(let ((passwd (read-passwd
@ -1464,7 +1491,7 @@ A and B must be line-info's."
["svn info" svn-status-info t]
["svn blame" svn-status-blame t]))
(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))))
(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)
(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 ()
"Open selected file(s) for editing.
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>"))
((equal action 'deleted)
(setq tag-string " <deleted>"))
((equal action 'replaced)
(setq tag-string " <replaced>"))
((equal action 'added-wc)
(svn-status-line-info->set-filemark line-info ?A)
(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 (svn-status-parse-commit-output))
(defun svn-status-parse-commit-output ()
"Parse the output of svn commit.
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))
((looking-at "Deleting")
(setq action 'deleted))
((looking-at "Replacing")
(setq action 'replaced))
((looking-at "Transmitting file data")
(setq skip t))
((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-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)
"Return t if LINE-INFO refers to a directory, nil otherwise.
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->filename-nondirectory line-info)
'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) " ..." "")))
(svn-puthash (svn-status-line-info->filename line-info)
(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.
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."
(interactive "P")
(if (eq arg 0)
(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))
(unless (eq arg t)
(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)
"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
(svn-status-marked-files)
(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)))
(defun svn-status-select-line ()
"Return information about the file under point.
\(Only used for debugging\)"
(interactive)
(let ((info (svn-status-get-line-information)))
(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"))))
(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")))
@ -2506,7 +2591,6 @@ Consider svn-status-window-alist to choose the buffer name."
(other-window 1))
(svn-status-show-process-buffer-internal scroll-to-top)))))
(defun svn-status-show-svn-log (arg)
"Run `svn log' on selected files.
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"))
(t svn-status-default-log-arguments))))
(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
(set-buffer "*svn-process*")
(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."
(interactive)
(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
(defun svn-status-blame ()
"Run `svn blame' on the current file."
(interactive)
;;(svn-run-svn 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" "-r" "BASE" (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)
"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)
(beginning nil))
(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)
(if (svn-status-line-info->update-available line-info)
"HEAD" "BASE")
@ -2639,7 +2723,6 @@ Commands:
major-mode mode-name)
(diff-mode)))
(defun svn-status-show-process-buffer ()
"Show the content of the *svn-process* buffer"
(interactive)
@ -2653,7 +2736,7 @@ When this function is called with a prefix argument, use the actual file instead
(interactive "P")
(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-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)
"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")
(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-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)
"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))))
(unless (string-match "^[^:/]+://" dir) ; Is it a URI?
(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
;;function to do both?
@ -2703,7 +2786,8 @@ itself) before running mv."
;; file into.
(setq dest (read-file-name (format "Rename %s to: "
(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.
(setq dest (svn-read-directory-name (format "Move %d files to directory: " num-of-files)
(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
;;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,
;;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'
(if (yes-or-no-p (format "%s has local modifications; use `--force' to really move it? "
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)))
((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'? "
@ -2751,12 +2835,12 @@ itself) before running mv."
(message "Not moving %s (try committing it first)" original-name))
((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?
(t
(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))))))
(svn-status-update)))
@ -2772,7 +2856,7 @@ See `svn-status-marked-files' for what counts as selected."
(format "Revert %d files? " num-of-files)))
(message "reverting: %S" (svn-status-marked-file-names))
(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)
"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))
(svn-status-create-arg-file svn-status-temp-arg-file "" (svn-status-marked-files) "")
(if force
(svn-run-svn 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" "--force" "--targets" svn-status-temp-arg-file)
(svn-run t t 'rm "rm" "--targets" svn-status-temp-arg-file)))))
(defun svn-status-update-cmd ()
"Run svn update."
(interactive)
(message "Running svn-update for %s" default-directory)
;TODO: use file names also
(svn-run-svn t t 'update "update"))
(svn-run t t 'update "update"))
(defun svn-status-commit ()
"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.
If no files have been marked, commit recursively the file at point."
(interactive)
(svn-status-save-some-buffers)
(let* ((selected-files (svn-status-marked-files))
(marked-files-p (svn-status-some-files-marked-p)))
(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)))
(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 ()
"Run `svn export' for the current working copy.
Ask the user for the destination path.
@ -2835,7 +2930,7 @@ Ask the user for the destination path.
(let* ((src default-directory)
(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))))
(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)))
(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
(progn
(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"))))
(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)))
(message "resolving: %S" (svn-status-marked-file-names))
(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 ()
@ -3008,7 +3103,7 @@ names are relative to the directory where `svn-status' was run."
(file-name-nondirectory file-name)
".svn-base"))
(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
;;svn: Filesystem has no item
;;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)))
(if file-names
(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"))))
(defun svn-status-proplist-start ()
(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))))
(defun svn-status-property-edit-one-entry (arg)
"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))
(let ((file-names (svn-status-marked-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))
)
)
@ -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)))
(when 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))))))))))
(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)))
(prop-value))
(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
(set-buffer "*svn-process*")
(setq prop-value (if (> (point-max) 1)
@ -3388,7 +3483,7 @@ Commands:
(svn-status-create-arg-file svn-status-temp-arg-file ""
svn-status-propedit-file-list "")
(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
"--targets" svn-status-temp-arg-file
"-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"
"Wrapper around `log-edit-mode' for psvn.el"
(easy-menu-add svn-log-edit-mode-menu)
(run-hooks 'svn-log-edit-mode-hook)
(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-listfun) 'svn-log-edit-files-to-commit)
@ -3479,6 +3573,7 @@ Commands:
(defun svn-log-edit-done ()
(interactive)
(svn-status-save-some-buffers)
(save-excursion
(set-buffer (get-buffer "*svn-log-edit*"))
(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)
(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)))
(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-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)
"-F" svn-status-temp-file-to-remove)
(save-excursion
@ -3504,7 +3600,7 @@ Commands:
(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-svn t t 'commit "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
@ -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 "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
"'svn-log-view-mode' menu"
'("SVN-LogView"
["Show Changeset" svn-log-view-diff t]
["Edit log message" svn-log-edit-log-entry t]))
(defvar svn-log-view-font-lock-keywords
'(("^r.+" . font-lock-keyword-face)
"Keywords in svn-log-view-mode."))
(put 'svn-log-view-font-lock-keywords 'risky-local-variable t) ;for Emacs 20.7
(defun svn-log-view-popup-menu (event)
(interactive "e")
(mouse-set-point event)
(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"
"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)))
(when 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)))
(defun svn-log-edit-log-entry ()
@ -3645,7 +3761,7 @@ When called with a prefix argument, ask the user for the revision."
(interactive)
(let ((rev (svn-log-revision-at-point))
(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
(set-buffer "*svn-process*")
(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
;; --------------------------------------------------------------------------------
(defun svn-status-base-dir ()
(let ((base-dir (expand-file-name default-directory))
(dot-svn-dir)
(dir-below (expand-file-name default-directory)))
(setq dot-svn-dir (concat base-dir (svn-wc-adm-dir-name)))
(defun svn-status-base-dir (&optional start-directory)
"Find the svn root directory for the current working copy.
Return nil, if not in a svn working copy."
(let* ((base-dir (expand-file-name (or start-directory default-directory)))
(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))
(setq base-dir (file-name-directory dot-svn-dir))
(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)))))
base-dir))
(and in-tree base-dir)))
(defun svn-status-save-state ()
"Save psvn persistent options for this working copy to a file."
(interactive)
(let ((buf (find-file (concat (svn-status-base-dir) "++psvn.state"))))
(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)))
(defun svn-status-load-state (&optional no-error)
"Load psvn persistent options for this working copy from a file."
(interactive)
(let ((file (concat (svn-status-base-dir) "++psvn.state")))
(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)))))
(defun svn-status-toggle-sort-status-buffer ()
"If you turn off sorting, you can speed up M-x svn-status.
However, the buffer is not correct sorted then.
This function will be removed again, when a faster parsing and
display routine for svn-status is available."
"Toggle sorting of the *svn-status* buffer.
If you turn off sorting, you can speed up \[svn-status]. However,
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)
(setq svn-status-sort-status-buffer (not svn-status-sort-status-buffer))
(message "The %s buffer will be%s sorted." svn-status-buffer-name
(if svn-status-sort-status-buffer "" " not")))
(message "The %s buffer will %sbe sorted." svn-status-buffer-name
(if svn-status-sort-status-buffer "" "not ")))
(defun svn-status-toggle-display-full-path ()
"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
%ifarch s390
# weird gjnih error on s390
%define with_java 0
# weird gjnih error on s390?
%define with_java 1
%else
%define with_java 1
%endif
@ -15,8 +15,8 @@
Summary: Modern Version Control System designed to replace CVS
Name: subversion
Version: 1.3.0
Release: 5
Version: 1.3.1
Release: 3
License: BSD
Group: Development/Tools
URL: http://subversion.tigris.org/
@ -24,7 +24,6 @@ Source0: http://subversion.tigris.org/tarballs/subversion-%{version}.tar.gz
Source1: subversion.conf
Source3: filter-requires.sh
Source4: http://www.xsteve.at/prg/emacs/psvn.el
Patch1: subversion-1.3.0-neonver.patch
Patch2: subversion-0.20.1-deplibs.patch
Patch3: subversion-0.31.0-rpath.patch
Patch6: subversion-1.0.3-pie.patch
@ -102,7 +101,6 @@ This package includes the Ruby bindings to the Subversion libraries.
%prep
%setup -q
%patch1 -p1 -b .neonver
%patch2 -p1 -b .deplibs
%patch3 -p1 -b .rpath
%patch6 -p1 -b .pie
@ -253,6 +251,11 @@ rm -rf ${RPM_BUILD_ROOT}
%endif
%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
- do not package libs within subversion-ruby, these are already
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-----
Version: GnuPG v1.4.1 (GNU/Linux)
Version: GnuPG v1.4.2.2 (GNU/Linux)
mQGiBDZHWLsRBACtzInKFFsS4RgRU4NTxvDXWcrasf8Bilpz2+BYqTl+TbKQETkc
181PYu3sApuIuXwlya4X5bCceo+yThdM8dN+4nktDLl3i6E2+tXfAsIR6MEQWzsI
@ -92,140 +92,381 @@ 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
n3XvPxBbvJUFwy3Y7bEr4YW/Cy9f
=4sB1
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
ue5s0DtZ1WJgpzQU
=0Kc2
-----END PGP PUBLIC KEY BLOCK-----