diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-13 11:03:38 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-13 11:03:38 +0200 |
| commit | fe5703419f2ac2a5e619b3d527530a71a9a9499e (patch) | |
| tree | fc7a588c46960643f80fee0a684465417415763a /src | |
| parent | 043b150f7651c598dac8fc02d7068b940d0f8741 (diff) | |
| download | qtmaildir-fe5703419f2ac2a5e619b3d527530a71a9a9499e.tar.gz qtmaildir-fe5703419f2ac2a5e619b3d527530a71a9a9499e.zip | |
docs,rulequery: state the tag quoting rule rather than the test
The draft compile() quoted every Is/IsNot term, which contradicted the
same task's own assertion that a negated tag compiles to .
The implementer resolved it in the direction the tests specify, and the
resolution is right: notmuch reads tag:inbox and tag:"inbox" identically,
counting 5322 either way against the live index, so quoting a tag would
change the stored string without changing what it matches. That breaks
the byte-for-byte round trip this type exists to guarantee.
Restate the comment as the rule rather than as a note about what a test
expects, correct the plan's draft so the remaining tasks do not inherit
the contradiction, and warn the parser task that a quoted tag must not be
read back as a quoting operator.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rulequery.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/rulequery.cpp b/src/rulequery.cpp index 198c583..9b79b2b 100644 --- a/src/rulequery.cpp +++ b/src/rulequery.cpp @@ -51,10 +51,13 @@ bool needsQuotes(const RuleTerm &term) return true; if (term.value.contains(QLatin1Char(' '))) return true; - // Is/IsNot asks for an exact phrase, which only free-text fields need - // quoting for: tag: and attachment: values are already bare words, and - // quoting them changes nothing notmuch cares about but breaks the test's - // documented expectation of an unquoted tag. + // Is/IsNot means an exact phrase, and only the free-text fields need + // quotes to express one. A tag or an attachment name is a single bare + // token to notmuch, which reads `tag:inbox` and `tag:"inbox"` identically + // (both count 5322 against the live index). Quoting them would therefore + // change the stored string without changing what it matches, and this + // type's whole contract is that an unedited rule compiles back byte for + // byte. if (term.op == RuleTerm::Is || term.op == RuleTerm::IsNot) { return term.field == RuleTerm::From || term.field == RuleTerm::To || term.field == RuleTerm::Cc || term.field == RuleTerm::Subject; |
