You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 line
2.2 KiB

10 年之前
10 年之前
  1. -module(rebar_prv_lock).
  2. -behaviour(provider).
  3. -export([init/1,
  4. do/1,
  5. format_error/1]).
  6. -include("rebar.hrl").
  7. -define(PROVIDER, lock).
  8. -define(DEPS, [install_deps]).
  9. %% ===================================================================
  10. %% Public API
  11. %% ===================================================================
  12. -spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
  13. init(State) ->
  14. State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
  15. {module, ?MODULE},
  16. {bare, true},
  17. {deps, ?DEPS},
  18. {example, ""},
  19. {short_desc, "Locks dependencies."},
  20. {desc, info("Locks dependencies")},
  21. {opts, []}])),
  22. {ok, State1}.
  23. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
  24. do(State) ->
  25. case rebar_state:get(State, locks, []) of
  26. [] ->
  27. AllDeps = rebar_state:lock(State),
  28. Locks = lists:map(fun(Dep) ->
  29. Dir = rebar_app_info:dir(Dep),
  30. Source = rebar_app_info:source(Dep),
  31. %% If source is tuple it is a source dep
  32. %% e.g. {git, "git://github.com/ninenines/cowboy.git", "master"}
  33. {rebar_app_info:name(Dep)
  34. ,rebar_fetch:lock_source(Dir, Source)
  35. ,rebar_app_info:dep_level(Dep)}
  36. end, AllDeps),
  37. Dir = rebar_state:dir(State),
  38. file:write_file(filename:join(Dir, "rebar.lock"), io_lib:format("~p.~n", [Locks])),
  39. {ok, rebar_state:set(State, locks, Locks)};
  40. _Locks ->
  41. {ok, State}
  42. end.
  43. -spec format_error(any()) -> iolist().
  44. format_error(Reason) ->
  45. io_lib:format("~p", [Reason]).
  46. info(_) ->
  47. "".