From c62c22c9fb222d43d9b9956ce6b6e9985019ea2d Mon Sep 17 00:00:00 2001 From: David Bremner Date: Fri, 21 Jan 2022 19:38:51 -0400 Subject: [PATCH] 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 --- lib/database-private.h | 1 + lib/prefix.cc | 4 ++-- lib/regexp-fields.cc | 10 +++++++++- test/T100-search-by-folder.sh | 2 -- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index 0c08fa15..657b1aa1 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -165,6 +165,7 @@ typedef enum { NOTMUCH_FIELD_EXTERNAL = 1 << 0, NOTMUCH_FIELD_PROBABILISTIC = 1 << 1, NOTMUCH_FIELD_PROCESSOR = 1 << 2, + NOTMUCH_FIELD_STRIP_TRAILING_SLASH = 1 << 3, } notmuch_field_flag_t; /* diff --git a/lib/prefix.cc b/lib/prefix.cc index 0d92bdd7..857c05b9 100644 --- a/lib/prefix.cc +++ b/lib/prefix.cc @@ -46,7 +46,7 @@ prefix_t prefix_table[] = { { "mid", "Q", NOTMUCH_FIELD_EXTERNAL | NOTMUCH_FIELD_PROCESSOR }, { "path", "P", NOTMUCH_FIELD_EXTERNAL | - NOTMUCH_FIELD_PROCESSOR }, + NOTMUCH_FIELD_PROCESSOR | NOTMUCH_FIELD_STRIP_TRAILING_SLASH }, { "property", "XPROPERTY", NOTMUCH_FIELD_EXTERNAL }, /* * Unconditionally add ':' to reduce potential ambiguity with @@ -55,7 +55,7 @@ prefix_t prefix_table[] = { * discussion. */ { "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL | - NOTMUCH_FIELD_PROCESSOR }, + NOTMUCH_FIELD_PROCESSOR | NOTMUCH_FIELD_STRIP_TRAILING_SLASH }, { "date", NULL, NOTMUCH_FIELD_EXTERNAL | NOTMUCH_FIELD_PROCESSOR }, { "query", NULL, NOTMUCH_FIELD_EXTERNAL | diff --git a/lib/regexp-fields.cc b/lib/regexp-fields.cc index c6d9d94f..7e9d959c 100644 --- a/lib/regexp-fields.cc +++ b/lib/regexp-fields.cc @@ -235,7 +235,15 @@ RegexpFieldProcessor::operator() (const std::string & str) return parser.parse_query (query_str, NOTMUCH_QUERY_PARSER_FLAGS, term_prefix); } else { /* 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); } } diff --git a/test/T100-search-by-folder.sh b/test/T100-search-by-folder.sh index fbc68266..0123d0b2 100755 --- a/test/T100-search-by-folder.sh +++ b/test/T100-search-by-folder.sh @@ -32,7 +32,6 @@ test_expect_equal "$output" "MAIL_DIR/bad/news/msg-XXX MAIL_DIR/duplicate/bad/news/msg-XXX" 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) test_expect_equal "$output" "MAIL_DIR/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," test_begin_subtest "path: search (trailing /)" -test_subtest_known_broken output=$(notmuch search --output=files path:"bar/" | notmuch_search_files_sanitize | sort) # cur/51:2, is a duplicate of bar/18:2, test_expect_equal "$output" "MAIL_DIR/bar/17:2,