summaryrefslogtreecommitdiff
path: root/src/rebar_utils.erl
diff options
context:
space:
mode:
authorTristan Sloughter <t@crashfast.com>2015-05-07 18:36:15 -0500
committerTristan Sloughter <t@crashfast.com>2015-05-07 18:36:15 -0500
commitc7281abb309283011bd2ef9cdf8da54ddd858aa1 (patch)
tree0a1fe31b0cfbb2ee0f3bdfb0fc0c7b3cb6cbc46c /src/rebar_utils.erl
parentb3d444ef67f91815d4ac12a393b5e905b01ebcc3 (diff)
parent3edede54e759f8494981bb2e6380b7eee437b7f3 (diff)
Merge branch 'fix_windows_bootstrap' of https://github.com/ingwinlu/rebar3 into ingwinlu-fix_windows_bootstrap
Diffstat (limited to 'src/rebar_utils.erl')
-rw-r--r--src/rebar_utils.erl59
1 files changed, 45 insertions, 14 deletions
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 49f7ad7..4f0bc80 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -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,
@@ -53,7 +53,8 @@
get_arch/0,
wordsize/0,
tup_umerge/2,
- tup_sort/1]).
+ tup_sort/1,
+ line_count/1]).
%% for internal use only
-export([otp_release/0]).
@@ -281,6 +282,11 @@ umerge([], Olds, Merged, CmpMerged, Cmp) when CmpMerged == Cmp ->
umerge([], Olds, Merged, _CmpMerged, Cmp) ->
lists:reverse(Olds, [Cmp | Merged]).
+%% Implements wc -l functionality used to determine patchcount from git output
+line_count(PatchLines) ->
+ Tokenized = string:tokens(PatchLines, "\n"),
+ {ok, length(Tokenized)}.
+
%% ====================================================================
%% Internal functions
%% ====================================================================
@@ -471,8 +477,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} ->
@@ -484,23 +490,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.