In [1] Ciprian observed that it was easy for users to mistakenly
introduce leading and trailing space to new.tags when editing a
notmuch config file. This commit strips spaces on either side of the
';' delimiter when splitting.
In principle it would be possible to support tags (or other config
values) with leading or trailing spaces by processing '\s' escapes in
the input string. Currently such processing is not done.
[1]: id:CA+Tk8fzjPLaEd3vL1f9ebk_bF_RV8PDTLzDupraTkCLCpJAmCg@mail.gmail.com
test_expect_equal "$output" ""
test_begin_subtest "leading/trailing whitespace in new.tags is ignored"
test_expect_equal "$output" ""
test_begin_subtest "leading/trailing whitespace in new.tags is ignored"
-test_subtest_known_broken
# avoid complications with leading spaces and "notmuch config"
sed -i 's/^tags=.*$/tags= fu bar ; ; bar /' notmuch-config
add_message
# avoid complications with leading spaces and "notmuch config"
sed -i 's/^tags=.*$/tags= fu bar ; ; bar /' notmuch-config
add_message
'new_tags:[0][0][0]["tags"] = ["bar", "foo"]'
test_begin_subtest "leading/trailing whitespace in new.tags is ignored"
'new_tags:[0][0][0]["tags"] = ["bar", "foo"]'
test_begin_subtest "leading/trailing whitespace in new.tags is ignored"
-test_subtest_known_broken
# avoid complications with leading spaces and "notmuch config"
sed -i 's/^tags=.*$/tags= fu bar ; ; bar /' notmuch-config
gen_insert_msg
# avoid complications with leading spaces and "notmuch config"
sed -i 's/^tags=.*$/tags= fu bar ; ; bar /' notmuch-config
gen_insert_msg
restore_database
test_begin_subtest "notmuch_config_get_values (ignore leading/trailing whitespace)"
restore_database
test_begin_subtest "notmuch_config_get_values (ignore leading/trailing whitespace)"
-test_subtest_known_broken
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
{
notmuch_config_values_t *values;
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
{
notmuch_config_values_t *values;
strsplit_len (const char *s, char delim, size_t *len)
{
bool escaping = false;
strsplit_len (const char *s, char delim, size_t *len)
{
bool escaping = false;
+ size_t count = 0, last_nonspace = 0;
- /* Skip initial unescaped delimiters */
- while (*s && *s == delim)
+ /* Skip initial unescaped delimiters and whitespace */
+ while (*s && (*s == delim || isspace (*s)))
s++;
while (s[count] && (escaping || s[count] != delim)) {
s++;
while (s[count] && (escaping || s[count] != delim)) {
+ if (! isspace (s[count]))
+ last_nonspace = count;
escaping = (s[count] == '\\');
count++;
}
escaping = (s[count] == '\\');
count++;
}
if (count == 0)
return NULL;
if (count == 0)
return NULL;
+ *len = last_nonspace + 1;