# Linux Kernel Toolings - `lei`
[TOC]
## Quick Note
### The Xapian query syntax
The `leq q` is the command to query the mailing list. You may find its syntax in [public-inbox help](https://lore.kernel.org/all/_/text/help/#search) for any mailing list:
```
search
------
This public-inbox has search functionality provided by Xapian.
It supports typical AND, OR, NOT, '+', '-' queries present
in other search engines.
We also support search prefixes to limit the scope of the
search to certain fields.
Prefixes supported in this installation include:
s: match within Subject e.g. s:"a quick brown fox"
d: match date-time range, git "approxidate" formats supported
Open-ended ranges such as `d:last.week..' and
`d:..2.days.ago' are supported
b: match within message body, including text attachments
nq: match non-quoted text within message body
q: match quoted text within message body
n: match filename of attachment(s)
t: match within the To header
c: match within the Cc header
f: match within the From header
a: match within the To, Cc, and From headers
tc: match within the To and Cc headers
l: match contents of the List-Id header
bs: match within the Subject and body
dfn: match filename from diff
dfa: match diff removed (-) lines
dfb: match diff added (+) lines
dfhh: match diff hunk header context (usually a function name)
dfctx: match diff context lines
dfpre: match pre-image git blob ID
dfpost: match post-image git blob ID
dfblob: match either pre or post-image git blob ID
patchid: match `git patch-id --stable' output
rt: match received time, like `d:' if sender's clock was correct
forpatchid: the `X-For-Patch-ID' mail header e.g. forpatchid:stable
changeid: the `X-Change-ID' mail header e.g. changeid:stable
```
This syntax is called the Sapian query syntax. To get started with it, see [*Getting Started with Xapian*](https://getting-started-with-xapian.readthedocs.io/en/latest/concepts/search/queryparser.html). You can find more detailed semantics in [*Xapian::QueryParser Syntax*](https://xapian.org/docs/queryparser.html).
Also, sometimes you may notice a querying string in the bottom of the page, for example, at the bottom of the [*[PATCH 1/2] drm/amdgpu: move error log from ring write to commit[PATCH 1/2] drm/amdgpu: move error log from ring write to commit*](https://lore.kernel.org/all/20241003081306.235253-1-sunil.khatri@amd.com/), you see contents like this to help filter out the threads:
```
find likely ancestor, descendant, or conflicting patches for this message:
( dfblob:690976665cf dfblob:05b3480ecec dfblob:f93f5100220
dfblob:af8824e8da4 )
OR (
bs:"[PATCH 1/2] drm/amdgpu: move error log from ring write to commit" )
```
## Examples
### Finding mails that have patches about a file
```
$ lei q \
-I https://lore.kernel.org/all/ \
--threads \
'(dfn:include/drm/drm_print.h)'
```
### Finding mails that have patches about some files
`lei` support wildcard to some extent:
```
$ lei q \
-I https://lore.kernel.org/all/ \
--threads \
'(dfn:drivers/gpu/drm/vkms/*)'
```
### Finding mail from an mail address
Finding mail from kernel test robot (`lkp@intel.com`) within the past month, and save it to a directory called `ktestbot`:
```
$ lei q \
-I https://lore.kernel.org/all/ \
--threads \
'(f:lkp@intel.com)'
```
Note that the output shows the query to the Publix Inbox:
```
# /home/f/.local/share/lei/store 0/0
# /usr/bin/curl -Sf -s -d '' https://lore.kernel.org/all/?x=m&t=1&q=(f%3Alkp%40intel.com)+AND+rt%3A1726221626..
```
And you can actually click into the `https://lore.kernel.org/all/?x=m&t=1&q=(f%3Alkp%40intel.com)+AND+rt%3A1726221626..)` link to see those mails on the mailing list archive website. Do remember include the two trailing dots.
### Match the title
Find all mail from `lkp@intel.com` whose title contains `fail`:
```
lei q \
-I https://lore.kernel.org/all/ \
--threads \
'(f:lkp@intel.com") AND (s:"fail")'
```
https://lore.kernel.org/all/?q=%28f%3Alkp%40intel.com%29+AND+%28s%3Afailed%29
## References
### Other References
1. [*Using lei, b4, and mutt to do kernel development*](https://josefbacik.github.io/kernel/2021/10/18/lei-and-b4.html)
2. [*lore+lei: part 1, getting started*](https://people.kernel.org/monsieuricon/lore-lei-part-1-getting-started)
3. [*lore+lei: part 2, now with IMAP*](https://people.kernel.org/monsieuricon/lore-lei-part-2-now-with-imap)
4. [`lei-q(1)`](https://man.archlinux.org/man/lei-q.1.en)
### [Beginner Linux kernel maintainers toolbox - Krzysztof Kozlowski](https://youtu.be/doUuj1qCggY?si=nIF7xq5Zk7ReZLaN&t=1732)
{%youtube doUuj1qCggY %}
### [Doing more with lore and b4 - Konstantin Ryabitsev (34:10 ~ FIN)](https://youtu.be/wTpQYM08_Yg?t=2050)
{%youtube wTpQYM08_Yg %}