Skip to content

Commit

Permalink
Merge pull request erlang#388 from ferd/fix-semver-stuff
Browse files Browse the repository at this point in the history
Use resource handlers to deal with deps/semver
  • Loading branch information
tsloughter committed May 5, 2015
2 parents 4bdfb1f + 4dd3eb5 commit 9969e73
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 51 deletions.
12 changes: 5 additions & 7 deletions src/rebar3.erl
Original file line number Diff line number Diff line change
Expand Up @@ -127,19 +127,17 @@ run_aux(State, RawArgs) ->
filename:join(filename:absname(rebar_state:dir(State2)), BaseDir)),

{ok, Providers} = application:get_env(rebar, providers),
{ok, Resources} = application:get_env(rebar, resources),
State4 = rebar_state:resources(State3, Resources),
State5 = rebar_plugins:install(State4),
State4 = rebar_plugins:install(State3),

%% Providers can modify profiles stored in opts, so set default after initializing providers
State6 = rebar_state:create_logic_providers(Providers, State5),
State7 = rebar_state:default(State6, rebar_state:opts(State6)),
State5 = rebar_state:create_logic_providers(Providers, State4),
State6 = rebar_state:default(State5, rebar_state:opts(State5)),

{Task, Args} = parse_args(RawArgs),

State8 = rebar_state:code_paths(State7, default, code:get_path()),
State7 = rebar_state:code_paths(State6, default, code:get_path()),

rebar_core:init_command(rebar_state:command_args(State8, Args), Task).
rebar_core:init_command(rebar_state:command_args(State7, Args), Task).

init_config() ->
%% Initialize logging system
Expand Down
7 changes: 4 additions & 3 deletions src/rebar_otp_app.erl
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ preprocess(State, AppInfo, AppSrcFile) ->
A1 = apply_app_vars(AppVars, AppData),

%% AppSrcFile may contain instructions for generating a vsn number
Vsn = app_vsn(AppSrcFile),
Vsn = app_vsn(AppSrcFile, State),
A2 = lists:keystore(vsn, 1, A1, {vsn, Vsn}),

%% systools:make_relup/4 fails with {missing_param, registered}
Expand Down Expand Up @@ -197,11 +197,12 @@ consult_app_file(Filename) ->
end
end.

app_vsn(AppFile) ->
app_vsn(AppFile, State) ->
case consult_app_file(AppFile) of
{ok, [{application, _AppName, AppData}]} ->
AppDir = filename:dirname(filename:dirname(AppFile)),
rebar_utils:vcs_vsn(get_value(vsn, AppData, AppFile), AppDir);
Resources = rebar_state:resources(State),
rebar_utils:vcs_vsn(get_value(vsn, AppData, AppFile), AppDir, Resources);
{error, Reason} ->
?ABORT("Failed to consult app file ~s: ~p\n", [AppFile, Reason])
end.
Expand Down
26 changes: 6 additions & 20 deletions src/rebar_prv_deps.erl
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,12 @@ display_dep(_State, {Name, Vsn}) when is_list(Vsn) ->
?CONSOLE("~s* (package ~s)", [ec_cnv:to_binary(Name), ec_cnv:to_binary(Vsn)]);
display_dep(_State, Name) when is_binary(Name) ->
?CONSOLE("~s* (package)", [Name]);
%% git source
display_dep(_State, {Name, Source}) when is_tuple(Source), element(1, Source) =:= git ->
?CONSOLE("~s* (git source)", [ec_cnv:to_binary(Name)]);
display_dep(_State, {Name, _Vsn, Source}) when is_tuple(Source), element(1, Source) =:= git ->
?CONSOLE("~s* (git source)", [ec_cnv:to_binary(Name)]);
display_dep(_State, {Name, _Vsn, Source, _Opts}) when is_tuple(Source), element(1, Source) =:= git ->
?CONSOLE("~s* (git soutce)", [ec_cnv:to_binary(Name)]);
%% unknown source
display_dep(_State, {Name, Source}) when is_tuple(Source) ->
?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
?CONSOLE("~s* (~s source)", [ec_cnv:to_binary(Name), type(Source)]);
display_dep(_State, {Name, _Vsn, Source}) when is_tuple(Source) ->
?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
?CONSOLE("~s* (~s source)", [ec_cnv:to_binary(Name), type(Source)]);
display_dep(_State, {Name, _Vsn, Source, _Opts}) when is_tuple(Source) ->
?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
?CONSOLE("~s* (~s source)", [ec_cnv:to_binary(Name), type(Source)]);
%% Locked
display_dep(State, {Name, Source={pkg, _, Vsn}, Level}) when is_integer(Level) ->
DepsDir = rebar_dir:deps_dir(State),
Expand All @@ -114,19 +106,13 @@ display_dep(State, {Name, Source={pkg, _, Vsn}, Level}) when is_integer(Level) -
false -> ""
end,
?CONSOLE("~s~s (locked package ~s)", [Name, NeedsUpdate, Vsn]);
display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Level), element(1, Source) =:= git ->
DepsDir = rebar_dir:deps_dir(State),
AppDir = filename:join([DepsDir, ec_cnv:to_binary(Name)]),
NeedsUpdate = case rebar_fetch:needs_update(AppDir, Source, State) of
true -> "*";
false -> ""
end,
?CONSOLE("~s~s (locked git source)", [Name, NeedsUpdate]);
display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Level) ->
DepsDir = rebar_dir:deps_dir(State),
AppDir = filename:join([DepsDir, ec_cnv:to_binary(Name)]),
NeedsUpdate = case rebar_fetch:needs_update(AppDir, Source, State) of
true -> "*";
false -> ""
end,
?CONSOLE("~s~s (locked ~p)", [Name, NeedsUpdate, Source]).
?CONSOLE("~s~s (locked ~s source)", [Name, NeedsUpdate, type(Source)]).

type(Source) when is_tuple(Source) -> element(1, Source).
28 changes: 20 additions & 8 deletions src/rebar_state.erl
Original file line number Diff line number Diff line change
Expand Up @@ -69,25 +69,28 @@

-spec new() -> t().
new() ->
#state_t{dir = rebar_dir:get_cwd()}.
BaseState = base_state(),
BaseState#state_t{dir = rebar_dir:get_cwd()}.

-spec new(list()) -> t().
new(Config) when is_list(Config) ->
BaseState = base_state(),
Deps = proplists:get_value(deps, Config, []),
Opts = dict:from_list([{{deps, default}, Deps} | Config]),
#state_t { dir = rebar_dir:get_cwd(),
default = Opts,
opts = Opts }.
BaseState#state_t { dir = rebar_dir:get_cwd(),
default = Opts,
opts = Opts }.

-spec new(t() | atom(), list()) -> t().
new(Profile, Config) when is_atom(Profile)
, is_list(Config) ->
BaseState = base_state(),
Deps = proplists:get_value(deps, Config, []),
Opts = dict:from_list([{{deps, default}, Deps} | Config]),
#state_t { dir = rebar_dir:get_cwd(),
current_profiles = [Profile],
default = Opts,
opts = Opts };
BaseState#state_t { dir = rebar_dir:get_cwd(),
current_profiles = [Profile],
default = Opts,
opts = Opts };
new(ParentState=#state_t{}, Config) ->
%% Load terms from rebar.config, if it exists
Dir = rebar_dir:get_cwd(),
Expand All @@ -113,6 +116,15 @@ new(ParentState, Config, Dir) ->
,opts=NewOpts
,default=NewOpts}.

base_state() ->
case application:get_env(rebar, resources) of
undefined ->
Resources = [];
{ok, Resources} ->
Resources
end,
#state_t{resources=Resources}.

get(State, Key) ->
{ok, Value} = dict:find(Key, State#state_t.opts),
Value.
Expand Down
51 changes: 38 additions & 13 deletions src/rebar_utils.erl
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
erl_to_mod/1,
beams/1,
find_executable/1,
vcs_vsn/2,
vcs_vsn/3,
deprecated/3,
deprecated/4,
erl_opts/1,
Expand Down Expand Up @@ -471,8 +471,8 @@ escript_foldl(Fun, Acc, File) ->
Error
end.

vcs_vsn(Vcs, Dir) ->
case vcs_vsn_cmd(Vcs, Dir) of
vcs_vsn(Vcs, Dir, Resources) ->
case vcs_vsn_cmd(Vcs, Dir, Resources) of
{plain, VsnString} ->
VsnString;
{cmd, CmdString} ->
Expand All @@ -484,23 +484,48 @@ vcs_vsn(Vcs, Dir) ->
end.

%% Temp work around for repos like relx that use "semver"
vcs_vsn_cmd(VCS, Dir) when VCS =:= semver ; VCS =:= "semver" ->
rebar_git_resource:make_vsn(Dir);
vcs_vsn_cmd(VCS, Dir) when VCS =:= git ; VCS =:= "git" ->
rebar_git_resource:make_vsn(Dir);
vcs_vsn_cmd(VCS, Dir) when VCS =:= pkg ; VCS =:= "pkg" ->
rebar_pkg_resource:make_vsn(Dir);
vcs_vsn_cmd({cmd, _Cmd}=Custom, _) ->
vcs_vsn_cmd(VCS, Dir, Resources) when VCS =:= semver ; VCS =:= "semver" ->
vcs_vsn_cmd(git, Dir, Resources);
vcs_vsn_cmd({cmd, _Cmd}=Custom, _, _) ->
Custom;
vcs_vsn_cmd(Version, _) when is_list(Version) ->
{plain, Version};
vcs_vsn_cmd(_, _) ->
vcs_vsn_cmd(VCS, Dir, Resources) when is_atom(VCS) ->
case find_resource_module(VCS, Resources) of
{ok, Module} ->
Module:make_vsn(Dir);
{error, _} ->
unknown
end;
vcs_vsn_cmd(VCS, Dir, Resources) when is_list(VCS) ->
try list_to_existing_atom(VCS) of
AVCS ->
case vcs_vsn_cmd(AVCS, Dir, Resources) of
unknown -> {plain, VCS};
Other -> Other
end
catch
error:badarg ->
{plain, VCS}
end;
vcs_vsn_cmd(_, _, _) ->
unknown.

vcs_vsn_invoke(Cmd, Dir) ->
{ok, VsnString} = rebar_utils:sh(Cmd, [{cd, Dir}, {use_stdout, false}]),
string:strip(VsnString, right, $\n).

find_resource_module(Type, Resources) ->
case lists:keyfind(Type, 1, Resources) of
false ->
case code:which(Type) of
non_existing ->
{error, unknown};
_ ->
{ok, Type}
end;
{Type, Module} ->
{ok, Module}
end.

%%
%% Filter a list of erl_opts platform_define options such that only
%% those which match the provided architecture regex are returned.
Expand Down

0 comments on commit 9969e73

Please sign in to comment.