Announcements and discussions for Gnus, the GNU Emacs Usenet newsreader
 help / color / mirror / Atom feed
From: Kai von Fintel <fintel@mit.edu>
To: info-gnus-english@gnu.org
Subject: Re: Finding message by ID fails when message not visible
Date: Thu, 17 Dec 2015 13:56:15 -0500	[thread overview]
Message-ID: <m28u4svr8w.fsf@mit.edu> (raw)
In-Reply-To: <877fkdvnc0.fsf@ericabrahamsen.net>

Eric Abrahamsen <eric@ericabrahamsen.net> writes:

> Kai von Fintel <fintel@mit.edu> writes:
>
>> Kai von Fintel <fintel@mit.edu> writes:
>>
>>> Eric Abrahamsen <eric@ericabrahamsen.net> writes:
>>>
>>>> Kai von Fintel <fintel@mit.edu> writes:
>>>>
>>>>> I'm puzzled by the following behavior: if I search in an nnimap group
>>>>> for a message with a particular message-ID, the search fails unless the
>>>>> message is visible. If for example, only new messages are shown, the
>>>>> search for an old message with a particular ID fails but the same
>>>>> message is found when "/o" has made the old messages appear.
>>>>>
>>>>> This is relevant because I use links to gnus messages from org-mode and
>>>>> more often than not the link fails: I get taken to the nnimap group that
>>>>> contains the message, but I get the error "No such article (may have
>>>>> expired or been canceled)", even though the message is in fact in the
>>>>> group.
>>>>>
>>>>> I suppose org-gnus.el might have to be amended to work around this, but
>>>>> first I'd like to understand whether this is expected behavior in gnus.
>>>>>
>>>>> Can anybody enlighten me or help me trouble-shoot this?
>>>>
>>>> No, it's not expected, and I haven't seen it before -- sorry for the
>>>> unhelpful reply! I just tried it (dovecot imap server), and it worked
>>>> both with and without angle brackets on the ID (sometimes brackets can
>>>> be an issue).
>>>>
>>>> To be sure everyone's on the same page, how exactly are you searching?
>>>> If you're in the *Group* buffer and you hit "G G" on the group, and
>>>> paste in the message ID, is the message found? If you're already in the
>>>> *Summary* buffer, there isn't really any way to "search" as such,
>>>> there's only "limiting" what messages are shown by some criteria -- in
>>>> those cases it's true you won't be able to get to unseen messages.
>>>>
>>>> But that should never affect following links from org mode...
>>>>
>>>> Eric
>>>
>>> Thanks for the reply, Eric. More details then.
>>>
>>> 1. GG in the group buffer works (after a brief delay, displaying
>>> "Opening server FastmailLocal" and then "Searching
>>> nnimap+FastmailLocal:Archive...done").
>>>
>>> 2. M-^ ("Fetch article with id ...) in the summary buffer (a) works when
>>> the message is visible, (b) fails when the message isn't visible (with
>>> "No such article (may have expired or been canceled)").
>>>
>>> 3. When I follow the org link, say
>>> "gnus:nnimap+FastmailLocal:Archive#56614DE9.5030300@upf.edu", I do get
>>> taken to the right nnimap group in gnus but the article is not displayed
>>> (again, with "No such article (may have expired or been canceled)").
>>>
>>> One funny thing is that when the "search" fails (in both cases 2b and
>>> 3), the article summary actually is visible (see screenshot:
>>> https://www.dropbox.com/s/b1b9mxi7bl0a51j/missing-article.jpg?dl=0)
>>>
>>> If 1 and 2 are as expected, then I guess the issue is with org-gnus and
>>> how it interacts with my IMAP set-up (offlineimap + dovecot + nnimap)?
>>>
>>> -- Kai.
>>
>> Some more follow-up. I tried to understand the code in org-gnus.el and
>> org-sum.el. It appears that the functions "org-gnus-open" and
>> "org-gnus-follow-link" call the function "gnus-summary-goto-article"
>> from gnus-sum.el. The latter is called with the optional arguments "nil"
>> and "t". The last one is supposed to force that all articles are loaded,
>> but that doesn't seem to happen.
>>
>> When I call (gnus-summary-goto-article "56614DE9.5030300@upf.edu" nil t)
>> in the summary buffer of the relevant group, it finds the message when
>> it is listed and doesn't find it if the buffer has only the first 200
>> articles (loading all articles with "/o" then makes the function
>> succeed).
>>
>> I added (gnus-large-newsgroup nil) to the group parameters, which then
>> loads all articles when entering the group, and
>> (gnus-summary-goto-article "56614DE9.5030300@upf.edu" nil t) then
>> succeeds in the summary buffer.
>>
>> However, the gnus link still doesn't work from outside gnus. It's as if
>> the FORCE optional argument that is given to "gnus-summary-goto-article"
>> has no effect.
>
> I've got the same setup as you (Gnus and local dovecot), but perhaps the
> versions are different? Can you tell us your versions for Gnus and Org?
>
> When I step through `gnus-summary-goto-article', searching for a message
> ID that is *not* currently display, the "force" argument never even
> comes into play. I end up in this branch:
>
> (if (and (stringp article)
> 	       (string-match "@\\|%40" article))
> 	  (gnus-summary-refer-article article)
>
> So then on to `gnus-summary-refer-article' (no force argument used), and
> in that function I end up in the "t" branch of the "cond" later on, and
> eventually into "(gnus-summary-insert-subject message-id)". Then that
> leads to "(gnus-read-header id)", and all is well.
>
> I know this is tedious, but would you mind stepping through with edebug
> and seeing where things fall apart? My off-the-cuff guess is that you're
> using an older version of Gnus where the nnimap backend isn't quite all
> put together...
>
> If you aren't comfortable with edebug let me know and I can provide
> exact instructions. It's a very useful thing to know!
>
> Eric

#### System Info
- OS: darwin
- Emacs: 24.5.1
- Gnus: v5.13

Well, that was fun ... sort of. I found something I can tweak to make it
work, but I'm not clear on why this issue arises.

At the relevant point, the article id is "<56614DE9.5030300@upf.edu>"
(the <> having been added by gnus-summary-refer-article) and the group
is "nnimap+FastmailLocal:Archive".

In `gnus-request-head (article group)', a funcall to `nnimap-request-head'
is constructed. Because `gnus-override-method' at that point contains a long
construct `(nnimap "FastmailLocal" ...)', the group argument of the call
to nnimap-request-head is set to nil rather than to "Archive". I take
it, the idea is that nnimap should be able to return the correct group
on its own?

The relevant code (in gnus-int.el) is

(setq res (funcall head article
                         (and (not gnus-override-method)
                              (gnus-group-real-name group))
       (nth 1 gnus-command-method)))

Now, `nnimap-request-head (article nil "FastmailLocal")' returns "(nil .
277)". I believe the "nil" in that cons should be the group ("Archive").
Maybe that's a problem in nnimap.el but looking at the code I don't see
how it could ever return anything other than nil.

From that point on, the group info seems lost and the message can't be
targeted.

If I revert the commit to gnus-int.el that introduced the override
method thingy
(http://git.gnus.org/cgit/gnus.git/commit/?id=8ba1cd0b96466a96265ec5336728519aa6030d83),
to the following instead of what's above:

(setq res (funcall head article (gnus-group-real-name group)
			 (nth 1 gnus-command-method))))

my messages get found because the actual group is passed on to
nnimap-request-head.

So, I have things working to a certain degree, but I'm utterly confused
about why this is happening.

Can you see from this what the problem is?

-- Kai.




  reply	other threads:[~2015-12-17 18:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-15 22:37 Kai von Fintel
2015-12-16  0:28 ` Eric Abrahamsen
2015-12-16  1:43   ` Kai von Fintel
2015-12-16 15:34     ` Kai von Fintel
2015-12-17  2:08       ` Eric Abrahamsen
2015-12-17 18:56         ` Kai von Fintel [this message]
2015-12-18 14:34           ` Eric Abrahamsen
2015-12-19 16:07             ` Kai von Fintel
2015-12-20  3:28               ` Eric Abrahamsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m28u4svr8w.fsf@mit.edu \
    --to=fintel@mit.edu \
    --cc=info-gnus-english@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).