This is an automated email from the ASF dual-hosted git repository. vatamane pushed a commit to branch 3.3.x in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit ecc76abaa2c11502ebdf153665bee391a7307ca8 Author: Nick Vatamaniuc <vatam...@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 7c38ff58f..0df47811c 100644 --- a/src/config/src/config.erl +++ b/src/config/src/config.erl @@ -468,8 +468,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 % @@ -638,6 +646,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 ")). @@ -669,14 +681,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(