You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2009/01/05 11:38:39 UTC

svn commit: r731521 - in /couchdb/trunk: src/couchdb/couch_config_writer.erl test/couch_config_writer_test.erl

Author: jan
Date: Mon Jan  5 02:38:39 2009
New Revision: 731521

URL: http://svn.apache.org/viewvc?rev=731521&view=rev
Log:
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.

Modified:
    couchdb/trunk/src/couchdb/couch_config_writer.erl
    couchdb/trunk/test/couch_config_writer_test.erl

Modified: couchdb/trunk/src/couchdb/couch_config_writer.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_config_writer.erl?rev=731521&r1=731520&r2=731521&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_config_writer.erl (original)
+++ couchdb/trunk/src/couchdb/couch_config_writer.erl Mon Jan  5 02:38:39 2009
@@ -42,11 +42,15 @@
 
     % 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 @@
     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) ->

Modified: couchdb/trunk/test/couch_config_writer_test.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/test/couch_config_writer_test.erl?rev=731521&r1=731520&r2=731521&view=diff
==============================================================================
--- couchdb/trunk/test/couch_config_writer_test.erl (original)
+++ couchdb/trunk/test/couch_config_writer_test.erl Mon Jan  5 02:38:39 2009
@@ -11,7 +11,8 @@
         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 @@
 ",
     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]);