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.