|
@ -103,11 +103,13 @@ |
|
|
new() -> |
|
|
new() -> |
|
|
#app_info_t{}. |
|
|
#app_info_t{}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc Build a new app info value with only the app name set. |
|
|
-spec new(atom() | binary() | string()) -> |
|
|
-spec new(atom() | binary() | string()) -> |
|
|
{ok, t()}. |
|
|
{ok, t()}. |
|
|
new(AppName) -> |
|
|
new(AppName) -> |
|
|
{ok, #app_info_t{name=ec_cnv:to_binary(AppName)}}. |
|
|
{ok, #app_info_t{name=ec_cnv:to_binary(AppName)}}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc Build a new app info value with only the name and version set. |
|
|
-spec new(atom() | binary() | string(), binary() | string()) -> |
|
|
-spec new(atom() | binary() | string(), binary() | string()) -> |
|
|
{ok, t()}. |
|
|
{ok, t()}. |
|
|
new(AppName, Vsn) -> |
|
|
new(AppName, Vsn) -> |
|
@ -144,6 +146,9 @@ new(Parent, AppName, Vsn, Dir, Deps) -> |
|
|
out_dir=ec_cnv:to_list(Dir), |
|
|
out_dir=ec_cnv:to_list(Dir), |
|
|
deps=Deps}}. |
|
|
deps=Deps}}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc update the opts based on the contents of a config |
|
|
|
|
|
%% file for the app |
|
|
|
|
|
-spec update_opts(t(), rebar_dict(), [any()]) -> t(). |
|
|
update_opts(AppInfo, Opts, Config) -> |
|
|
update_opts(AppInfo, Opts, Config) -> |
|
|
LockDeps = case resource_type(AppInfo) of |
|
|
LockDeps = case resource_type(AppInfo) of |
|
|
pkg -> |
|
|
pkg -> |
|
@ -163,6 +168,8 @@ update_opts(AppInfo, Opts, Config) -> |
|
|
AppInfo#app_info_t{opts=NewOpts |
|
|
AppInfo#app_info_t{opts=NewOpts |
|
|
,default=NewOpts}. |
|
|
,default=NewOpts}. |
|
|
|
|
|
|
|
|
|
|
|
%% @private extract the deps for an app in `Dir' based on its config file data |
|
|
|
|
|
-spec deps_from_config(file:filename(), [any()]) -> [{tuple(), any()}, ...]. |
|
|
deps_from_config(Dir, Config) -> |
|
|
deps_from_config(Dir, Config) -> |
|
|
case rebar_config:consult_lock_file(filename:join(Dir, ?LOCK_FILE)) of |
|
|
case rebar_config:consult_lock_file(filename:join(Dir, ?LOCK_FILE)) of |
|
|
[] -> |
|
|
[] -> |
|
@ -184,30 +191,48 @@ discover(Dir) -> |
|
|
not_found |
|
|
not_found |
|
|
end. |
|
|
end. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc get the name of the app. |
|
|
-spec name(t()) -> binary(). |
|
|
-spec name(t()) -> binary(). |
|
|
name(#app_info_t{name=Name}) -> |
|
|
name(#app_info_t{name=Name}) -> |
|
|
Name. |
|
|
Name. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc set the name of the app. |
|
|
-spec name(t(), atom() | binary() | string()) -> t(). |
|
|
-spec name(t(), atom() | binary() | string()) -> t(). |
|
|
name(AppInfo=#app_info_t{}, AppName) -> |
|
|
name(AppInfo=#app_info_t{}, AppName) -> |
|
|
AppInfo#app_info_t{name=ec_cnv:to_binary(AppName)}. |
|
|
AppInfo#app_info_t{name=ec_cnv:to_binary(AppName)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc get the dictionary of options for the app. |
|
|
|
|
|
-spec opts(t()) -> rebar_dict(). |
|
|
opts(#app_info_t{opts=Opts}) -> |
|
|
opts(#app_info_t{opts=Opts}) -> |
|
|
Opts. |
|
|
Opts. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc set the dictionary of options for the app. |
|
|
|
|
|
-spec opts(t(), rebar_dict()) -> t(). |
|
|
opts(AppInfo, Opts) -> |
|
|
opts(AppInfo, Opts) -> |
|
|
AppInfo#app_info_t{opts=Opts}. |
|
|
AppInfo#app_info_t{opts=Opts}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc get the dictionary of options under the default profile. |
|
|
|
|
|
%% Represents a root set prior to applying other profiles. |
|
|
|
|
|
-spec default(t()) -> rebar_dict(). |
|
|
default(#app_info_t{default=Default}) -> |
|
|
default(#app_info_t{default=Default}) -> |
|
|
Default. |
|
|
Default. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc set the dictionary of options under the default profile. |
|
|
|
|
|
%% Useful when re-applying profile. |
|
|
|
|
|
-spec default(t(), rebar_dict()) -> t(). |
|
|
default(AppInfo, Default) -> |
|
|
default(AppInfo, Default) -> |
|
|
AppInfo#app_info_t{default=Default}. |
|
|
AppInfo#app_info_t{default=Default}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc look up a value in the dictionary of options; fails if |
|
|
|
|
|
%% the key for it does not exist. |
|
|
|
|
|
-spec get(t(), term()) -> term(). |
|
|
get(AppInfo, Key) -> |
|
|
get(AppInfo, Key) -> |
|
|
{ok, Value} = dict:find(Key, AppInfo#app_info_t.opts), |
|
|
{ok, Value} = dict:find(Key, AppInfo#app_info_t.opts), |
|
|
Value. |
|
|
Value. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc look up a value in the dictionary of options; returns |
|
|
|
|
|
%% a `Default' value otherwise. |
|
|
|
|
|
-spec get(t(), term(), term()) -> term(). |
|
|
get(AppInfo, Key, Default) -> |
|
|
get(AppInfo, Key, Default) -> |
|
|
case dict:find(Key, AppInfo#app_info_t.opts) of |
|
|
case dict:find(Key, AppInfo#app_info_t.opts) of |
|
|
{ok, Value} -> |
|
|
{ok, Value} -> |
|
@ -216,10 +241,12 @@ get(AppInfo, Key, Default) -> |
|
|
Default |
|
|
Default |
|
|
end. |
|
|
end. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets a given value in the dictionary of options for the app. |
|
|
-spec set(t(), any(), any()) -> t(). |
|
|
-spec set(t(), any(), any()) -> t(). |
|
|
set(AppInfo=#app_info_t{opts=Opts}, Key, Value) -> |
|
|
set(AppInfo=#app_info_t{opts=Opts}, Key, Value) -> |
|
|
AppInfo#app_info_t{opts = dict:store(Key, Value, Opts)}. |
|
|
AppInfo#app_info_t{opts = dict:store(Key, Value, Opts)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc finds the .app.src file for an app, if any. |
|
|
-spec app_file_src(t()) -> file:filename_all() | undefined. |
|
|
-spec app_file_src(t()) -> file:filename_all() | undefined. |
|
|
app_file_src(#app_info_t{app_file_src=undefined, dir=Dir, name=Name}) -> |
|
|
app_file_src(#app_info_t{app_file_src=undefined, dir=Dir, name=Name}) -> |
|
|
AppFileSrc = filename:join([ec_cnv:to_list(Dir), "src", ec_cnv:to_list(Name)++".app.src"]), |
|
|
AppFileSrc = filename:join([ec_cnv:to_list(Dir), "src", ec_cnv:to_list(Name)++".app.src"]), |
|
@ -232,12 +259,15 @@ app_file_src(#app_info_t{app_file_src=undefined, dir=Dir, name=Name}) -> |
|
|
app_file_src(#app_info_t{app_file_src=AppFileSrc}) -> |
|
|
app_file_src(#app_info_t{app_file_src=AppFileSrc}) -> |
|
|
ec_cnv:to_list(AppFileSrc). |
|
|
ec_cnv:to_list(AppFileSrc). |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the .app.src file for an app. An app without such a file |
|
|
|
|
|
%% can explicitly be set with `undefined'. |
|
|
-spec app_file_src(t(), file:filename_all() | undefined) -> t(). |
|
|
-spec app_file_src(t(), file:filename_all() | undefined) -> t(). |
|
|
app_file_src(AppInfo=#app_info_t{}, undefined) -> |
|
|
app_file_src(AppInfo=#app_info_t{}, undefined) -> |
|
|
AppInfo#app_info_t{app_file_src=undefined}; |
|
|
AppInfo#app_info_t{app_file_src=undefined}; |
|
|
app_file_src(AppInfo=#app_info_t{}, AppFileSrc) -> |
|
|
app_file_src(AppInfo=#app_info_t{}, AppFileSrc) -> |
|
|
AppInfo#app_info_t{app_file_src=ec_cnv:to_list(AppFileSrc)}. |
|
|
AppInfo#app_info_t{app_file_src=ec_cnv:to_list(AppFileSrc)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc finds the .app.src.script file for an app, if any. |
|
|
-spec app_file_src_script(t()) -> file:filename_all() | undefined. |
|
|
-spec app_file_src_script(t()) -> file:filename_all() | undefined. |
|
|
app_file_src_script(#app_info_t{app_file_src_script=undefined, dir=Dir, name=Name}) -> |
|
|
app_file_src_script(#app_info_t{app_file_src_script=undefined, dir=Dir, name=Name}) -> |
|
|
AppFileSrcScript = filename:join([ec_cnv:to_list(Dir), "src", ec_cnv:to_list(Name)++".app.src.script"]), |
|
|
AppFileSrcScript = filename:join([ec_cnv:to_list(Dir), "src", ec_cnv:to_list(Name)++".app.src.script"]), |
|
@ -250,12 +280,15 @@ app_file_src_script(#app_info_t{app_file_src_script=undefined, dir=Dir, name=Nam |
|
|
app_file_src_script(#app_info_t{app_file_src_script=AppFileSrcScript}) -> |
|
|
app_file_src_script(#app_info_t{app_file_src_script=AppFileSrcScript}) -> |
|
|
ec_cnv:to_list(AppFileSrcScript). |
|
|
ec_cnv:to_list(AppFileSrcScript). |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the .app.src.script file for an app. An app without such a file |
|
|
|
|
|
%% can explicitly be set with `undefined'. |
|
|
-spec app_file_src_script(t(), file:filename_all()) -> t(). |
|
|
-spec app_file_src_script(t(), file:filename_all()) -> t(). |
|
|
app_file_src_script(AppInfo=#app_info_t{}, undefined) -> |
|
|
app_file_src_script(AppInfo=#app_info_t{}, undefined) -> |
|
|
AppInfo#app_info_t{app_file_src_script=undefined}; |
|
|
AppInfo#app_info_t{app_file_src_script=undefined}; |
|
|
app_file_src_script(AppInfo=#app_info_t{}, AppFileSrcScript) -> |
|
|
app_file_src_script(AppInfo=#app_info_t{}, AppFileSrcScript) -> |
|
|
AppInfo#app_info_t{app_file_src_script=ec_cnv:to_list(AppFileSrcScript)}. |
|
|
AppInfo#app_info_t{app_file_src_script=ec_cnv:to_list(AppFileSrcScript)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc finds the .app file for an app, if any. |
|
|
-spec app_file(t()) -> file:filename_all() | undefined. |
|
|
-spec app_file(t()) -> file:filename_all() | undefined. |
|
|
app_file(#app_info_t{app_file=undefined, out_dir=Dir, name=Name}) -> |
|
|
app_file(#app_info_t{app_file=undefined, out_dir=Dir, name=Name}) -> |
|
|
AppFile = filename:join([ec_cnv:to_list(Dir), "ebin", ec_cnv:to_list(Name)++".app"]), |
|
|
AppFile = filename:join([ec_cnv:to_list(Dir), "ebin", ec_cnv:to_list(Name)++".app"]), |
|
@ -268,10 +301,13 @@ app_file(#app_info_t{app_file=undefined, out_dir=Dir, name=Name}) -> |
|
|
app_file(#app_info_t{app_file=AppFile}) -> |
|
|
app_file(#app_info_t{app_file=AppFile}) -> |
|
|
AppFile. |
|
|
AppFile. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the .app file for an app. |
|
|
-spec app_file(t(), file:filename_all()) -> t(). |
|
|
-spec app_file(t(), file:filename_all()) -> t(). |
|
|
app_file(AppInfo=#app_info_t{}, AppFile) -> |
|
|
app_file(AppInfo=#app_info_t{}, AppFile) -> |
|
|
AppInfo#app_info_t{app_file=AppFile}. |
|
|
AppInfo#app_info_t{app_file=AppFile}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the information stored in the app's app file, |
|
|
|
|
|
%% or if none, from the .app.src file. |
|
|
-spec app_details(t()) -> list(). |
|
|
-spec app_details(t()) -> list(). |
|
|
app_details(AppInfo=#app_info_t{app_details=[]}) -> |
|
|
app_details(AppInfo=#app_info_t{app_details=[]}) -> |
|
|
case app_file(AppInfo) of |
|
|
case app_file(AppInfo) of |
|
@ -290,59 +326,83 @@ app_details(AppInfo=#app_info_t{app_details=[]}) -> |
|
|
app_details(#app_info_t{app_details=AppDetails}) -> |
|
|
app_details(#app_info_t{app_details=AppDetails}) -> |
|
|
AppDetails. |
|
|
AppDetails. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc stores the information that would be returned from the |
|
|
|
|
|
%% app file, when reading from `app_details/1'. |
|
|
-spec app_details(t(), list()) -> t(). |
|
|
-spec app_details(t(), list()) -> t(). |
|
|
app_details(AppInfo=#app_info_t{}, AppDetails) -> |
|
|
app_details(AppInfo=#app_info_t{}, AppDetails) -> |
|
|
AppInfo#app_info_t{app_details=AppDetails}. |
|
|
AppInfo#app_info_t{app_details=AppDetails}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the app's parent in the dep tree. |
|
|
|
|
|
-spec parent(t()) -> root | binary(). |
|
|
parent(#app_info_t{parent=Parent}) -> |
|
|
parent(#app_info_t{parent=Parent}) -> |
|
|
Parent. |
|
|
Parent. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the app's parent. |
|
|
-spec parent(t(), binary() | root) -> t(). |
|
|
-spec parent(t(), binary() | root) -> t(). |
|
|
parent(AppInfo=#app_info_t{}, Parent) -> |
|
|
parent(AppInfo=#app_info_t{}, Parent) -> |
|
|
AppInfo#app_info_t{parent=Parent}. |
|
|
AppInfo#app_info_t{parent=Parent}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the original version of the app (unevaluated if |
|
|
|
|
|
%% asking for a semver) |
|
|
-spec original_vsn(t()) -> string(). |
|
|
-spec original_vsn(t()) -> string(). |
|
|
original_vsn(#app_info_t{original_vsn=Vsn}) -> |
|
|
original_vsn(#app_info_t{original_vsn=Vsn}) -> |
|
|
Vsn. |
|
|
Vsn. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc stores the original version of the app (unevaluated if |
|
|
|
|
|
%% asking for a semver) |
|
|
-spec original_vsn(t(), string()) -> t(). |
|
|
-spec original_vsn(t(), string()) -> t(). |
|
|
original_vsn(AppInfo=#app_info_t{}, Vsn) -> |
|
|
original_vsn(AppInfo=#app_info_t{}, Vsn) -> |
|
|
AppInfo#app_info_t{original_vsn=Vsn}. |
|
|
AppInfo#app_info_t{original_vsn=Vsn}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the list of applications the app depends on. |
|
|
-spec applications(t()) -> list(). |
|
|
-spec applications(t()) -> list(). |
|
|
applications(#app_info_t{applications=Applications}) -> |
|
|
applications(#app_info_t{applications=Applications}) -> |
|
|
Applications. |
|
|
Applications. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the list of applications the app depends on. |
|
|
|
|
|
%% Should be obtained from the app file. |
|
|
-spec applications(t(), list()) -> t(). |
|
|
-spec applications(t(), list()) -> t(). |
|
|
applications(AppInfo=#app_info_t{}, Applications) -> |
|
|
applications(AppInfo=#app_info_t{}, Applications) -> |
|
|
AppInfo#app_info_t{applications=Applications}. |
|
|
AppInfo#app_info_t{applications=Applications}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the list of active profiles |
|
|
-spec profiles(t()) -> list(). |
|
|
-spec profiles(t()) -> list(). |
|
|
profiles(#app_info_t{profiles=Profiles}) -> |
|
|
profiles(#app_info_t{profiles=Profiles}) -> |
|
|
Profiles. |
|
|
Profiles. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the list of active profiles |
|
|
-spec profiles(t(), list()) -> t(). |
|
|
-spec profiles(t(), list()) -> t(). |
|
|
profiles(AppInfo=#app_info_t{}, Profiles) -> |
|
|
profiles(AppInfo=#app_info_t{}, Profiles) -> |
|
|
AppInfo#app_info_t{profiles=Profiles}. |
|
|
AppInfo#app_info_t{profiles=Profiles}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the list of dependencies |
|
|
-spec deps(t()) -> list(). |
|
|
-spec deps(t()) -> list(). |
|
|
deps(#app_info_t{deps=Deps}) -> |
|
|
deps(#app_info_t{deps=Deps}) -> |
|
|
Deps. |
|
|
Deps. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the list of dependencies. |
|
|
-spec deps(t(), list()) -> t(). |
|
|
-spec deps(t(), list()) -> t(). |
|
|
deps(AppInfo=#app_info_t{}, Deps) -> |
|
|
deps(AppInfo=#app_info_t{}, Deps) -> |
|
|
AppInfo#app_info_t{deps=Deps}. |
|
|
AppInfo#app_info_t{deps=Deps}. |
|
|
|
|
|
|
|
|
dep_level(AppInfo=#app_info_t{}, Level) -> |
|
|
|
|
|
AppInfo#app_info_t{dep_level=Level}. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the level the app has in the lock files or in the |
|
|
|
|
|
%% dep tree. |
|
|
|
|
|
-spec dep_level(t()) -> non_neg_integer(). |
|
|
dep_level(#app_info_t{dep_level=Level}) -> |
|
|
dep_level(#app_info_t{dep_level=Level}) -> |
|
|
Level. |
|
|
Level. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the level the app has in the lock files or in the |
|
|
|
|
|
%% dep tree. |
|
|
|
|
|
-spec dep_level(t(), non_neg_integer()) -> t(). |
|
|
|
|
|
dep_level(AppInfo=#app_info_t{}, Level) -> |
|
|
|
|
|
AppInfo#app_info_t{dep_level=Level}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the directory that contains the app. |
|
|
-spec dir(t()) -> file:name(). |
|
|
-spec dir(t()) -> file:name(). |
|
|
dir(#app_info_t{dir=Dir}) -> |
|
|
dir(#app_info_t{dir=Dir}) -> |
|
|
Dir. |
|
|
Dir. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the directory that contains the app. |
|
|
-spec dir(t(), file:name()) -> t(). |
|
|
-spec dir(t(), file:name()) -> t(). |
|
|
dir(AppInfo=#app_info_t{out_dir=undefined}, Dir) -> |
|
|
dir(AppInfo=#app_info_t{out_dir=undefined}, Dir) -> |
|
|
AppInfo#app_info_t{dir=ec_cnv:to_list(Dir), |
|
|
AppInfo#app_info_t{dir=ec_cnv:to_list(Dir), |
|
@ -350,54 +410,69 @@ dir(AppInfo=#app_info_t{out_dir=undefined}, Dir) -> |
|
|
dir(AppInfo=#app_info_t{}, Dir) -> |
|
|
dir(AppInfo=#app_info_t{}, Dir) -> |
|
|
AppInfo#app_info_t{dir=ec_cnv:to_list(Dir)}. |
|
|
AppInfo#app_info_t{dir=ec_cnv:to_list(Dir)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the directory where build artifacts for the app |
|
|
|
|
|
%% should go |
|
|
-spec out_dir(t()) -> file:name(). |
|
|
-spec out_dir(t()) -> file:name(). |
|
|
out_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
out_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
OutDir. |
|
|
OutDir. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets the directory where build artifacts for the app |
|
|
|
|
|
%% should go |
|
|
-spec out_dir(t(), file:name()) -> t(). |
|
|
-spec out_dir(t(), file:name()) -> t(). |
|
|
out_dir(AppInfo=#app_info_t{}, OutDir) -> |
|
|
out_dir(AppInfo=#app_info_t{}, OutDir) -> |
|
|
AppInfo#app_info_t{out_dir=ec_cnv:to_list(OutDir)}. |
|
|
AppInfo#app_info_t{out_dir=ec_cnv:to_list(OutDir)}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc gets the directory where ebin files for the app should go |
|
|
-spec ebin_dir(t()) -> file:name(). |
|
|
-spec ebin_dir(t()) -> file:name(). |
|
|
ebin_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
ebin_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
ec_cnv:to_list(filename:join(OutDir, "ebin")). |
|
|
ec_cnv:to_list(filename:join(OutDir, "ebin")). |
|
|
|
|
|
|
|
|
|
|
|
%% @doc gets the directory where private files for the app should go |
|
|
-spec priv_dir(t()) -> file:name(). |
|
|
-spec priv_dir(t()) -> file:name(). |
|
|
priv_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
priv_dir(#app_info_t{out_dir=OutDir}) -> |
|
|
ec_cnv:to_list(filename:join(OutDir, "priv")). |
|
|
ec_cnv:to_list(filename:join(OutDir, "priv")). |
|
|
|
|
|
|
|
|
-spec resource_type(t(), pkg | src) -> t(). |
|
|
|
|
|
resource_type(AppInfo=#app_info_t{}, Type) -> |
|
|
|
|
|
AppInfo#app_info_t{resource_type=Type}. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns whether the app is source app or a package app. |
|
|
-spec resource_type(t()) -> pkg | src. |
|
|
-spec resource_type(t()) -> pkg | src. |
|
|
resource_type(#app_info_t{resource_type=ResourceType}) -> |
|
|
resource_type(#app_info_t{resource_type=ResourceType}) -> |
|
|
ResourceType. |
|
|
ResourceType. |
|
|
|
|
|
|
|
|
-spec source(t(), string() | tuple() | checkout) -> t(). |
|
|
|
|
|
source(AppInfo=#app_info_t{}, Source) -> |
|
|
|
|
|
AppInfo#app_info_t{source=Source}. |
|
|
|
|
|
|
|
|
%% @doc sets whether the app is source app or a package app. |
|
|
|
|
|
-spec resource_type(t(), pkg | src) -> t(). |
|
|
|
|
|
resource_type(AppInfo=#app_info_t{}, Type) -> |
|
|
|
|
|
AppInfo#app_info_t{resource_type=Type}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc finds the source specification for the app |
|
|
-spec source(t()) -> string() | tuple(). |
|
|
-spec source(t()) -> string() | tuple(). |
|
|
source(#app_info_t{source=Source}) -> |
|
|
source(#app_info_t{source=Source}) -> |
|
|
Source. |
|
|
Source. |
|
|
|
|
|
|
|
|
-spec is_lock(t(), boolean()) -> t(). |
|
|
|
|
|
is_lock(AppInfo=#app_info_t{}, IsLock) -> |
|
|
|
|
|
AppInfo#app_info_t{is_lock=IsLock}. |
|
|
|
|
|
|
|
|
%% @doc sets the source specification for the app |
|
|
|
|
|
-spec source(t(), string() | tuple() | checkout) -> t(). |
|
|
|
|
|
source(AppInfo=#app_info_t{}, Source) -> |
|
|
|
|
|
AppInfo#app_info_t{source=Source}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns the lock status for the app |
|
|
-spec is_lock(t()) -> boolean(). |
|
|
-spec is_lock(t()) -> boolean(). |
|
|
is_lock(#app_info_t{is_lock=IsLock}) -> |
|
|
is_lock(#app_info_t{is_lock=IsLock}) -> |
|
|
IsLock. |
|
|
IsLock. |
|
|
|
|
|
|
|
|
-spec is_checkout(t(), boolean()) -> t(). |
|
|
|
|
|
is_checkout(AppInfo=#app_info_t{}, IsCheckout) -> |
|
|
|
|
|
AppInfo#app_info_t{is_checkout=IsCheckout}. |
|
|
|
|
|
|
|
|
%% @doc sets the lock status for the app |
|
|
|
|
|
-spec is_lock(t(), boolean()) -> t(). |
|
|
|
|
|
is_lock(AppInfo=#app_info_t{}, IsLock) -> |
|
|
|
|
|
AppInfo#app_info_t{is_lock=IsLock}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns whether the app is a checkout app or not |
|
|
-spec is_checkout(t()) -> boolean(). |
|
|
-spec is_checkout(t()) -> boolean(). |
|
|
is_checkout(#app_info_t{is_checkout=IsCheckout}) -> |
|
|
is_checkout(#app_info_t{is_checkout=IsCheckout}) -> |
|
|
IsCheckout. |
|
|
IsCheckout. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets whether the app is a checkout app or not |
|
|
|
|
|
-spec is_checkout(t(), boolean()) -> t(). |
|
|
|
|
|
is_checkout(AppInfo=#app_info_t{}, IsCheckout) -> |
|
|
|
|
|
AppInfo#app_info_t{is_checkout=IsCheckout}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc returns whether the app is valid (built) or not |
|
|
-spec valid(t()) -> boolean(). |
|
|
-spec valid(t()) -> boolean(). |
|
|
valid(AppInfo=#app_info_t{valid=undefined}) -> |
|
|
valid(AppInfo=#app_info_t{valid=undefined}) -> |
|
|
case rebar_app_utils:validate_application_info(AppInfo) =:= true |
|
|
case rebar_app_utils:validate_application_info(AppInfo) =:= true |
|
@ -410,14 +485,22 @@ valid(AppInfo=#app_info_t{valid=undefined}) -> |
|
|
valid(#app_info_t{valid=Valid}) -> |
|
|
valid(#app_info_t{valid=Valid}) -> |
|
|
Valid. |
|
|
Valid. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc sets whether the app is valid (built) or not. If left unset, |
|
|
|
|
|
%% rebar3 will do the detection of the status itself. |
|
|
-spec valid(t(), boolean()) -> t(). |
|
|
-spec valid(t(), boolean()) -> t(). |
|
|
valid(AppInfo=#app_info_t{}, Valid) -> |
|
|
valid(AppInfo=#app_info_t{}, Valid) -> |
|
|
AppInfo#app_info_t{valid=Valid}. |
|
|
AppInfo#app_info_t{valid=Valid}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc checks whether the app can be built with the current |
|
|
|
|
|
%% Erlang/OTP version. If the check fails, the function raises |
|
|
|
|
|
%% an exception and displays an error. |
|
|
|
|
|
-spec verify_otp_vsn(t()) -> ok | no_return(). |
|
|
verify_otp_vsn(AppInfo) -> |
|
|
verify_otp_vsn(AppInfo) -> |
|
|
rebar_utils:check_min_otp_version(rebar_app_info:get(AppInfo, minimum_otp_vsn, undefined)), |
|
|
rebar_utils:check_min_otp_version(rebar_app_info:get(AppInfo, minimum_otp_vsn, undefined)), |
|
|
rebar_utils:check_blacklisted_otp_versions(rebar_app_info:get(AppInfo, blacklisted_otp_vsns, [])). |
|
|
rebar_utils:check_blacklisted_otp_versions(rebar_app_info:get(AppInfo, blacklisted_otp_vsns, [])). |
|
|
|
|
|
|
|
|
|
|
|
%% @doc checks whether all the build artifacts for an app to be considered |
|
|
|
|
|
%% valid are present. |
|
|
-spec has_all_artifacts(#app_info_t{}) -> true | {false, file:filename()}. |
|
|
-spec has_all_artifacts(#app_info_t{}) -> true | {false, file:filename()}. |
|
|
has_all_artifacts(AppInfo) -> |
|
|
has_all_artifacts(AppInfo) -> |
|
|
Artifacts = rebar_app_info:get(AppInfo, artifacts, []), |
|
|
Artifacts = rebar_app_info:get(AppInfo, artifacts, []), |
|
@ -427,6 +510,10 @@ has_all_artifacts(AppInfo) -> |
|
|
,{out_dir, OutDir}], |
|
|
,{out_dir, OutDir}], |
|
|
all(OutDir, Context, Artifacts). |
|
|
all(OutDir, Context, Artifacts). |
|
|
|
|
|
|
|
|
|
|
|
%% @private checks that all files/artifacts in the directory are found. |
|
|
|
|
|
%% Template evaluation must happen and a bbmustache context needs to |
|
|
|
|
|
%% be provided. |
|
|
|
|
|
-spec all(file:filename(), term(), [string()]) -> true | {false, string()}. |
|
|
all(_, _, []) -> |
|
|
all(_, _, []) -> |
|
|
true; |
|
|
true; |
|
|
all(Dir, Context, [File|Artifacts]) -> |
|
|
all(Dir, Context, [File|Artifacts]) -> |
|
@ -441,15 +528,23 @@ all(Dir, Context, [File|Artifacts]) -> |
|
|
|
|
|
|
|
|
%%%%% |
|
|
%%%%% |
|
|
|
|
|
|
|
|
|
|
|
%% @doc given a set of override rules, modify the app info accordingly |
|
|
|
|
|
-spec apply_overrides(list(), t()) -> t(). |
|
|
apply_overrides(Overrides, AppInfo) -> |
|
|
apply_overrides(Overrides, AppInfo) -> |
|
|
Name = binary_to_atom(rebar_app_info:name(AppInfo), utf8), |
|
|
Name = binary_to_atom(rebar_app_info:name(AppInfo), utf8), |
|
|
Opts = rebar_opts:apply_overrides(opts(AppInfo), Name, Overrides), |
|
|
Opts = rebar_opts:apply_overrides(opts(AppInfo), Name, Overrides), |
|
|
AppInfo#app_info_t{default=Opts, opts=Opts}. |
|
|
AppInfo#app_info_t{default=Opts, opts=Opts}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc adds a new profile with its own config to the app data |
|
|
|
|
|
-spec add_to_profile(t(), atom(), [{_,_}]) -> t(). |
|
|
add_to_profile(AppInfo, Profile, KVs) when is_atom(Profile), is_list(KVs) -> |
|
|
add_to_profile(AppInfo, Profile, KVs) when is_atom(Profile), is_list(KVs) -> |
|
|
Opts = rebar_opts:add_to_profile(opts(AppInfo), Profile, KVs), |
|
|
Opts = rebar_opts:add_to_profile(opts(AppInfo), Profile, KVs), |
|
|
AppInfo#app_info_t{opts=Opts}. |
|
|
AppInfo#app_info_t{opts=Opts}. |
|
|
|
|
|
|
|
|
|
|
|
%% @doc applies and merges the profile configuration in the specified order |
|
|
|
|
|
%% of profiles (or for a single profile) and returns an app info record |
|
|
|
|
|
%% with the resulting configuration |
|
|
|
|
|
-spec apply_profiles(t(), atom() | [atom(),...]) -> t(). |
|
|
apply_profiles(AppInfo, Profile) when not is_list(Profile) -> |
|
|
apply_profiles(AppInfo, Profile) when not is_list(Profile) -> |
|
|
apply_profiles(AppInfo, [Profile]); |
|
|
apply_profiles(AppInfo, [Profile]); |
|
|
apply_profiles(AppInfo, [default]) -> |
|
|
apply_profiles(AppInfo, [default]) -> |
|
@ -481,9 +576,13 @@ apply_profiles(AppInfo=#app_info_t{default = Defaults, profiles=CurrentProfiles} |
|
|
end, Defaults, AppliedProfiles), |
|
|
end, Defaults, AppliedProfiles), |
|
|
AppInfo#app_info_t{profiles = AppliedProfiles, opts=NewOpts}. |
|
|
AppInfo#app_info_t{profiles = AppliedProfiles, opts=NewOpts}. |
|
|
|
|
|
|
|
|
|
|
|
%% @private drops duplicated profile definitions |
|
|
|
|
|
-spec deduplicate(list()) -> list(). |
|
|
deduplicate(Profiles) -> |
|
|
deduplicate(Profiles) -> |
|
|
do_deduplicate(lists:reverse(Profiles), []). |
|
|
do_deduplicate(lists:reverse(Profiles), []). |
|
|
|
|
|
|
|
|
|
|
|
%% @private drops duplicated profile definitions |
|
|
|
|
|
-spec do_deduplicate(list(), list()) -> list(). |
|
|
do_deduplicate([], Acc) -> |
|
|
do_deduplicate([], Acc) -> |
|
|
Acc; |
|
|
Acc; |
|
|
do_deduplicate([Head | Rest], Acc) -> |
|
|
do_deduplicate([Head | Rest], Acc) -> |
|
|