From 05e22e4d5c831888450bfc15e88dc2882b837d6c Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Thu, 9 Jul 2015 13:01:13 +0000 Subject: Fix reporting of error:undef exceptions The wide-cast catching of undef errors would make it so any provider calling an undefined function would be reported as a missing 'do' for the provider. This patch inspects the stacktrace to know if `Provider:do/1` is indeed the missing callback, and reports the rest properly. --- src/rebar_core.erl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rebar_core.erl b/src/rebar_core.erl index b1647f0..f097429 100644 --- a/src/rebar_core.erl +++ b/src/rebar_core.erl @@ -128,9 +128,15 @@ do([ProviderName | Rest], State) -> {error, Error} catch error:undef -> - %% This should really only happen if a plugin provider doesn't export do/1 - ?DEBUG("Undefined call to provider's do function:~n~p", [erlang:get_stacktrace()]), - ?PRV_ERROR({bad_provider_namespace, ProviderName}); + Stack = erlang:get_stacktrace(), + case Stack of + [{ProviderName, do, [_], _}|_] -> + %% This should really only happen if a plugin provider doesn't export do/1 + ?DEBUG("Undefined call to provider's do/1 function:~n~p", [Stack]), + ?PRV_ERROR({bad_provider_namespace, ProviderName}); + _ -> % re-raise + erlang:raise(error, undef, Stack) + end; error:{badrecord,provider} -> {error, ProviderName} end. -- cgit v1.1