You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/02/05 15:50:26 UTC

[04/49] couchdb commit: updated refs/heads/1843-feature-bigcouch to 3069c01

Remove src/config


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/49642148
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/49642148
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/49642148

Branch: refs/heads/1843-feature-bigcouch
Commit: 49642148ae7671c93b45cad994d0a6fb91450649
Parents: e41cfa4
Author: Paul J. Davis <pa...@gmail.com>
Authored: Tue Feb 4 17:38:29 2014 -0600
Committer: Paul J. Davis <pa...@gmail.com>
Committed: Tue Feb 4 17:39:07 2014 -0600

----------------------------------------------------------------------
 src/config/src/config.app.src      |  30 ----
 src/config/src/config.erl          | 257 --------------------------------
 src/config/src/config_app.erl      |  52 -------
 src/config/src/config_listener.erl |  59 --------
 src/config/src/config_sup.erl      |  50 -------
 src/config/src/config_util.erl     |  74 ---------
 src/config/src/config_writer.erl   |  79 ----------
 7 files changed, 601 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config.app.src
----------------------------------------------------------------------
diff --git a/src/config/src/config.app.src b/src/config/src/config.app.src
deleted file mode 100644
index 6eea351..0000000
--- a/src/config/src/config.app.src
+++ /dev/null
@@ -1,30 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-{application, config, [
-    {description, "INI file configuration system for Apache CouchDB"},
-    {vsn, git},
-    {modules, [
-        config,
-        config_app,
-        config_listener,
-        config_sup,
-        config_util,
-        config_writer
-    ]},
-    {registered, [
-        config,
-        config_event
-    ]},
-    {applications, [kernel, stdlib]},
-    {mod, {config_app, []}}
-]}.

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config.erl b/src/config/src/config.erl
deleted file mode 100644
index f47639a..0000000
--- a/src/config/src/config.erl
+++ /dev/null
@@ -1,257 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-% Reads CouchDB's ini file and gets queried for configuration parameters.
-% This module is initialized with a list of ini files that it consecutively
-% reads Key/Value pairs from and saves them in an ets table. If more an one
-% ini file is specified, the last one is used to write changes that are made
-% with store/2 back to that ini file.
-
--module(config).
--behaviour(gen_server).
-
--export([start_link/1, stop/0, reload/0]).
--export([all/0, get/1, get/2, get/3, set/3, set/4, delete/2, delete/3]).
--export([listen_for_changes/2]).
--export([parse_ini_file/1]).
-
--export([init/1, terminate/2, code_change/3]).
--export([handle_call/3, handle_cast/2, handle_info/2]).
-
--record(config, {
-    notify_funs=[],
-    ini_files=undefined,
-    write_filename=undefined
-}).
-
-
-start_link(IniFiles) ->
-    gen_server:start_link({local, ?MODULE}, ?MODULE, IniFiles, []).
-
-stop() ->
-    gen_server:cast(?MODULE, stop).
-
-
-reload() ->
-    gen_server:call(?MODULE, reload).
-
-all() ->
-    lists:sort(gen_server:call(?MODULE, all, infinity)).
-
-
-get(Section) when is_binary(Section) ->
-    ?MODULE:get(binary_to_list(Section));
-get(Section) ->
-    Matches = ets:match(?MODULE, {{Section, '$1'}, '$2'}),
-    [{Key, Value} || [Key, Value] <- Matches].
-
-get(Section, Key) ->
-    ?MODULE:get(Section, Key, undefined).
-
-get(Section, Key, Default) when is_binary(Section) and is_binary(Key) ->
-    ?MODULE:get(binary_to_list(Section), binary_to_list(Key), Default);
-get(Section, Key, Default) ->
-    case ets:lookup(?MODULE, {Section, Key}) of
-        [] -> Default;
-        [{_, Match}] -> Match
-    end.
-
-set(Section, Key, Value) ->
-    ?MODULE:set(Section, Key, Value, true).
-
-set(Section, Key, Value, Persist) when is_binary(Section) and is_binary(Key)  ->
-    ?MODULE:set(binary_to_list(Section), binary_to_list(Key), Value, Persist);
-set(Section, Key, Value, Persist) ->
-    gen_server:call(?MODULE, {set, Section, Key, Value, Persist}).
-
-
-delete(Section, Key) when is_binary(Section) and is_binary(Key) ->
-    delete(binary_to_list(Section), binary_to_list(Key));
-delete(Section, Key) ->
-    delete(Section, Key, true).
-
-delete(Section, Key, Persist) when is_binary(Section) and is_binary(Key) ->
-    delete(binary_to_list(Section), binary_to_list(Key), Persist);
-delete(Section, Key, Persist) ->
-    gen_server:call(?MODULE, {delete, Section, Key, Persist}).
-
-listen_for_changes(CallbackModule, InitialState) ->
-    config_listener:start(CallbackModule, InitialState).
-
-init(IniFiles) ->
-    ets:new(?MODULE, [named_table, set, protected]),
-    lists:map(fun(IniFile) ->
-        {ok, ParsedIniValues} = parse_ini_file(IniFile),
-        ets:insert(?MODULE, ParsedIniValues)
-    end, IniFiles),
-    WriteFile = case IniFiles of
-        [_|_] -> lists:last(IniFiles);
-        _ -> undefined
-    end,
-    debug_config(),
-    {ok, #config{ini_files=IniFiles, write_filename=WriteFile}}.
-
-
-terminate(_Reason, _State) ->
-    ok.
-
-
-handle_call(all, _From, Config) ->
-    Resp = lists:sort((ets:tab2list(?MODULE))),
-    {reply, Resp, Config};
-handle_call({set, Sec, Key, Val, Persist}, _From, Config) ->
-    true = ets:insert(?MODULE, {{Sec, Key}, Val}),
-    twig:log(notice, "~p: [~s] ~s set to ~s", [?MODULE, Sec, Key, Val]),
-    case {Persist, Config#config.write_filename} of
-        {true, undefined} ->
-            ok;
-        {true, FileName} ->
-            config_writer:save_to_file({{Sec, Key}, Val}, FileName);
-        _ ->
-            ok
-    end,
-    Event = {config_change, Sec, Key, Val, Persist},
-    gen_event:sync_notify(config_event, Event),
-    {reply, ok, Config};
-handle_call({delete, Sec, Key, Persist}, _From, Config) ->
-    true = ets:delete(?MODULE, {Sec,Key}),
-    twig:log(notice, "~p: [~s] ~s deleted", [?MODULE, Sec, Key]),
-    case {Persist, Config#config.write_filename} of
-        {true, undefined} ->
-            ok;
-        {true, FileName} ->
-            config_writer:save_to_file({{Sec, Key}, ""}, FileName);
-        _ ->
-            ok
-    end,
-    Event = {config_change, Sec, Key, deleted, Persist},
-    gen_event:sync_notify(config_event, Event),
-    {reply, ok, Config};
-handle_call(reload, _From, Config) ->
-    DiskKVs = lists:foldl(fun(IniFile, DiskKVs0) ->
-        {ok, ParsedIniValues} = parse_ini_file(IniFile),
-        lists:foldl(fun({K, V}, DiskKVs1) ->
-            dict:store(K, V, DiskKVs1)
-        end, DiskKVs0, ParsedIniValues)
-    end, dict:new(), Config#config.ini_files),
-    % Update ets with anything we just read
-    % from disk
-    dict:fold(fun(K, V, _) ->
-        ets:insert(?MODULE, {K, V})
-    end, nil, DiskKVs),
-    % And remove anything in ets that wasn't
-    % on disk.
-    ets:foldl(fun({K, _}, _) ->
-        case dict:is_key(K, DiskKVs) of
-            true ->
-                ok;
-            false ->
-                ets:delete(?MODULE, K)
-        end
-    end, nil, ?MODULE),
-    {reply, ok, Config}.
-
-
-handle_cast(stop, State) ->
-    {stop, normal, State};
-handle_cast(_Msg, State) ->
-    {noreply, State}.
-
-handle_info(Info, State) ->
-    twig:log(error, "config:handle_info Info: ~p~n", [Info]),
-    {noreply, State}.
-
-code_change(_OldVsn, State, _Extra) ->
-    {ok, State}.
-
-
-parse_ini_file(IniFile) ->
-    IniFilename = config_util:abs_pathname(IniFile),
-    IniBin =
-    case file:read_file(IniFilename) of
-        {ok, IniBin0} ->
-            IniBin0;
-        {error, enoent} ->
-            Fmt = "Couldn't find server configuration file ~s.",
-            Msg = list_to_binary(io_lib:format(Fmt, [IniFilename])),
-            twig:log(error, "~s~n", [Msg]),
-            throw({startup_error, Msg})
-    end,
-
-    Lines = re:split(IniBin, "\r\n|\n|\r|\032", [{return, list}]),
-    {_, ParsedIniValues} =
-    lists:foldl(fun(Line, {AccSectionName, AccValues}) ->
-            case string:strip(Line) of
-            "[" ++ Rest ->
-                case re:split(Rest, "\\]", [{return, list}]) of
-                [NewSectionName, ""] ->
-                    {NewSectionName, AccValues};
-                _Else -> % end bracket not at end, ignore this line
-                    {AccSectionName, AccValues}
-                end;
-            ";" ++ _Comment ->
-                {AccSectionName, AccValues};
-            Line2 ->
-                case re:split(Line2, "\s?=\s?", [{return, list}]) of
-                [Value] ->
-                    MultiLineValuePart = case re:run(Line, "^ \\S", []) of
-                    {match, _} ->
-                        true;
-                    _ ->
-                        false
-                    end,
-                    case {MultiLineValuePart, AccValues} of
-                    {true, [{{_, ValueName}, PrevValue} | AccValuesRest]} ->
-                        % remove comment
-                        case re:split(Value, " ;|\t;", [{return, list}]) of
-                        [[]] ->
-                            % empty line
-                            {AccSectionName, AccValues};
-                        [LineValue | _Rest] ->
-                            E = {{AccSectionName, ValueName},
-                                PrevValue ++ " " ++ LineValue},
-                            {AccSectionName, [E | AccValuesRest]}
-                        end;
-                    _ ->
-                        {AccSectionName, AccValues}
-                    end;
-                [""|_LineValues] -> % line begins with "=", ignore
-                    {AccSectionName, AccValues};
-                [ValueName|LineValues] -> % yeehaw, got a line!
-                    RemainingLine = config_util:implode(LineValues, "="),
-                    % removes comments
-                    case re:split(RemainingLine, " ;|\t;", [{return, list}]) of
-                    [[]] ->
-                        % empty line means delete this key
-                        ets:delete(?MODULE, {AccSectionName, ValueName}),
-                        {AccSectionName, AccValues};
-                    [LineValue | _Rest] ->
-                        {AccSectionName,
-                            [{{AccSectionName, ValueName}, LineValue} | AccValues]}
-                    end
-                end
-            end
-        end, {"", []}, Lines),
-    {ok, ParsedIniValues}.
-
-
-debug_config() ->
-    case ?MODULE:get("log", "level") of
-        "debug" ->
-            io:format("Configuration Settings:~n", []),
-            lists:foreach(fun({{Mod, Key}, Val}) ->
-                io:format("  [~s] ~s=~p~n", [Mod, Key, Val])
-            end, lists:sort(ets:tab2list(?MODULE)));
-        _ ->
-            ok
-    end.
-

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config_app.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config_app.erl b/src/config/src/config_app.erl
deleted file mode 100644
index 5c5515a..0000000
--- a/src/config/src/config_app.erl
+++ /dev/null
@@ -1,52 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(config_app).
-
--behaviour(application).
-
-%% Application callbacks
--export([start/2, stop/1]).
-
-%% ===================================================================
-%% Application callbacks
-%% ===================================================================
-
-start(_StartType, _StartArgs) ->
-    config_sup:start_link(get_ini_files()).
-
-stop(_State) ->
-    ok.
-
-get_ini_files() ->
-    hd([L || L <- [command_line(), env(), default()], L =/= skip]).
-
-env() ->
-    case application:get_env(config, ini_files) of
-        undefined ->
-            skip;
-        {ok, IniFiles} ->
-            IniFiles
-    end.
-
-command_line() ->
-    case init:get_argument(couch_ini) of
-        error ->
-            skip;
-        {ok, [IniFiles]} ->
-            IniFiles
-    end.
-
-default() ->
-    Etc = filename:join(code:root_dir(), "etc"),
-    Default = [filename:join(Etc,"default.ini"), filename:join(Etc,"local.ini")],
-    lists:filter(fun filelib:is_file/1, Default).

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config_listener.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config_listener.erl b/src/config/src/config_listener.erl
deleted file mode 100644
index 3335b45..0000000
--- a/src/config/src/config_listener.erl
+++ /dev/null
@@ -1,59 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(config_listener).
-
--behaviour(gen_event).
-
-%% Public interface
--export([start/2]).
--export([start/3]).
-
--export([behaviour_info/1]).
-
-%% Required gen_event interface
--export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, 
-    code_change/3]).
-
-behaviour_info(callbacks) ->
-    [{handle_config_change,5}];
-behaviour_info(_) ->
-    undefined.
-
-start(Module, State) ->
-    start(Module, Module, State).
-
-start(Module, Id, State) ->
-    gen_event:add_sup_handler(config_event, {?MODULE, Id}, {Module, State}).
-
-init({Module, State}) ->
-    {ok, {Module, State}}.
-
-handle_event({config_change, Sec, Key, Value, Persist}, {Module, State}) ->
-    case Module:handle_config_change(Sec, Key, Value, Persist, State) of
-        {ok, NewState} ->
-            {ok, {Module, NewState}};
-        remove_handler ->
-            remove_handler
-    end.
-
-handle_call(_Request, St) ->
-    {ok, ignored, St}.
-
-handle_info(_Info, St) ->
-    {ok, St}.
-
-terminate(_Reason, _St) ->
-    ok.
-
-code_change(_OldVsn, St, _Extra) ->
-    {ok, St}.

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config_sup.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config_sup.erl b/src/config/src/config_sup.erl
deleted file mode 100644
index a595b3c..0000000
--- a/src/config/src/config_sup.erl
+++ /dev/null
@@ -1,50 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License.  You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(config_sup).
--behaviour(supervisor).
-
-%% API
--export([start_link/1]).
-
-%% Supervisor callbacks
--export([init/1]).
-
-%% ===================================================================
-%% API functions
-%% ===================================================================
-
-start_link(IniFiles) ->
-    supervisor:start_link({local, ?MODULE}, ?MODULE, IniFiles).
-
-%% ===================================================================
-%% Supervisor callbacks
-%% ===================================================================
-
-init(IniFiles) ->
-    Children = [
-        {config,
-            {config, start_link, [IniFiles]},
-            permanent,
-            5000,
-            worker,
-            [config]
-        },
-        {config_event,
-            {gen_event, start_link, [{local, config_event}]},
-            permanent,
-            5000,
-            worker,
-            dynamic
-        }
-    ],
-    {ok, {{one_for_one, 5, 10}, Children}}.

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config_util.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config_util.erl b/src/config/src/config_util.erl
deleted file mode 100644
index d0f9ed4..0000000
--- a/src/config/src/config_util.erl
+++ /dev/null
@@ -1,74 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(config_util).
-
--export([abs_pathname/1]).
--export([abs_pathname/2]).
--export([implode/2]).
-
-% given a pathname "../foo/bar/" it gives back the fully qualified
-% absolute pathname.
-abs_pathname(" " ++ Filename) ->
-    % strip leading whitspace
-    abs_pathname(Filename);
-abs_pathname([$/ |_]=Filename) ->
-    Filename;
-abs_pathname(Filename) ->
-    {ok, Cwd} = file:get_cwd(),
-    {Filename2, Args} = separate_cmd_args(Filename, ""),
-    abs_pathname(Filename2, Cwd) ++ Args.
-
-abs_pathname(Filename, Dir) ->
-    Name = filename:absname(Filename, Dir ++ "/"),
-    OutFilename = filename:join(fix_path_list(filename:split(Name), [])),
-    % If the filename is a dir (last char slash, put back end slash
-    case string:right(Filename,1) of
-    "/" ->
-        OutFilename ++ "/";
-    "\\" ->
-        OutFilename ++ "/";
-    _Else->
-        OutFilename
-    end.
-
-implode(List, Sep) ->
-    implode(List, Sep, []).
-
-implode([], _Sep, Acc) ->
-    lists:flatten(lists:reverse(Acc));
-implode([H], Sep, Acc) ->
-    implode([], Sep, [H|Acc]);
-implode([H|T], Sep, Acc) ->
-    implode(T, Sep, [Sep,H|Acc]).
-
-% if this as an executable with arguments, seperate out the arguments
-% ""./foo\ bar.sh -baz=blah" -> {"./foo\ bar.sh", " -baz=blah"}
-separate_cmd_args("", CmdAcc) ->
-    {lists:reverse(CmdAcc), ""};
-separate_cmd_args("\\ " ++ Rest, CmdAcc) -> % handle skipped value
-    separate_cmd_args(Rest, " \\" ++ CmdAcc);
-separate_cmd_args(" " ++ Rest, CmdAcc) ->
-    {lists:reverse(CmdAcc), " " ++ Rest};
-separate_cmd_args([Char|Rest], CmdAcc) ->
-    separate_cmd_args(Rest, [Char | CmdAcc]).
-
-% takes a heirarchical list of dirs and removes the dots ".", double dots
-% ".." and the corresponding parent dirs.
-fix_path_list([], Acc) ->
-    lists:reverse(Acc);
-fix_path_list([".."|Rest], [_PrevAcc|RestAcc]) ->
-    fix_path_list(Rest, RestAcc);
-fix_path_list(["."|Rest], Acc) ->
-    fix_path_list(Rest, Acc);
-fix_path_list([Dir | Rest], Acc) ->
-    fix_path_list(Rest, [Dir | Acc]).

http://git-wip-us.apache.org/repos/asf/couchdb/blob/49642148/src/config/src/config_writer.erl
----------------------------------------------------------------------
diff --git a/src/config/src/config_writer.erl b/src/config/src/config_writer.erl
deleted file mode 100644
index 2812686..0000000
--- a/src/config/src/config_writer.erl
+++ /dev/null
@@ -1,79 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-%   http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-%% @doc Saves a Key/Value pair to a ini file. The Key consists of a Section
-%%      and Option combination. If that combination is found in the ini file
-%%      the new value replaces the old value. If only the Section is found the
-%%      Option and value combination is appended to the Section. If the Section
-%%      does not yet exist in the ini file, it is added and the Option/Value
-%%      pair is appended.
-%% @see config
-
--module(config_writer).
-
--export([save_to_file/2]).
-
-%% @spec save_to_file(
-%%           Config::{{Section::string(), Option::string()}, Value::string()},
-%%           File::filename()) -> ok
-%% @doc Saves a Section/Key/Value triple to the ini file File::filename()
-save_to_file({{Section, Key}, Value}, File) ->
-    {ok, OldFileContents} = file:read_file(File),
-    Lines = re:split(OldFileContents, "\r\n|\n|\r|\032", [{return, list}]),
-
-    SectionLine = "[" ++ Section ++ "]",
-    {ok, Pattern} = re:compile(["^(", Key, "\\s*=)|\\[[a-zA-Z0-9\.\_-]*\\]"]),
-
-    NewLines = process_file_lines(Lines, [], SectionLine, Pattern, Key, Value),
-    NewFileContents = reverse_and_add_newline(strip_empty_lines(NewLines), []),
-    ok = file:write_file(File, NewFileContents).
-
-
-process_file_lines([Section|Rest], SeenLines, Section, Pattern, Key, Value) ->
-    process_section_lines(Rest, [Section|SeenLines], Pattern, Key, Value);
-
-process_file_lines([Line|Rest], SeenLines, Section, Pattern, Key, Value) ->
-    process_file_lines(Rest, [Line|SeenLines], Section, Pattern, Key, Value);
-
-process_file_lines([], SeenLines, Section, _Pattern, Key, Value) ->
-    % Section wasn't found.  Append it with the option here.
-    [Key ++ " = " ++ Value, Section, "" | strip_empty_lines(SeenLines)].
-
-
-process_section_lines([Line|Rest], SeenLines, Pattern, Key, Value) ->
-    case re:run(Line, Pattern, [{capture, all_but_first}]) of
-    nomatch -> % Found nothing interesting. Move on.
-        process_section_lines(Rest, [Line|SeenLines], Pattern, Key, Value);
-    {match, []} -> % Found another section. Append the option here.
-        lists:reverse(Rest) ++
-        [Line, "", Key ++ " = " ++ Value | strip_empty_lines(SeenLines)];
-    {match, _} -> % Found the option itself. Replace it.
-        lists:reverse(Rest) ++ [Key ++ " = " ++ Value | SeenLines]
-    end;
-
-process_section_lines([], SeenLines, _Pattern, Key, Value) ->
-    % Found end of file within the section. Append the option here.
-    [Key ++ " = " ++ Value | strip_empty_lines(SeenLines)].
-
-
-reverse_and_add_newline([Line|Rest], Content) ->
-    reverse_and_add_newline(Rest, [Line, "\n", Content]);
-
-reverse_and_add_newline([], Content) ->
-    Content.
-
-
-strip_empty_lines(["" | Rest]) ->
-    strip_empty_lines(Rest);
-
-strip_empty_lines(All) ->
-    All.