emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] bug report: agenda timeline crashes


From: Nick Dokos
Subject: Re: [O] bug report: agenda timeline crashes
Date: Tue, 21 Feb 2012 21:43:46 -0500

Ilya Shlyakhter <address@hidden> wrote:

> In the head revision, if the org file has headlines that start with a
> timestamp, the command to create a timeline of the file (C-a L)
> crashes.
> 
> 
> * things
> *** <2011-10-06 Thu 22:24>
> 
>     some text
> 
> 
> mapcar: Args out of range: #("  " 0 2 (org-category "mt3" tags nil
> org-highest-priority 65 org-lowest-priority 69 time-of-day 2224 ...)),
> 0, 37
> 

Confirmed. The culprit seems to be some not-so-robust code in
org-agenda-highlight-todo. Here's the code:

--8<---------------cut here---------------start------------->8---
      ...
      (let ((pl (text-property-any 0 (length x) 'org-heading t x)))
          (setq re (get-text-property 0 'org-todo-regexp x))
          (when (and re
                     (equal (string-match (concat "\\(\\.*\\)" re "\\( +\\)")
                                          x (or pl 0)) pl))
            (add-text-properties
             (or (match-end 1) (match-end 0)) (match-end 0)
             (list 'face (org-get-todo-face (match-string 2 x)))
             x)
            (when (match-end 1)
              (setq x (concat (substring x 0 (match-end 1))
                              (format org-agenda-todo-keyword-format
                                      (match-string 2 x))
                              (org-add-props " " (text-properties-at 0 x))
                              (substring x (match-end 3)))))))
      ...
--8<---------------cut here---------------end--------------->8---

The problem is that pl is nil in this case and so is the
value of

      (string-match (concat "\\(\\.*\\)" re "\\( +\\)") x (or pl 0))

but they compare equal, so the body of the

    (when (and re ...)
      <body>
     )

is evaluated with disastrous results: the string-match has failed so it
has not set any matches for (match-end ...) to find. In this case,
(match-end 1) evaluated to 36 (that's in a 3-character string :-).

AFAICT, the whole body should be skipped in the case when pl is nil:

        (let ((pl ...))
          (when pl
            (setq re (...)
            (when (and re (...))
               ...
               ...))))

But it's not clear to me whether this is the only bug.

Nick



reply via email to

[Prev in Thread] Current Thread [Next in Thread]