lib: drop trailing slash for path and folder searches (infix)

This resolves an old bug reported by David Edmondson in 2014. The fix
is only needed for the "boolean" case, as probabilistic / phrase
searching already ignores punctuation.

This fix is only for the infix (xapian provided) query parser.

[1]: id:cunoasuolcv.fsf@gargravarr.hh.sledj.net
This commit is contained in:
David Bremner 2022-01-21 19:38:51 -04:00
parent c73e273aaf
commit c62c22c9fb
4 changed files with 12 additions and 5 deletions

View file

@ -165,6 +165,7 @@ typedef enum {
NOTMUCH_FIELD_EXTERNAL = 1 << 0, NOTMUCH_FIELD_EXTERNAL = 1 << 0,
NOTMUCH_FIELD_PROBABILISTIC = 1 << 1, NOTMUCH_FIELD_PROBABILISTIC = 1 << 1,
NOTMUCH_FIELD_PROCESSOR = 1 << 2, NOTMUCH_FIELD_PROCESSOR = 1 << 2,
NOTMUCH_FIELD_STRIP_TRAILING_SLASH = 1 << 3,
} notmuch_field_flag_t; } notmuch_field_flag_t;
/* /*

View file

@ -46,7 +46,7 @@ prefix_t prefix_table[] = {
{ "mid", "Q", NOTMUCH_FIELD_EXTERNAL | { "mid", "Q", NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR }, NOTMUCH_FIELD_PROCESSOR },
{ "path", "P", NOTMUCH_FIELD_EXTERNAL | { "path", "P", NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR }, NOTMUCH_FIELD_PROCESSOR | NOTMUCH_FIELD_STRIP_TRAILING_SLASH },
{ "property", "XPROPERTY", NOTMUCH_FIELD_EXTERNAL }, { "property", "XPROPERTY", NOTMUCH_FIELD_EXTERNAL },
/* /*
* Unconditionally add ':' to reduce potential ambiguity with * Unconditionally add ':' to reduce potential ambiguity with
@ -55,7 +55,7 @@ prefix_t prefix_table[] = {
* discussion. * discussion.
*/ */
{ "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL | { "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR }, NOTMUCH_FIELD_PROCESSOR | NOTMUCH_FIELD_STRIP_TRAILING_SLASH },
{ "date", NULL, NOTMUCH_FIELD_EXTERNAL | { "date", NULL, NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR }, NOTMUCH_FIELD_PROCESSOR },
{ "query", NULL, NOTMUCH_FIELD_EXTERNAL | { "query", NULL, NOTMUCH_FIELD_EXTERNAL |

View file

@ -235,7 +235,15 @@ RegexpFieldProcessor::operator() (const std::string & str)
return parser.parse_query (query_str, NOTMUCH_QUERY_PARSER_FLAGS, term_prefix); return parser.parse_query (query_str, NOTMUCH_QUERY_PARSER_FLAGS, term_prefix);
} else { } else {
/* Boolean prefix */ /* Boolean prefix */
std::string term = term_prefix + str; std::string query_str;
std::string term;
if (str.length () > 1 && str.at (str.size () - 1) == '/')
query_str = str.substr (0, str.size () - 1);
else
query_str = str;
term = term_prefix + query_str;
return Xapian::Query (term); return Xapian::Query (term);
} }
} }

View file

@ -32,7 +32,6 @@ test_expect_equal "$output" "MAIL_DIR/bad/news/msg-XXX
MAIL_DIR/duplicate/bad/news/msg-XXX" MAIL_DIR/duplicate/bad/news/msg-XXX"
test_begin_subtest "Folder search with --output=files (trailing /)" test_begin_subtest "Folder search with --output=files (trailing /)"
test_subtest_known_broken
output=$(notmuch search --output=files folder:bad/news/ | notmuch_search_files_sanitize) output=$(notmuch search --output=files folder:bad/news/ | notmuch_search_files_sanitize)
test_expect_equal "$output" "MAIL_DIR/bad/news/msg-XXX test_expect_equal "$output" "MAIL_DIR/bad/news/msg-XXX
MAIL_DIR/duplicate/bad/news/msg-XXX" MAIL_DIR/duplicate/bad/news/msg-XXX"
@ -127,7 +126,6 @@ MAIL_DIR/bar/18:2,
MAIL_DIR/cur/51:2," MAIL_DIR/cur/51:2,"
test_begin_subtest "path: search (trailing /)" test_begin_subtest "path: search (trailing /)"
test_subtest_known_broken
output=$(notmuch search --output=files path:"bar/" | notmuch_search_files_sanitize | sort) output=$(notmuch search --output=files path:"bar/" | notmuch_search_files_sanitize | sort)
# cur/51:2, is a duplicate of bar/18:2, # cur/51:2, is a duplicate of bar/18:2,
test_expect_equal "$output" "MAIL_DIR/bar/17:2, test_expect_equal "$output" "MAIL_DIR/bar/17:2,