summaryrefslogtreecommitdiff
path: root/lisp/vc-svn.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/vc-svn.el')
-rw-r--r--lisp/vc-svn.el49
1 files changed, 42 insertions, 7 deletions
diff --git a/lisp/vc-svn.el b/lisp/vc-svn.el
index 0b34c30f630..bf003f2ac97 100644
--- a/lisp/vc-svn.el
+++ b/lisp/vc-svn.el
@@ -24,11 +24,8 @@
;;; Commentary:
-;; This is preliminary support for Subversion (http://subversion.tigris.org/).
-;; It started as `sed s/cvs/svn/ vc.cvs.el' (from version 1.56)
-;; and hasn't been completely fixed since.
-
-;; Sync'd with Subversion's vc-svn.el as of revision 5801.
+;; Sync'd with Subversion's vc-svn.el as of revision 5801. but this version
+;; has been extensively modified since to handle filesets.
;;; Bugs:
@@ -382,7 +379,16 @@ The changes are between FIRST-VERSION and SECOND-VERSION."
(let ((inhibit-read-only t))
(goto-char (point-min))
;; Add a line to tell log-view-mode what file this is.
- (insert "Working file(s): " (vc-delistify (mapcar 'file-relative-name files)) "\n"))
+ ;; FIXME if there are multiple files, log-view-current-file
+ ;; breaks. It's trivial to adapt log-view-file-re for the
+ ;; changed prefix, but less trivial to make
+ ;; log-view-current-file actually do the right thing in the
+ ;; multiple file case.
+ (insert (format "Working file%s: "
+ (if (= (length files) 1)
+ ""
+ "s"))
+ (vc-delistify (mapcar 'file-relative-name files)) "\n"))
(vc-svn-command
buffer
(if (and (= (length files) 1) (vc-stay-local-p (car files)) (fboundp 'start-process)) 'async 0)
@@ -433,7 +439,7 @@ The changes are between FIRST-VERSION and SECOND-VERSION."
(defun vc-svn-diff-tree (dir &optional rev1 rev2)
"Diff all files at and below DIR."
- (vc-svn-diff (file-name-as-directory dir) rev1 rev2))
+ (vc-svn-diff (list (file-name-as-directory dir)) rev1 rev2))
;;;
;;; Snapshot system
@@ -512,6 +518,33 @@ and that it passes `vc-svn-global-switches' to it before FLAGS."
;; behavior for different modules on the same server.
(match-string 1))))
+(defun vc-svn-resolve-when-done ()
+ "Call \"svn resolved\" if the conflict markers have been removed."
+ (save-excursion
+ (goto-char (point-min))
+ (if (not (re-search-forward "^<<<<<<< " nil t))
+ (vc-svn-command nil 0 buffer-file-name "resolved"))))
+
+;; Inspired by vc-arch-find-file-hook.
+(defun vc-svn-find-file-hook ()
+ (when (eq ?C (vc-file-getprop buffer-file-name 'vc-svn-status))
+ ;; If the file is marked as "conflicted", then we should try and call
+ ;; "svn resolved" when applicable.
+ (if (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^<<<<<<< " nil t))
+ ;; There are conflict markers.
+ (progn
+ (smerge-mode 1)
+ (add-hook 'after-save-hook 'vc-svn-resolve-when-done nil t))
+ ;; There are no conflict markers. This is problematic: maybe it means
+ ;; the conflict has been resolved and we should immediately call "svn
+ ;; resolved", or it means that the file's type does not allow Svn to
+ ;; use conflict markers in which case we don't really know what to do.
+ ;; So let's just punt for now.
+ nil)
+ (message "There are unresolved conflicts in this file")))
+
(defun vc-svn-parse-status (&optional filename)
"Parse output of \"svn status\" command in the current buffer.
Set file properties accordingly. Unless FILENAME is non-nil, parse only
@@ -534,6 +567,8 @@ information about FILENAME and return its status."
;; Use the last-modified revision, so that searching in vc-print-log
;; output works.
(vc-file-setprop file 'vc-workfile-version (match-string 3))
+ ;; Remember Svn's own status.
+ (vc-file-setprop file 'vc-svn-status status)
(vc-file-setprop
file 'vc-state
(cond