From 9f83329a3cb45ddc33c600e413bc7fc0f9ffd2ca Mon Sep 17 00:00:00 2001 From: Dave Smith Date: Thu, 31 Dec 2009 19:29:48 -0700 Subject: [PATCH] Adding basic distclean functionality to deps --- src/rebar_deps.erl | 50 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/rebar_deps.erl b/src/rebar_deps.erl index 02a34d6..b4bf267 100644 --- a/src/rebar_deps.erl +++ b/src/rebar_deps.erl @@ -26,26 +26,45 @@ -include("rebar.hrl"). --export([preprocess/2]). +-export([preprocess/2, + distclean/2]). %% =================================================================== %% Public API %% =================================================================== preprocess(Config, _) -> - %% Get the directory where we will place downloaded deps - DepsDir = rebar_config:get(Config, deps_dir, "deps"), + %% Get the directory where we will place downloaded deps. Take steps + %% to ensure that if we're doing a multi-level build, all the deps will + %% wind up in a single directory; avoiding potential pain from having + %% multiple copies of the same dep scattered throughout the source tree. + %% + %% The first definition of deps_dir is the one we use; we also fully + %% qualify it to ensure everyone sees it properly. + case rebar_config:get_all(Config, deps_dir) of + [] -> + DepsDir = filename:absname("deps"); + AllDirs -> + DepsDir = filename:absname(hd(lists:reverse(AllDirs))) + end, - %% Process the list of deps from the configuration - case catch(process_deps(rebar_config:get(Config, deps, []), [], DepsDir)) of + ?DEBUG("~s: Using deps dir: ~s\n", [rebar_utils:get_cwd(), DepsDir]), + Config2 = rebar_config:set(Config, deps_dir, DepsDir), + + %% Process the list of local deps from the configuration + case catch(process_deps(rebar_config:get_local(Config, deps, []), [], DepsDir)) of Dirs when is_list(Dirs) -> - %% Filter out deps from config so sub-dirs don't wind up trying to d/l deps again - Config2 = rebar_config:delete(Config, deps), {ok, Config2, Dirs}; {'EXIT', Reason} -> ?ABORT("Error while processing dependencies: ~p\n", [Reason]) end. +distclean(Config, _) -> + %% Delete all the deps which we downloaded (or would have caused to be + %% downloaded). + DepsDir = rebar_config:get(Config, deps_dir, rebar_utils:get_cwd()), + ?DEBUG("Delete deps: ~p\n", [rebar_config:get(Config, deps, [])]), + delete_deps(rebar_config:get_local(Config, deps, []), DepsDir). %% =================================================================== %% Internal functions @@ -60,7 +79,6 @@ process_deps([{App, VsnRegex} | Rest], Acc, Dir) when is_atom(App) -> require_app(App, VsnRegex), process_deps(Rest, Acc, Dir); process_deps([{App, VsnRegex, Source} | Rest], Acc, Dir) -> - ?DEBUG("Process deps: ~p\n", [Rest]), case is_app_available(App, VsnRegex) of true -> process_deps(Rest, Acc, Dir); @@ -78,6 +96,22 @@ process_deps([Other | _Rest], _Acc, _Dir) -> [Other, rebar_utils:get_cwd()]). +delete_deps([], _DepsDir) -> + ok; +delete_deps([{App, _VsnRegex, _Source} | Rest], DepsDir) -> + AppDir = filename:join(DepsDir, App), + case filelib:is_dir(AppDir) of + true -> + ?INFO("Delete dependency dir ~s\n", [AppDir]), + rebar_file_utils:rm_rf(AppDir); + false -> + ok + end, + delete_deps(Rest, DepsDir); +delete_deps([_Other | Rest], DepsDir) -> + delete_deps(Rest, DepsDir). + + require_app(App, VsnRegex) -> case is_app_available(App, VsnRegex) of