mirror of
https://github.com/correl/rebar.git
synced 2024-11-23 19:19:54 +00:00
Removing 'install' command; semantics were poorly defined could damage a typical OTP installation
This commit is contained in:
parent
24cc775e88
commit
51ed787290
1 changed files with 1 additions and 80 deletions
|
@ -27,8 +27,7 @@
|
|||
-module(rebar_otp_app).
|
||||
|
||||
-export([compile/2,
|
||||
clean/2,
|
||||
install/2]).
|
||||
clean/2]).
|
||||
|
||||
-include("rebar.hrl").
|
||||
|
||||
|
@ -67,88 +66,10 @@ clean(_Config, File) ->
|
|||
end.
|
||||
|
||||
|
||||
install(Config, File) ->
|
||||
%% If we get an .app.src file, it needs to be pre-processed and
|
||||
%% written out as a ebin/*.app file. That resulting file will then
|
||||
%% be validated as usual.
|
||||
case rebar_app_utils:is_app_src(File) of
|
||||
true ->
|
||||
AppFile = preprocess(File);
|
||||
false ->
|
||||
AppFile = File
|
||||
end,
|
||||
|
||||
%% Load the app name and version from the .app file and construct
|
||||
%% the app identifier
|
||||
{ok, AppName, AppData} = rebar_app_utils:load_app_file(AppFile),
|
||||
|
||||
%% Validate the .app file prior to installation
|
||||
validate_name(AppName, AppFile),
|
||||
validate_modules(AppName, proplists:get_value(modules, AppData)),
|
||||
|
||||
%% Get the target directory. The user can specify a target= directory
|
||||
%% on the command line for convenience, or it defaults to the Erlang
|
||||
%% install dir
|
||||
TargetDir = rebar_config:get_global(target, code:lib_dir()),
|
||||
|
||||
%% Pull out the vsn and construct identifier
|
||||
Vsn = proplists:get_value(vsn, AppData),
|
||||
AppId = ?FMT("~s-~s", [AppName, Vsn]),
|
||||
?CONSOLE("Installing: ~s to ~s\n", [AppId, TargetDir]),
|
||||
|
||||
%% Check the erlang lib directory to see if this app identifier
|
||||
%% is already present.
|
||||
AppDir = filename:join([TargetDir, AppId]),
|
||||
case filelib:is_dir(AppDir) of
|
||||
true ->
|
||||
%% Already exists -- check for force=1 global flag and only
|
||||
%% continue if it's set
|
||||
case rebar_config:get_global(force, "0") of
|
||||
"0" ->
|
||||
?ERROR("~s already exists. Installation failed.\n", [AppId]),
|
||||
?FAIL;
|
||||
"1" ->
|
||||
?WARN("~s already exists, but forcibly overwriting.\n", [AppId])
|
||||
end;
|
||||
false ->
|
||||
ok
|
||||
end,
|
||||
|
||||
%% Wipe out any previous versions
|
||||
ok = rebar_file_utils:rm_rf(AppDir),
|
||||
|
||||
%% Re-create target
|
||||
ok = rebar_file_utils:mkdir_p(AppDir),
|
||||
|
||||
%% By default we copy the ebin, include, src and priv directories (if they exist)
|
||||
Files = [F || F <- ["ebin", "src", "priv", "include"],
|
||||
filelib:last_modified(F) /= 0],
|
||||
ok = rebar_file_utils:cp_r(Files, AppDir),
|
||||
|
||||
%% Check the config to see if we have any binaries that need to be
|
||||
%% linked into the erlang path
|
||||
case rebar_config:get_list(Config, app_bin, []) of
|
||||
[] ->
|
||||
ok;
|
||||
List ->
|
||||
%% code:root_dir() gives $OTPROOT/lib/erlang on a stock install
|
||||
%% so find the bin dir relative to that.
|
||||
BinDir = filename:join([code:root_dir(), "..", "..", "bin"]),
|
||||
install_binaries(List, AppDir, BinDir)
|
||||
end.
|
||||
|
||||
|
||||
%% ===================================================================
|
||||
%% Internal functions
|
||||
%% ===================================================================
|
||||
|
||||
install_binaries([], _AppDir, _BinDir) ->
|
||||
ok;
|
||||
install_binaries([Bin | Rest], AppDir, BinDir) ->
|
||||
FqBin = filename:join([AppDir, Bin]),
|
||||
rebar_file_utils:ln_sf(FqBin, BinDir),
|
||||
install_binaries(Rest, AppDir, BinDir).
|
||||
|
||||
preprocess(AppSrcFile) ->
|
||||
case rebar_app_utils:load_app_file(AppSrcFile) of
|
||||
{ok, AppName, AppData} ->
|
||||
|
|
Loading…
Reference in a new issue