summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rebar_git_resource.erl28
-rw-r--r--src/rebar_resource_v2.erl3
-rw-r--r--src/rebar_utils.erl10
3 files changed, 36 insertions, 5 deletions
diff --git a/src/rebar_git_resource.erl b/src/rebar_git_resource.erl
index ac1316b..4e81c05 100644
--- a/src/rebar_git_resource.erl
+++ b/src/rebar_git_resource.erl
@@ -236,7 +236,17 @@ git_vsn_fetch() ->
end.
make_vsn(AppInfo, _) ->
- make_vsn_(rebar_app_info:dir(AppInfo)).
+ Dir = rebar_app_info:dir(AppInfo),
+ case rebar_app_info:original_vsn(AppInfo) of
+ {git, short} ->
+ git_ref(Dir, "--short");
+ {git, long} ->
+ git_ref(Dir, "");
+ _ ->
+ %% already parsed in rebar_utils to get here so we know it
+ %% is either for git or "git"
+ make_vsn_(Dir)
+ end.
make_vsn_(Dir) ->
case collect_default_refcount(Dir) of
@@ -248,6 +258,19 @@ make_vsn_(Dir) ->
%% Internal functions
+git_ref(Dir, Arg) ->
+ case rebar_utils:sh("git rev-parse " ++ Arg ++ " HEAD",
+ [{use_stdout, false},
+ return_on_error,
+ {cd, Dir}]) of
+ {error, _} ->
+ ?WARN("Getting ref of git repo failed in ~ts. "
+ "Falling back to version 0", [Dir]),
+ {plain, "0"};
+ {ok, String} ->
+ {plain, rebar_string:trim(String, both, "\n")}
+ end.
+
collect_default_refcount(Dir) ->
%% Get the tag timestamp and minimal ref from the system. The
%% timestamp is really important from an ordering perspective.
@@ -256,7 +279,8 @@ collect_default_refcount(Dir) ->
return_on_error,
{cd, Dir}]) of
{error, _} ->
- ?WARN("Getting log of git dependency failed in ~ts. Falling back to version 0.0.0", [rebar_dir:get_cwd()]),
+ ?WARN("Getting log of git repo failed in ~ts. "
+ "Falling back to version 0.0.0", [Dir]),
{plain, "0.0.0"};
{ok, String} ->
RawRef = rebar_string:trim(String, both, "\n"),
diff --git a/src/rebar_resource_v2.erl b/src/rebar_resource_v2.erl
index b7ee760..537b5f0 100644
--- a/src/rebar_resource_v2.erl
+++ b/src/rebar_resource_v2.erl
@@ -101,7 +101,8 @@ needs_update(AppInfo, State) ->
resource_run(needs_update, rebar_app_info:source(AppInfo), [AppInfo], State).
%% this is a special case since it is used for project apps as well, not just deps
-make_vsn(AppInfo, VcsType, State) ->
+make_vsn(AppInfo, Vsn, State) ->
+ VcsType = case Vsn of {T, _} -> T; T -> T end,
Resources = rebar_state:resources(State),
case is_resource_type(VcsType, Resources) of
true ->
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index f1e440a..c920e46 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -729,7 +729,7 @@ vcs_vsn(AppInfo, Vcs, State) ->
{plain, VsnString} ->
VsnString;
{cmd, CmdString} ->
- vcs_vsn_invoke(CmdString, rebar_app_info:dir(AppInfo));
+ cmd_vsn_invoke(CmdString, rebar_app_info:dir(AppInfo));
unknown ->
?ABORT("vcs_vsn: Unknown vsn format: ~p", [Vcs]);
{error, Reason} ->
@@ -743,8 +743,14 @@ vcs_vsn_cmd(AppInfo, VCS, State) when VCS =:= semver ; VCS =:= "semver" ->
vcs_vsn_cmd(AppInfo, git, State);
vcs_vsn_cmd(_AppInfo, {cmd, _Cmd}=Custom, _) ->
Custom;
+vcs_vsn_cmd(AppInfo, {file, File}, _) ->
+ Path = filename:join(rebar_app_info:dir(AppInfo), File),
+ {ok, Vsn} = file:read_file(Path),
+ {plain, to_list(rebar_string:trim(Vsn))};
vcs_vsn_cmd(AppInfo, VCS, State) when is_atom(VCS) ->
rebar_resource_v2:make_vsn(AppInfo, VCS, State);
+vcs_vsn_cmd(AppInfo, {VCS, _}=V, State) when is_atom(VCS) ->
+ rebar_resource_v2:make_vsn(AppInfo, V, State);
vcs_vsn_cmd(AppInfo, VCS, State) when is_list(VCS) ->
try list_to_existing_atom(VCS) of
AVCS ->
@@ -759,7 +765,7 @@ vcs_vsn_cmd(AppInfo, VCS, State) when is_list(VCS) ->
vcs_vsn_cmd(_, _, _) ->
unknown.
-vcs_vsn_invoke(Cmd, Dir) ->
+cmd_vsn_invoke(Cmd, Dir) ->
{ok, VsnString} = rebar_utils:sh(Cmd, [{cd, Dir}, {use_stdout, false}]),
rebar_string:trim(VsnString, trailing, "\n").