diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rebar_erlc_compiler.erl | 29 | ||||
| -rw-r--r-- | src/rebar_otp_app.erl | 22 | ||||
| -rw-r--r-- | src/rebar_prv_dialyzer.erl | 6 | ||||
| -rw-r--r-- | src/rebar_templater.erl | 31 | 
4 files changed, 54 insertions, 34 deletions
| diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index c757511..a113fc4 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -256,24 +256,21 @@ needs_compile(Source, Target, Opts, Parents) ->  source_changed(TargetLastMod, I) -> TargetLastMod < filelib:last_modified(I). -opts_changed(Opts, Target) -> -    Basename = filename:basename(Target, ".beam"), -    Dirname = filename:dirname(Target), -    ObjectFile = filename:join([Dirname, Basename]), -    _ = purge(list_to_atom(Basename)), -    case code:load_abs(ObjectFile) of -        {module, Mod} -> -            Compile = Mod:module_info(compile), -            lists:sort(Opts) =/= lists:sort(proplists:get_value(options, -                                                                Compile)); -        {error, nofile} -> false +opts_changed(NewOpts, Target) -> +    case compile_info(Target) of +        {ok, Opts} -> lists:sort(Opts) =/= lists:sort(NewOpts); +        _          -> true      end. -purge(Mod) -> -    %% remove old code if necessary -    _ = code:purge(Mod), -    %% move current code to old -    _ = code:delete(Mod). +compile_info(Target) -> +    case beam_lib:chunks(Target, [compile_info]) of +        {ok, {_mod, Chunks}} -> +            CompileInfo = proplists:get_value(compile_info, Chunks, []), +            {ok, proplists:get_value(options, CompileInfo, [])}; +        {error, beam_lib, Reason} -> +            ?WARN("Couldn't read debug info from ~p for reason: ~p", [Target, Reason]), +            {error, Reason} +    end.  check_erlcinfo(_Config, #erlcinfo{vsn=?ERLCINFO_VSN}) ->      ok; diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl index e850e58..2b5f682 100644 --- a/src/rebar_otp_app.erl +++ b/src/rebar_otp_app.erl @@ -166,23 +166,15 @@ ebin_modules(App, Dir) ->      [rebar_utils:beam_to_mod(N) || N <- Filtered].  beam_src(Beam) -> -    try -        Mod = list_to_atom(filename:basename(Beam, ".beam")), -        _ = purge(Mod), -        {module, Mod} = code:load_abs(filename:rootname(Beam, ".beam")), -        Compile = Mod:module_info(compile), -        proplists:get_value(source, Compile, []) -    catch -        error:undef -> []; -        error:nofile -> [] +    case beam_lib:chunks(Beam, [compile_info]) of +        {ok, {_mod, Chunks}} -> +            CompileInfo = proplists:get_value(compile_info, Chunks, []), +            proplists:get_value(source, CompileInfo, []); +        {error, beam_lib, Reason} -> +            ?WARN("Couldn't read debug info from ~p for reason: ~p", [Beam, Reason]), +            []      end. -purge(Mod) -> -    %% remove old code if necessary -    _ = code:purge(Mod), -    %% move current code to old -    _ = code:delete(Mod). -  ensure_registered(AppData) ->      case lists:keyfind(registered, 1, AppData) of          false -> diff --git a/src/rebar_prv_dialyzer.erl b/src/rebar_prv_dialyzer.erl index 4b6812f..e7275c7 100644 --- a/src/rebar_prv_dialyzer.erl +++ b/src/rebar_prv_dialyzer.erl @@ -143,6 +143,8 @@ get_plt_files([AppName | DepApps], Apps, PltApps, Files) ->              get_plt_files(DepApps, Apps, PltApps, Files);          false ->              {DepApps2, Files2} = app_name_to_info(AppName), +            ?DEBUG("~s dependencies: ~p", [AppName, DepApps2]), +            ?DEBUG("~s files: ~p", [AppName, Files2]),              DepApps3 = DepApps2 ++ DepApps,              Files3 = Files2 ++ Files,              get_plt_files(DepApps3, Apps, [AppName | PltApps], Files3) @@ -191,6 +193,7 @@ search_ebin(AppName) ->  ebin_to_info(EbinDir, AppName) ->      AppFile = filename:join(EbinDir, atom_to_list(AppName) ++ ".app"), +    ?DEBUG("Consulting app file ~p", [AppFile]),      case file:consult(AppFile) of          {ok, [{application, AppName, AppDetails}]} ->              DepApps = proplists:get_value(applications, AppDetails, []), @@ -247,7 +250,6 @@ check_plt(State, Plt, OldList, FilesList) ->      {CheckWarnings, State2} = check_plt(State1, Plt, sets:to_list(Check)),      Add = sets:subtract(Files, Old),      {AddWarnings, State3} = add_plt(State2, Plt, sets:to_list(Add)), -    ?DEBUG("~p", [[RemWarnings, CheckWarnings, AddWarnings]]),      {RemWarnings + CheckWarnings + AddWarnings, State3}.  remove_plt(State, _Plt, []) -> @@ -366,6 +368,7 @@ run_dialyzer(State, Opts) ->              Opts2 = [{warnings, WarningsList},                       {check_plt, false} |                       Opts], +            ?DEBUG("Running dialyzer with options: ~p~n", [Opts2]),              {Unknowns, Warnings} = format_warnings(dialyzer:run(Opts2)),              _ = [?CONSOLE("~s", [Unknown]) || Unknown <- Unknowns],              _ = [?CONSOLE("~s", [Warning]) || Warning <- Warnings], @@ -374,6 +377,7 @@ run_dialyzer(State, Opts) ->              Opts2 = [{warnings, no_warnings()},                       {check_plt, false} |                       Opts], +            ?DEBUG("Running dialyzer with options: ~p~n", [Opts2]),              _ = dialyzer:run(Opts2),              {0, State}      end. diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl index edfe3bd..588f5b2 100644 --- a/src/rebar_templater.erl +++ b/src/rebar_templater.erl @@ -132,14 +132,41 @@ override_vars([{Var, Default, Doc} | Rest], General) ->  %% Default variables, generated dynamically.  default_variables() -> +    {DefaultAuthor, DefaultEmail} = default_author_and_email(),      {{Y,M,D},{H,Min,S}} = calendar:universal_time(),      [{date, lists:flatten(io_lib:format("~4..0w-~2..0w-~2..0w",[Y,M,D]))},       {datetime, lists:flatten(io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w+00:00",[Y,M,D,H,Min,S]))}, -     {author_name, "Anonymous"}, -     {author_email, "anonymous@example.org"}, +     {author_name, DefaultAuthor}, +     {author_email, DefaultEmail},       {copyright_year, integer_to_list(Y)},       {apps_dir, "apps", "Directory where applications will be created if needed"}]. +default_author_and_email() -> +    %% See if we can get a git user and email to use as defaults +    case rebar_utils:sh("git config --global user.name", []) of +        {ok, Name} -> +            case rebar_utils:sh("git config --global user.email", []) of +                {ok, Email} -> +                    {string:strip(Name, both, $\n), string:strip(Email, both, $\n)}; +                {error, _} -> +                    %% Use neither if one doesn't exist +                    {"Anonymous", "anonymous@example.org"} +            end; +        {error, _} -> +            %% Ok, try mecurial +            case rebar_utils:sh("hg showconfig ui.username", []) of +                {ok, NameEmail} -> +                    case re:run(NameEmail, [{capture, [1,2], list}]) of +                        {match, [Name, Email]} -> +                            {Name, Email}; +                        _ -> +                            {"Anonymous", "anonymous@example.org"} +                    end; +                {error, _} -> +                    {"Anonymous", "anonymous@example.org"} +            end +    end. +  %% Load variable definitions from the 'Globals' file in the home template  %% directory  global_variables(State) -> | 
