diff options
| author | Jan Lehnardt <jan@apache.org> | 2009-01-05 10:38:39 +0000 | 
|---|---|---|
| committer | Jan Lehnardt <jan@apache.org> | 2009-01-05 10:38:39 +0000 | 
| commit | 48ad84d64167a97d766904d306376b6b95a4f28f (patch) | |
| tree | a4aa120c66fefa316c2052edff726e30c44fa21f | |
| parent | 10eac24f530b5de1ea30c83518d3971f99890db6 (diff) | |
Fix ini-section duplication. When we tried to assign a value to a config-item that happened to be set to that value already, a new and duplicated ini section with that config parameter was written to the ini file.
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@731521 13f79535-47bb-0310-9956-ffa450edef68
| -rw-r--r-- | src/couchdb/couch_config_writer.erl | 14 | ||||
| -rw-r--r-- | test/couch_config_writer_test.erl | 30 | 
2 files changed, 38 insertions, 6 deletions
diff --git a/src/couchdb/couch_config_writer.erl b/src/couchdb/couch_config_writer.erl index 270e615f..fd4a0215 100644 --- a/src/couchdb/couch_config_writer.erl +++ b/src/couchdb/couch_config_writer.erl @@ -42,11 +42,15 @@ save_to_file({{Section, Option}, Value}, File) ->      % produce the contents for the config file      NewFileContents = -    case NewFileContents2 = save_loop({{SectionName, OptionList}, Value}, Lines, "", "", []) of +    case {NewFileContents2, DoneOptions} = save_loop({{SectionName, OptionList}, Value}, Lines, "", "", []) of          % we didn't change anything, that means we couldn't find a matching          % [ini section] in which case we just append a new one. -        OldFileContents -> -            append_new_ini_section({{SectionName, OptionList}, Value}, OldFileContents); +        {OldFileContents, DoneOptions} -> +            % but only if we haven't actually written anything. +            case lists:member(OptionList, DoneOptions) of +                true -> OldFileContents; +                _ -> append_new_ini_section({{SectionName, OptionList}, Value}, OldFileContents) +            end;          _ ->              NewFileContents2      end, @@ -110,9 +114,9 @@ save_loop({{Section, Option}, Value}, [], OldSection, NewFileContents, DoneOptio      case lists:member(Option, DoneOptions) of          % append Deferred Option          false when Section == OldSection ->  -            NewFileContents ++ "\n" ++ Option ++ " = " ++ Value ++ "\n"; +            {NewFileContents ++ "\n" ++ Option ++ " = " ++ Value ++ "\n", DoneOptions};          % we're out of new lines, just return the new file's contents -        _ -> NewFileContents +        _ -> {NewFileContents, DoneOptions}      end.  append_new_ini_section({{SectionName, Option}, Value}, OldFileContents) -> diff --git a/test/couch_config_writer_test.erl b/test/couch_config_writer_test.erl index 39666f5d..aa88abeb 100644 --- a/test/couch_config_writer_test.erl +++ b/test/couch_config_writer_test.erl @@ -11,7 +11,8 @@ couch_config_writer_test() ->          fun() -> replace_existing_variable3() end,          fun() -> append_new_variable() end,          fun() -> append_new_module() end, -        fun() -> overwrite_variable_further_down() end +        fun() -> overwrite_variable_further_down() end, +        fun() -> double_append_new_section_bug() end      ]. @@ -149,6 +150,33 @@ option2 = value2  ",      run_operation_and_compare_results(Contents, Expect, [{{"erlang", "option"}, "value"}, {{"erlang", "option2"}, "value2"}]). +double_append_new_section_bug() -> +    % create file +    Contents = "[section] +variable = value + +[another_section] +another_var = another_value + +[erlang] +option = value + +option2 = value2 +", + +    Expect = "[section] +variable = value + +[another_section] +another_var = another_value + +[erlang] +option = value + +option2 = value2 +", +    run_operation_and_compare_results(Contents, Expect, [{{"another_section", "another_var"}, "another_value"}]). +  run_operation_and_compare_results(Contents, Expect, Config) when not is_list(Config) ->      run_operation_and_compare_results(Contents, Expect, [Config]);  | 
