-module(rebar3_hex_utils). -export([update_app_src/2 ,select_apps/1 ,hex_home/0 ,binarify/1 ,expand_paths/2]). -define(DEFAULT_HEX_DIR, ".hex"). update_app_src(App, Version) -> AppSrcFile = rebar_app_info:app_file_src(App), AppSrc = rebar_file_utils:try_consult(AppSrcFile), [{application, Name, Details}] = AppSrc, NewDetails = lists:keyreplace(vsn, 1, Details, {vsn, ec_cnv:to_list(Version)}), {application, Name, NewDetails}. select_apps([App]) -> [App]; select_apps(Apps) -> ec_talk:say("Select application(s):", []), lists:foldl(fun(App, Idx) -> ec_talk:say("~p) ~s", [Idx, rebar_app_info:name(App)]), Idx+1 end, 1, Apps), ec_talk:say("------------", []), ec_talk:say("A) All", []), case ec_talk:ask_default(io_lib:format("[1-~p] or (A)ll ", [length(Apps)]), string, "A") of "A" -> Apps; Index -> [lists:nth(list_to_integer(Index), Apps)] end. hex_home() -> {ok, [[Home]]} = init:get_argument(home), filename:join(Home, ?DEFAULT_HEX_DIR). binarify(Term) when is_boolean(Term) -> Term; binarify(Term) when is_atom(Term) -> atom_to_binary(Term, utf8); binarify([]) -> []; binarify(Term) when is_list(Term) -> case io_lib:printable_list(Term) of true -> list_to_binary(Term); false -> [binarify(X) || X <- Term] end; binarify({Key, Value}) -> {binarify(Key), binarify(Value)}; binarify(Term) -> Term. expand_paths(Paths, Dir) -> AbsDir = filename:absname(Dir), Files = lists:flatmap(fun dir_files1/1, [filename:join(Dir, P) || P <- Paths]), [{F1 -- (AbsDir++"/"), F1} || F1 <- filter_regular(Files)]. dir_files1(Dir) -> lists:flatmap(fun(Y) -> dir_files(Y) end, filelib:wildcard(Dir)). filter_regular(Files) -> lists:filter(fun filelib:is_regular/1, [filename:absname(F) || F <- Files]). dir_files(Path) -> case filelib:is_dir(Path) of true -> filelib:wildcard(filename:join(Path, "**")); false -> [Path] end.