summaryrefslogtreecommitdiff
path: root/src/rebar_utils.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_utils.erl')
-rw-r--r--src/rebar_utils.erl104
1 files changed, 69 insertions, 35 deletions
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 49f7ad7..160d547 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
%% ====================================================================
@@ -298,27 +304,30 @@ otp_release1([$R,N|_]=Rel) when is_integer(N) ->
%% the "\n".
otp_release1(Rel) ->
File = filename:join([code:root_dir(), "releases", Rel, "OTP_VERSION"]),
- {ok, Vsn} = file:read_file(File),
-
- %% It's fine to rely on the binary module here because we can
- %% be sure that it's available when the otp_release string does
- %% not begin with $R.
- Size = byte_size(Vsn),
- %% The shortest vsn string consists of at least two digits
- %% followed by "\n". Therefore, it's safe to assume Size >= 3.
- case binary:part(Vsn, {Size, -3}) of
- <<"**\n">> ->
- %% The OTP documentation mentions that a system patched
- %% using the otp_patch_apply tool available to licensed
- %% customers will leave a '**' suffix in the version as a
- %% flag saying the system consists of application versions
- %% from multiple OTP versions. We ignore this flag and
- %% drop the suffix, given for all intents and purposes, we
- %% cannot obtain relevant information from it as far as
- %% tooling is concerned.
- binary:bin_to_list(Vsn, {0, Size - 3});
- _ ->
- binary:bin_to_list(Vsn, {0, Size - 1})
+ case file:read_file(File) of
+ {error, _} ->
+ Rel;
+ {ok, Vsn} ->
+ %% It's fine to rely on the binary module here because we can
+ %% be sure that it's available when the otp_release string does
+ %% not begin with $R.
+ Size = byte_size(Vsn),
+ %% The shortest vsn string consists of at least two digits
+ %% followed by "\n". Therefore, it's safe to assume Size >= 3.
+ case binary:part(Vsn, {Size, -3}) of
+ <<"**\n">> ->
+ %% The OTP documentation mentions that a system patched
+ %% using the otp_patch_apply tool available to licensed
+ %% customers will leave a '**' suffix in the version as a
+ %% flag saying the system consists of application versions
+ %% from multiple OTP versions. We ignore this flag and
+ %% drop the suffix, given for all intents and purposes, we
+ %% cannot obtain relevant information from it as far as
+ %% tooling is concerned.
+ binary:bin_to_list(Vsn, {0, Size - 3});
+ _ ->
+ binary:bin_to_list(Vsn, {0, Size - 1})
+ end
end.
%% We do the shell variable substitution ourselves on Windows and hope that the
@@ -471,8 +480,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 +493,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.