Subject: bug#2388: 23.0.90; wrong-type-argument in vc-dir

From: Dan Nicolaescu <[email-masked]>
Date: Tue, 10 Mar 2009 14:11:01 -0700 (PDT)

robert marshall <[email-masked]> writes:

  > Nick Roberts wrote:
  > > Nick Roberts writes:
  > >  >  > > I can't reproduce this.
  > >  >  > > Can you please post step by step recipe of how you get this, starting
  > >  >  > > with emacs -Q.  >  > > The output of  >  > > svn -u status
  > >  >  > > in that directory might be helpful too.
  > >  >  > >    >  > I can't reproduce this either now :-(
  > >  >  > I have seen this sometimes when files have needed
  > > merging/updating.  I don't
  > >  > think it happened earlier because with SVN emacs didn't consult the remote
  > >  > repository by default:
  > >
  > > I still see this.  Here's a recent backtrace:
  > >
  > > Debugger entered--Lisp error: (wrong-type-argument arrayp nil)
  > >   ewoc-data(nil)
  > >   (let ((data ...)) (or (vc-dir-fileinfo->directory data)
  > > (file-name-directory ...)))
  > >   vc-dir-node-directory(nil)
  > >   (let* ((rd ...) (prev-node ...) (prev-dir ...)) (unless
  > > (string-equal entrydir prev-dir) (ewoc-enter-before vc-ewoc node
  > > ...)))
  > >   (cond ((string-lessp nodedir entrydir) (setq node ...))
  > > ((string-equal nodedir entrydir) (let ... ...)) (t (let* ... ...)
  > > (ewoc-enter-before vc-ewoc node ...) (setq entries ... entry ...)))
  > >   (let* ((entryfile ...) (entrydir ...) (nodedir ...)) (cond
  > > (... ...) (... ...) (t ... ... ...)))
  > >   (while (and entry node) (let* (... ... ...) (cond ... ... ...)))
  > >   (let ((entry ...) (node ...) (dotname ...)) (unless node
  > > (ewoc-enter-last vc-ewoc ...) (setq node ...)) (while (and entry
  > > node) (let* ... ...)) (unless (or node noinsert) (let ... ...)))
  > >   (save-current-buffer (set-buffer buffer) (setq entries (sort
  > > entries ...)) (let (... ... ...) (unless node ... ...) (while
  > > ... ...) (unless ... ...)))
  > >   (with-current-buffer buffer (setq entries (sort entries ...)) (let
  > > (... ... ...) (unless node ... ...) (while ... ...) (unless
  > > ... ...)))
  > >   vc-dir-update((("." needs-update) ("mydir" needs-update)
  > > ("pom.xml" needs-update) ("mydir1/mydir2/myfile" needs-update) ...
  > >
  > > which fails because node, i.e (ewoc-nth vc-ewoc 0), is nil.
  > >
  > >   
  > I'm seeing this, today, the status gives me
  > 
  > svn -u status
  >       *     7243   tests/compare.py
  >       *     7243   tests/harm.py
  >       *     7243   tests/setup-win.py
  >       *     7243   ipsa.i
  >       *     7243   Makefile
  >       *     7243   IscNetComponent.cpp
  >       *     7243   IscNetComparator.h
  >       *     7243   IpsaComparator.cpp
  >       *     7243   IscNetComponent.h
  >       *     7243   IscNetComparator.cpp
  >       *            IscCompareData.h
  > ?                   ipsa_wrap.cpp
  > M      *     7243   IscInterface.cpp
  > ?                   ipsa.py
  >       *            IscCompareData.cpp
  >       *     7243   Scripting.vcproj
  >       *     7243   .
       ^^^^^^^^^^^^^^^^^^^^^^^^ 
   This might be the cause of the problem.  Can you please try thing
   patch:

Index: vc-svn.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-svn.el,v
retrieving revision 1.112
diff -u -3 -p -u -p -r1.112 vc-svn.el
--- vc-svn.el 10 Feb 2009 05:59:14 -0000        1.112
+++ vc-svn.el 10 Mar 2009 20:49:23 -0000
@@ -176,7 +176,7 @@ want to force an empty list of arguments
        ;; FIXME are there other possible combinations?
             (cond ((eq state 'edited) (setq state 'needs-merge))
                      ((not state) (setq state 'needs-update))))
-       (when state
+       (when (and state (not (string= "." filename)))
          (setq result (cons (list filename state) result)))))
     (funcall callback result)))