1
0
Fork 0
mirror of https://github.com/correl/rebar.git synced 2024-12-18 11:06:20 +00:00

Support single level of nested template variables

Add support for defining template variables of the following form:

{variables, [{appid, "mochiwebapp"},
         {author, "Mochi Media <dev@mochimedia.com>"},
         {year, "2010"},
         {version, "0.1"},
         {port, 8080},
         {dest, "{{appid}}"}]}.

Where dest may be overridden on the commandline but will default to
being the appid. Mochiweb uses this so that we can create new
projects from the template in a configurable directory.

So

$ rebar create template=mochiwebapp dest=foo appid=bar

I thought about special casing dest but figured it might be generally
useful to be able to nest template vars.

However this patch only does one level of resolution. So if

{variables, [{foo, "{{bar}}"},
                {bar, "{{foo}}"}]}.

then bar will end up being the literal string {{bar}} and foo the
literal string {{foo}}.
This commit is contained in:
David Reid 2010-11-11 09:41:13 -08:00 committed by Tuncer Ayaz
parent 9b0d35d986
commit 63d5ceb61d

View file

@ -104,8 +104,14 @@ create(_Config, _) ->
%% For each variable, see if it's defined in global vars -- if it is, prefer that
%% value over the defaults
Context = update_vars(dict:fetch_keys(Context0), Context0),
?DEBUG("Template ~p context: ~p\n", [template_id(), dict:to_list(Context)]),
Context1 = update_vars(dict:fetch_keys(Context0), Context0),
?DEBUG("Template ~p context: ~p\n", [template_id(), dict:to_list(Context1)]),
%% Handle variables that possibly include other variables in their
%% definition
Context = resolve_recursive_vars(dict:to_list(Context1), Context1),
?DEBUG("Resolved Template ~p context: ~p\n", [template_id(), dict:to_list(Context1)]),
%% Now, use our context to process the template definition -- this permits us to
%% use variables within the definition for filenames.
@ -205,6 +211,19 @@ update_vars([Key | Rest], Dict) ->
update_vars(Rest, dict:store(Key, Value, Dict)).
%%
%% Given a list of key value pairs, for each string value attempt to
%% render it using Dict as the context. Storing the result in Dict as Key.
%%
resolve_recursive_vars([], Dict) ->
Dict;
resolve_recursive_vars([{Key, Value0} | Rest], Dict) when is_list(Value0) ->
Value = render(list_to_binary(Value0), Dict),
resolve_recursive_vars(Rest, dict:store(Key, Value, Dict));
resolve_recursive_vars([_Pair | Rest], Dict) ->
resolve_recursive_vars(Rest, Dict).
%%
%% Given a string or binary, parse it into a list of terms, ala file:consult/0
%%
@ -319,4 +338,3 @@ execute_template([{variables, _} | Rest], TemplateType, TemplateName, Context, F
execute_template([Other | Rest], TemplateType, TemplateName, Context, Force, ExistingFiles) ->
?WARN("Skipping unknown template instruction: ~p\n", [Other]),
execute_template(Rest, TemplateType, TemplateName, Context, Force, ExistingFiles).