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.

135 line
5.8 KiB

10 年之前
  1. -module(rebar_prv_deps).
  2. -behaviour(provider).
  3. -export([init/1,
  4. do/1,
  5. format_error/1]).
  6. -include("rebar.hrl").
  7. -define(PROVIDER, deps).
  8. -define(DEPS, [app_discovery]).
  9. -spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
  10. init(State) ->
  11. State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
  12. {module, ?MODULE},
  13. {bare, true},
  14. {deps, ?DEPS},
  15. {example, "rebar3 deps"},
  16. {short_desc, "List dependencies"},
  17. {desc, info("List dependencies")},
  18. {opts, []}])),
  19. {ok, State1}.
  20. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
  21. do(State) ->
  22. Profiles = rebar_state:current_profiles(State),
  23. List = [{Profile, rebar_state:get(State, {deps, Profile}, [])}
  24. || Profile <- Profiles],
  25. [display(State, Profile, Deps) || {Profile, Deps} <- List],
  26. {ok, State}.
  27. -spec format_error(any()) -> iolist().
  28. format_error(Reason) ->
  29. io_lib:format("~p", [Reason]).
  30. display(State, default, Deps) ->
  31. NewDeps = merge(Deps, rebar_state:get(State, deps, [])),
  32. display_deps(State, NewDeps),
  33. ?CONSOLE("", []);
  34. display(State, Profile, Deps) ->
  35. ?CONSOLE("-- ~p --", [Profile]),
  36. display_deps(State, Deps),
  37. ?CONSOLE("", []).
  38. merge(Deps, Deps) ->
  39. Deps;
  40. merge(Deps, SourceDeps) ->
  41. ToAdd = [Dep || Dep <- SourceDeps,
  42. not lists:keymember(ec_cnv:to_binary(element(1,Dep)), 1, Deps)],
  43. Deps ++ ToAdd.
  44. display_deps(State, Deps) ->
  45. lists:foreach(fun(Dep) -> display_dep(State, Dep) end, Deps).
  46. %% packages
  47. display_dep(_State, {Name, Vsn}) when is_list(Vsn) ->
  48. ?CONSOLE("~s* (package ~s)", [ec_cnv:to_binary(Name), ec_cnv:to_binary(Vsn)]);
  49. display_dep(_State, Name) when is_atom(Name) ->
  50. ?CONSOLE("~s* (package)", [ec_cnv:to_binary(Name)]);
  51. %% git source
  52. display_dep(_State, {Name, Source}) when is_tuple(Source), element(1, Source) =:= git ->
  53. ?CONSOLE("~s* (git source)", [ec_cnv:to_binary(Name)]);
  54. display_dep(_State, {Name, _Vsn, Source}) when is_tuple(Source), element(1, Source) =:= git ->
  55. ?CONSOLE("~s* (git source)", [ec_cnv:to_binary(Name)]);
  56. display_dep(_State, {Name, _Vsn, Source, _Opts}) when is_tuple(Source), element(1, Source) =:= git ->
  57. ?CONSOLE("~s* (git soutce)", [ec_cnv:to_binary(Name)]);
  58. %% unknown source
  59. display_dep(_State, {Name, Source}) when is_tuple(Source) ->
  60. ?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
  61. display_dep(_State, {Name, _Vsn, Source}) when is_tuple(Source) ->
  62. ?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
  63. display_dep(_State, {Name, _Vsn, Source, _Opts}) when is_tuple(Source) ->
  64. ?CONSOLE("~s* (source ~p)", [ec_cnv:to_binary(Name), Source]);
  65. %% Locked
  66. display_dep(State, {Name, Source={pkg, _, Vsn, _}, Level}) when is_integer(Level) ->
  67. DepsDir = rebar_dir:deps_dir(State),
  68. AppDir = filename:join([DepsDir, ec_cnv:to_binary(Name)]),
  69. NeedsUpdate = case rebar_fetch:needs_update(AppDir, Source) of
  70. true -> "*";
  71. false -> ""
  72. end,
  73. ?CONSOLE("~s~s (locked package ~s)", [Name, NeedsUpdate, Vsn]);
  74. display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Level), element(1, Source) =:= git ->
  75. DepsDir = rebar_dir:deps_dir(State),
  76. AppDir = filename:join([DepsDir, ec_cnv:to_binary(Name)]),
  77. NeedsUpdate = case rebar_fetch:needs_update(AppDir, Source) of
  78. true -> "*";
  79. false -> ""
  80. end,
  81. ?CONSOLE("~s~s (locked git source)", [Name, NeedsUpdate]);
  82. display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Level) ->
  83. DepsDir = rebar_dir:deps_dir(State),
  84. AppDir = filename:join([DepsDir, ec_cnv:to_binary(Name)]),
  85. NeedsUpdate = case rebar_fetch:needs_update(AppDir, Source) of
  86. true -> "*";
  87. false -> ""
  88. end,
  89. ?CONSOLE("~s~s (locked ~p)", [Name, NeedsUpdate, Source]).
  90. info(Description) ->
  91. io_lib:format("~s.~n"
  92. "~n"
  93. "Valid rebar.config options:~n"
  94. " ~p~n"
  95. " ~p~n"
  96. "Valid command line options:~n"
  97. " deps_dir=\"deps\" (override default or rebar.config deps_dir)~n",
  98. [
  99. Description,
  100. {deps_dir, "deps"},
  101. {deps,
  102. [app_name,
  103. {rebar, "1.0.*"},
  104. {rebar, ".*",
  105. {git, "git://github.com/rebar/rebar.git"}},
  106. {rebar, ".*",
  107. {git, "git://github.com/rebar/rebar.git", "Rev"}},
  108. {rebar, "1.0.*",
  109. {git, "git://github.com/rebar/rebar.git", {branch, "master"}}},
  110. {rebar, "1.0.0",
  111. {git, "git://github.com/rebar/rebar.git", {tag, "1.0.0"}}},
  112. {rebar, "",
  113. {git, "git://github.com/rebar/rebar.git", {branch, "master"}},
  114. [raw]},
  115. {app_name, ".*", {hg, "https://www.example.org/url"}},
  116. {app_name, ".*", {rsync, "Url"}},
  117. {app_name, ".*", {svn, "https://www.example.org/url"}},
  118. {app_name, ".*", {svn, "svn://svn.example.org/url"}},
  119. {app_name, ".*", {bzr, "https://www.example.org/url", "Rev"}},
  120. {app_name, ".*", {fossil, "https://www.example.org/url"}},
  121. {app_name, ".*", {fossil, "https://www.example.org/url", "Vsn"}},
  122. {app_name, ".*", {p4, "//depot/subdir/app_dir"}}]}
  123. ]).