Subject: error at vc-mtn-mode-line-string of vc-mtn.el

From: Masatake YAMATO <[email-masked]>
Date: Thu, 07 Oct 2010 19:53:11 +0900 (JST)

When I tried to open a file under monotone version control system,
emacs reports an error because vc-mtn-workfile-branch in
vc-mtn-mode-line-string retruns nil.

Backtrace
------------------------------------------------------------------------
Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  string-match("\\`[^:/#]*[:/#]" nil)
  (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch)))
  (while --cl-dolist-temp-- (setq rule (car --cl-dolist-temp--)) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))) (setq --cl-dolist-temp-- (cdr --cl-dolist-temp--)))
  (let ((--cl-dolist-temp-- vc-mtn-mode-line-rewrite) rule) (while --cl-dolist-temp-- (setq rule (car --cl-dolist-temp--)) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))) (setq --cl-dolist-temp-- (cdr --cl-dolist-temp--))) nil)
  (catch (quote --cl-block-nil--) (let ((--cl-dolist-temp-- vc-mtn-mode-line-rewrite) rule) (while --cl-dolist-temp-- (setq rule (car --cl-dolist-temp--)) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))) (setq --cl-dolist-temp-- (cdr --cl-dolist-temp--))) nil))
  (cl-block-wrapper (catch (quote --cl-block-nil--) (let ((--cl-dolist-temp-- vc-mtn-mode-line-rewrite) rule) (while --cl-dolist-temp-- (setq rule (car --cl-dolist-temp--)) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))) (setq --cl-dolist-temp-- (cdr --cl-dolist-temp--))) nil)))
  (block nil (let ((--cl-dolist-temp-- vc-mtn-mode-line-rewrite) rule) (while --cl-dolist-temp-- (setq rule (car --cl-dolist-temp--)) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))) (setq --cl-dolist-temp-- (cdr --cl-dolist-temp--))) nil))
  (dolist (rule vc-mtn-mode-line-rewrite) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch))))
  (let ((branch (vc-mtn-workfile-branch file))) (dolist (rule vc-mtn-mode-line-rewrite) (if (string-match (car rule) branch) (setq branch (replace-match (cdr rule) t nil branch)))) (format "Mtn%c%s" (case (vc-state file) ((up-to-date needs-update) 45) (added 64) (t 58)) branch))
  vc-mtn-mode-line-string("/tmp/net.venge.monotone/AUTHORS")
  apply(vc-mtn-mode-line-string "/tmp/net.venge.monotone/AUTHORS")
  vc-call-backend(Mtn mode-line-string "/tmp/net.venge.monotone/AUTHORS")
  vc-mode-line("/tmp/net.venge.monotone/AUTHORS" Mtn)
  vc-find-file-hook()
  run-hooks(find-file-hook)
  after-find-file(nil t)
  find-file-noselect-1(#<buffer AUTHORS> "/tmp/net.venge.monotone/AUTHORS" nil nil "/tmp/net.venge.monotone/AUTHORS" (1205380 64768))
  find-file-noselect("/tmp/net.venge.monotone/AUTHORS" nil nil t)
  find-file("/tmp/net.venge.monotone/AUTHORS" t)
  call-interactively(find-file nil nil)
------------------------------------------------------------------------

Software version
------------------------------------------------------------------------
GNU Emacs 24.0.50.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.20.1) of 2010-10-07 on dhcp-193-209.nrt.redhat.com

mtn --version
monotone 0.48 (base revision: 844268c137aaa783aa800a9c16ae61edda80ecea)
------------------------------------------------------------------------

How to reproduce
------------------------------------------------------------------------
1. Prepare  source code under monotone vcs

   cd /tmp
   mtn clone monotone://code.monotone.ca/monotone net.venge.monotone
   ...

2. open a source code with \C-x\C-f

   \C-x\C-f
   Find file: /tmp/net.venge.monotone/AUTHORS

   You will got
   if: Wrong type argument: stringp, nil at *Message*
------------------------------------------------------------------------

My analysis
------------------------------------------------------------------------
An regular expression,  "Current branch: \\(.*\\)\nChanges against parent \\(.*\\)"
in  `vc-mtn-workfile-branch' doesn't match to the output of mtn status:

   $ cd /tmp/net.venge.monotone
   $ mtn status at /tmp/net.venge.monotone
   ----------------------------------------------------------------------
   Revision: 40f634fe2e8124dfa567a2ca805824dcfaf6f2c2
   Parent:   e50b098f9f507bd83207365c7893058fbd01635a
   Author:   ???
   Date:     10/07/2010 07:48:45 PM
   Branch:   net.venge.monotone

   Changes against parent e50b098f9f507bd83207365c7893058fbd01635a

   no changes

No "Current branch: ..." line is found.

I propose following patch but I'm not sure this patch is correct or
not because I'm too new to monotone.

2010-10-07  Masatake YAMATO  <[email-masked]>

	* vc/vc-mtn.el (vc-mtn-working-revision): Use an empty
	string as the result of 'vc-mtn-working-revision'
	if it returns nil.

=== modified file 'lisp/vc/vc-mtn.el'
*** lisp/vc/vc-mtn.el	2010-08-29 16:17:13 +0000
--- lisp/vc/vc-mtn.el	2010-10-07 10:35:52 +0000
***************
*** 156,162 ****
  
  (defun vc-mtn-mode-line-string (file)
    "Return string for placement in modeline by `vc-mode-line' for FILE."
!   (let ((branch (vc-mtn-workfile-branch file)))
      (dolist (rule vc-mtn-mode-line-rewrite)
        (if (string-match (car rule) branch)
  	  (setq branch (replace-match (cdr rule) t nil branch))))
--- 156,162 ----
  
  (defun vc-mtn-mode-line-string (file)
    "Return string for placement in modeline by `vc-mode-line' for FILE."
!   (let ((branch (or (vc-mtn-workfile-branch file) "")))
      (dolist (rule vc-mtn-mode-line-rewrite)
        (if (string-match (car rule) branch)
  	  (setq branch (replace-match (cdr rule) t nil branch))))

Masatake YAMATO