     (apply 'call-process svn-program nil buf nil (symbol-name command) args)
     buf))
 
-(defun svn-run-predicate (command args)
-  "Run `svn', discarding output, returning t if it succeeded (exited with
-status zero).
+(defun svn-run-for-stdout (command args)
+  "Run `svn', and return standard output as a string, discarding stderr.
 Argument COMMAND is the svn subcommand to run.
 Optional argument ARGS is a list of arguments."
-  (zerop
-   (apply 'call-process svn-program nil nil nil (symbol-name command) args)))
+  (let ((output-buffer (generate-new-buffer "*svn-stdout*")))
+    (apply 'call-process svn-program nil (list output-buffer nil) nil
+	   (symbol-name command) args)
+    (let ((stdout (with-current-buffer output-buffer (buffer-string))))
+      (kill-buffer output-buffer)
+      stdout)))
 
 (defun svn-output-filter (proc str)
   "Output filter for svn output.

  ;; First retrieve the property names, and then the value of each.
  ;; We can't use proplist -v because is output is ambiguous when values
  ;; consist of multiple lines.
  (unless (svn-run-predicate 'ls (list file))
    (error "%s is not under version control" file))
  (let (propnames)
    (with-current-buffer (svn-run-hidden 'proplist (list file))

      (insert str)
      (goto-char svn-output-marker)
      (while (looking-at
              "\\([ ACDGIMRX?!~][ CM][ L][ +][ S][ KOTB]\\)[ C]? \\([* ]\\) \\(........\\) \\(........\\) \\(............\\) \\([^ ].*\\)\n")
        (let ((status (match-string 1))
              (filename (match-string 6)))
          (delete-region (match-beginning 0)
