# HG changeset patch # User Glenn Morris # Date 1223151834 0 # Node ID 4031fe2e11ee9b6ed3bfdf6d421414a526891c57 # Parent 31c64334579ffef20c19c04a75a27d2aba4845ad (vc-svn-after-dir-status): Handle `svn status -u' output. (vc-svn-dir-status): Respect vc-stay-local-p. (Bug#1046) diff -r 31c64334579f -r 4031fe2e11ee lisp/vc-svn.el --- 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 @@ -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)