You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2023/06/22 21:15:24 UTC
[couchdb] branch main updated: Fix the ability to use ; in config values
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/main by this push:
new fafa982c5 Fix the ability to use ; in config values
fafa982c5 is described below
commit fafa982c527b7826e141ac9496b61ab795ac4ff4
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Thu Jun 22 16:08:36 2023 -0400
Fix the ability to use ; in config values
Config values may contain `;` in them as long as `;` is not preceded by a
space or a tab character.
Fixes: https://github.com/apache/couchdb/issues/4651
---
src/config/src/config.erl | 40 +++++++++++++++++++++++++++++++++++-----
1 file changed, 35 insertions(+), 5 deletions(-)
diff --git a/src/config/src/config.erl b/src/config/src/config.erl
index 72dff72d8..cf8c44835 100644
--- a/src/config/src/config.erl
+++ b/src/config/src/config.erl
@@ -480,8 +480,16 @@ read_ini_file(IniFile) ->
end.
remove_comments(Line) ->
- {NoComments, _Comments} = string:take(Line, [$;], true),
- NoComments.
+ case trim(Line) of
+ [$; | _] ->
+ % Comment is at the start of line after it's trimmed
+ "";
+ NoLeadingComment when is_list(NoLeadingComment) ->
+ % Check for in-line comments. In-line comments must be preceded by
+ % space or a tab character.
+ [NoComments | _] = re:split(NoLeadingComment, " ;|\t;", [{return, list}]),
+ NoComments
+ end.
% Specially handle the ?DELETE marker
%
@@ -650,6 +658,10 @@ parse_skip_test() ->
?assertEqual([], ini("s]\nk=v")),
?assertEqual([], ini(";[s]\nk = v")),
?assertEqual([], ini(" ; [s]\nk = v")),
+ ?assertEqual([], ini("[s]\n ;k = v")),
+ ?assertEqual([], ini("[s]\n;;k = v")),
+ ?assertEqual([], ini("[s]\n\t;k = v")),
+ ?assertEqual([], ini("[s]\nk ;=v")),
?assertEqual([], ini("[s]\n ; k = v")),
?assertEqual([], ini("[]\nk = v")),
?assertEqual([], ini(";[s]\n ")).
@@ -681,14 +693,32 @@ parse_extra_equal_sign_test() ->
parse_delete_test() ->
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=")),
- ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=;")),
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk =")),
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ")),
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk= ")),
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ")),
?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;")),
- ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk =;")),
- ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=\n")).
+ ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk =\t;")),
+ ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=\n")),
+ ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ; ;")),
+ ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;v")),
+ ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;")).
+
+parse_comments_test() ->
+ ?assertEqual([], ini("[s]\n;k=v")),
+ ?assertEqual([{{"s", "k"}, ";"}], ini("[s]\nk=;")),
+ ?assertEqual([{{"s", "k"}, ";"}], ini("[s]\nk =;")),
+ ?assertEqual([{{"s", "k"}, "v;"}], ini("[s]\nk = v;")),
+ ?assertEqual([{{"s", "k"}, ";v;"}], ini("[s]\nk =;v;")),
+ ?assertEqual([{{"s", "k"}, ";v"}], ini("[s]\nk =;v")),
+ ?assertEqual([{{"s", "k"}, "v;"}], ini("[s]\nk =v;")),
+ ?assertEqual([{{"s", "k"}, "v;;"}], ini("[s]\nk =v;;")),
+ ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2")),
+ ?assertEqual([{{"s", "k"}, "v1;v2;v3"}], ini("[s]\nk = v1;v2;v3")),
+ ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;")),
+ ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2\t;")),
+ ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;;")),
+ ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;c1; c2")).
parse_multiple_kvs_test() ->
?assertEqual(