mirror of
https://github.com/correl/rebar.git
synced 2024-11-23 11:09:55 +00:00
Merge pull request #338 from vladdu/app_src_script
Processing .app.src.script expects a single value to be returned.
This commit is contained in:
commit
d6f4fd1c28
6 changed files with 147 additions and 11 deletions
1
THANKS
1
THANKS
|
@ -129,3 +129,4 @@ Andras Horvath
|
|||
Drew Varner
|
||||
Roberto Aloi
|
||||
Luis Rascao
|
||||
Vlad Dumitrescu
|
||||
|
|
6
inttest/app_src/app_src.erl
Normal file
6
inttest/app_src/app_src.erl
Normal file
|
@ -0,0 +1,6 @@
|
|||
-module(app_src).
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
test() ->
|
||||
ok.
|
54
inttest/app_src/app_src_rt.erl
Normal file
54
inttest/app_src/app_src_rt.erl
Normal file
|
@ -0,0 +1,54 @@
|
|||
%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
||||
%% ex: ts=4 sw=4 et
|
||||
-module(app_src_rt).
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
files() ->
|
||||
[{copy, "../../rebar", "rebar"},
|
||||
{create, "src/app_src.app.src", app(app_src)}].
|
||||
|
||||
run(Dir) ->
|
||||
retest_log:log(debug, "Running in Dir: ~s~n", [Dir]),
|
||||
{ok, [_Pid|Output]} = retest:sh("./rebar compile -vv",
|
||||
[{async, false}]),
|
||||
|
||||
LineRegexp = "DEBUG: Consult config file .*/app_src\.app\.src.*",
|
||||
?assertEqual(true, has_line(Output, LineRegexp)),
|
||||
retest_log:log(debug, "Evaluated .app.src.script~n", []),
|
||||
|
||||
%% check that ebin/app_src.app exists
|
||||
?assertMatch(true, filelib:is_regular("ebin/app_src.app")),
|
||||
retest_log:log(debug, "Generated ebin/.app~n", []),
|
||||
|
||||
%% check that ebin/.app has vsn="2"
|
||||
{ok, Bin} = file:read_file("ebin/app_src.app"),
|
||||
Str = binary_to_list(Bin),
|
||||
?assertMatch({match, _}, re:run(Str, "{vsn, *\"2\"}")),
|
||||
retest_log:log(debug, "Variable replacement in .app is ok.~n", []),
|
||||
|
||||
ok.
|
||||
|
||||
has_line([], _RE) ->
|
||||
false;
|
||||
has_line([L|T], RE) ->
|
||||
case re:run(L, RE, []) of
|
||||
{match, _Captured} ->
|
||||
true;
|
||||
match ->
|
||||
true;
|
||||
nomatch ->
|
||||
has_line(T, RE)
|
||||
end.
|
||||
|
||||
%%
|
||||
%% Generate the contents of a simple .app.src.script file
|
||||
%%
|
||||
app(Name) ->
|
||||
"{application, " ++ atom_to_list(Name) ++ ",
|
||||
[{vsn, \"2\"},
|
||||
{modules, []},
|
||||
{registered, []},
|
||||
{applications, [kernel, stdlib]}]}.\n".
|
6
inttest/app_src_script/app_src_script.erl
Normal file
6
inttest/app_src_script/app_src_script.erl
Normal file
|
@ -0,0 +1,6 @@
|
|||
-module(app_src_script).
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
test() ->
|
||||
ok.
|
55
inttest/app_src_script/app_src_script_rt.erl
Normal file
55
inttest/app_src_script/app_src_script_rt.erl
Normal file
|
@ -0,0 +1,55 @@
|
|||
%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
||||
%% ex: ts=4 sw=4 et
|
||||
-module(app_src_script_rt).
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
files() ->
|
||||
[{copy, "../../rebar", "rebar"},
|
||||
{create, "src/app_src.app.src.script", app_script(app_src)}].
|
||||
|
||||
run(Dir) ->
|
||||
retest_log:log(debug, "Running in Dir: ~s~n", [Dir]),
|
||||
{ok, [_Pid|Output]} = retest:sh("./rebar compile -vv",
|
||||
[{async, false}]),
|
||||
|
||||
Regexp = "DEBUG: Evaluating config script .*/app_src\.app\.src\.script.*",
|
||||
?assertEqual(true, has_line(Output, Regexp)),
|
||||
retest_log:log(debug, "Evaluated .app.src.script~n", []),
|
||||
|
||||
%% check that ebin/app_src.app exists
|
||||
?assertMatch(true, filelib:is_regular("ebin/app_src.app")),
|
||||
retest_log:log(debug, "Generated ebin/.app~n", []),
|
||||
|
||||
%% check that ebin/.app has vsn="2"
|
||||
{ok, Bin} = file:read_file("ebin/app_src.app"),
|
||||
Str = binary_to_list(Bin),
|
||||
?assertMatch({match, _}, re:run(Str, "{vsn, *\"2\"}")),
|
||||
retest_log:log(debug, "Variable replacement in .app is ok.~n", []),
|
||||
|
||||
ok.
|
||||
|
||||
has_line([], _RE) ->
|
||||
false;
|
||||
has_line([L|T], RE) ->
|
||||
case re:run(L, RE, []) of
|
||||
{match, _Captured} ->
|
||||
true;
|
||||
match ->
|
||||
true;
|
||||
nomatch ->
|
||||
has_line(T, RE)
|
||||
end.
|
||||
|
||||
%%
|
||||
%% Generate the contents of a simple .app.src.script file
|
||||
%%
|
||||
app_script(Name) ->
|
||||
"Vsn=\"2\".\n" ++
|
||||
"{application, " ++ atom_to_list(Name) ++ ",
|
||||
[{vsn, Vsn},
|
||||
{modules, []},
|
||||
{registered, []},
|
||||
{applications, [kernel, stdlib]}]}.\n".
|
|
@ -26,7 +26,8 @@
|
|||
%% -------------------------------------------------------------------
|
||||
-module(rebar_app_utils).
|
||||
|
||||
-export([is_app_dir/0, is_app_dir/1,
|
||||
-export([is_app_dir/0,
|
||||
is_app_dir/1,
|
||||
is_app_src/1,
|
||||
app_src_to_app/1,
|
||||
app_name/2,
|
||||
|
@ -47,7 +48,7 @@ is_app_dir() ->
|
|||
|
||||
is_app_dir(Dir) ->
|
||||
SrcDir = filename:join([Dir, "src"]),
|
||||
AppSrc = filename:join([SrcDir, "*.app.src"]),
|
||||
AppSrc = filename:join([SrcDir, "*.app.{src,src.script}"]),
|
||||
case filelib:wildcard(AppSrc) of
|
||||
[AppSrcFile] ->
|
||||
{true, AppSrcFile};
|
||||
|
@ -72,10 +73,17 @@ is_app_dir(Dir) ->
|
|||
is_app_src(Filename) ->
|
||||
%% If removing the extension .app.src yields a shorter name,
|
||||
%% this is an .app.src file.
|
||||
Filename =/= filename:rootname(Filename, ".app.src").
|
||||
Filename =/= filename:rootname(Filename, ".app.src") orelse
|
||||
Filename =/= filename:rootname(Filename, ".app.src.script").
|
||||
|
||||
app_src_to_app(Filename) ->
|
||||
filename:join("ebin", filename:basename(Filename, ".app.src") ++ ".app").
|
||||
Filebase = case filename:rootname(Filename, ".app.src") of
|
||||
Filename ->
|
||||
filename:basename(Filename, ".app.src.script");
|
||||
_ ->
|
||||
filename:basename(Filename, ".app.src")
|
||||
end,
|
||||
filename:join("ebin", Filebase ++ ".app").
|
||||
|
||||
app_name(Config, AppFile) ->
|
||||
case load_app_file(Config, AppFile) of
|
||||
|
@ -139,13 +147,13 @@ load_app_file(Config, Filename) ->
|
|||
case rebar_config:get_xconf(Config, {appfile, AppFile}, undefined) of
|
||||
undefined ->
|
||||
case consult_app_file(Filename) of
|
||||
{ok, [{application, AppName, AppData}]} ->
|
||||
{ok, {application, AppName, AppData}} ->
|
||||
Config1 = rebar_config:set_xconf(Config,
|
||||
{appfile, AppFile},
|
||||
{AppName, AppData}),
|
||||
{ok, Config1, AppName, AppData};
|
||||
{error, _} = Error ->
|
||||
Error;
|
||||
{error, {error, Error}};
|
||||
Other ->
|
||||
{error, {unexpected_terms, Other}}
|
||||
end;
|
||||
|
@ -159,11 +167,17 @@ load_app_file(Config, Filename) ->
|
|||
%% config. However, in the case of *.app, rebar should not manipulate
|
||||
%% that file. This enforces that dichotomy between app and app.src.
|
||||
consult_app_file(Filename) ->
|
||||
case lists:suffix(".app.src", Filename) of
|
||||
false ->
|
||||
file:consult(Filename);
|
||||
true ->
|
||||
rebar_config:consult_file(Filename)
|
||||
Result = case lists:suffix(".app", Filename) of
|
||||
true ->
|
||||
file:consult(Filename);
|
||||
false ->
|
||||
rebar_config:consult_file(Filename)
|
||||
end,
|
||||
case Result of
|
||||
{ok, [Term]} ->
|
||||
{ok, Term};
|
||||
_ ->
|
||||
Result
|
||||
end.
|
||||
|
||||
get_value(Key, AppInfo, AppFile) ->
|
||||
|
|
Loading…
Reference in a new issue