changeset 98519:4031fe2e11ee

(vc-svn-after-dir-status): Handle `svn status -u' output. (vc-svn-dir-status): Respect vc-stay-local-p. (Bug#1046)
author Glenn Morris <rgm@gnu.org>
date Sat, 04 Oct 2008 20:23:54 +0000
parents 31c64334579f
children 291daaa78213
files lisp/vc-svn.el
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/vc-svn.el	Sat Oct 04 19:55:00 2008 +0000
+++ b/lisp/vc-svn.el	Sat Oct 04 20:23:54 2008 +0000
@@ -1,6 +1,7 @@
 ;;; vc-svn.el --- non-resident support for Subversion version-control
 
-;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
+;;   Free Software Foundation, Inc.
 
 ;; Author:      FSF (see vc.el for full credits)
 ;; Maintainer:  Stefan Monnier <monnier@gnu.org>
@@ -146,7 +147,9 @@
   "SVN-specific state heuristic."
   (vc-svn-state file 'local))
 
-(defun vc-svn-after-dir-status (callback)
+;; FIXME it would be better not to have the "remote" argument,
+;; but to distinguish the two output formats based on content.
+(defun vc-svn-after-dir-status (callback &optional remote)
   (let ((state-map '((?A . added)
                      (?C . conflict)
                      (?D . removed)
@@ -156,11 +159,18 @@
                      (?? . unregistered)
                      ;; This is what vc-svn-parse-status does.
                      (?~ . edited)))
+	(re (if remote "^\\(.\\)..... \\([ *]\\) +[-0-9]+ +\\(.*\\)$"
+	      ;; Subexp 2 is a dummy in this case, so the numbers match.
+	      "^\\(.\\)....\\(.\\) \\(.*\\)$"))
        result)
     (goto-char (point-min))
-    (while (re-search-forward "^\\(.\\)..... \\(.*\\)$" nil t)
+    (while (re-search-forward re nil t)
       (let ((state (cdr (assq (aref (match-string 1) 0) state-map)))
-           (filename (match-string 2)))
+	    (filename (match-string 3)))
+	(and remote (string-equal (match-string 2) "*")
+	     ;; FIXME are there other possible combinations?
+	     (cond ((eq state 'edited) (setq state 'needs-merge))
+		   ((not state) (setq state 'needs-update))))
        (when state
          (setq result (cons (list filename state) result)))))
     (funcall callback result)))
@@ -169,9 +179,12 @@
   "Run 'svn status' for DIR and update BUFFER via CALLBACK.
 CALLBACK is called as (CALLBACK RESULT BUFFER), where
 RESULT is a list of conses (FILE . STATE) for directory DIR."
-  (vc-svn-command (current-buffer) 'async nil "status")
+  ;; FIXME should this rather be all the files in dir?
+  (let ((remote (not (vc-stay-local-p dir))))
+    (vc-svn-command (current-buffer) 'async nil "status"
+		    (if remote "-u"))
   (vc-exec-after
-   `(vc-svn-after-dir-status (quote ,callback))))
+     `(vc-svn-after-dir-status (quote ,callback) ,remote))))
 
 (defun vc-svn-dir-status-files (dir files default-state callback)
   (apply 'vc-svn-command (current-buffer) 'async nil "status" files)