mad_utils.erl 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. -module(mad_utils).
  2. -export([cwd/0]).
  3. -export([exec/2]).
  4. -export([concat/1]).
  5. -export([home/0]).
  6. -export([rebar_conf_file/1]).
  7. -export([src/1]).
  8. -export([include/1]).
  9. -export([ebin/1]).
  10. -export([consult/1]).
  11. -export([deps/1]).
  12. -export([get_value/3]).
  13. -export([script/2]).
  14. -export([sub_dirs/2]).
  15. -export([lib_dirs/2]).
  16. -export([https_to_git/1]).
  17. -export([git_to_https/1]).
  18. %% get current working directory
  19. cwd() ->
  20. {ok, Cwd} = file:get_cwd(),
  21. Cwd.
  22. %% execute a shell command
  23. exec(Cmd, Opts) ->
  24. Opts1 = [concat([" ", X]) || X <- Opts],
  25. os:cmd(concat([Cmd, concat(Opts1)])).
  26. concat(L) ->
  27. lists:concat(L).
  28. %% return $HOME
  29. home() ->
  30. %% ~/
  31. {ok, [[H|_]]} = init:get_argument(home),
  32. H.
  33. rebar_conf_file(X) ->
  34. filename:absname(filename:join(X, "rebar.config")).
  35. src(X) ->
  36. %% X/src
  37. filename:join(X, "src").
  38. include(X) ->
  39. %% X/include
  40. filename:join(X, "include").
  41. ebin(X) ->
  42. %% X/ebin
  43. filename:join(X, "ebin").
  44. consult(File) ->
  45. AbsFile = filename:absname(File),
  46. case file:consult(AbsFile) of
  47. {ok, V} ->
  48. V;
  49. _ ->
  50. []
  51. end.
  52. deps(File) ->
  53. get_value(deps, consult(File), []).
  54. get_value(Key, Opts, Default) ->
  55. case lists:keyfind(Key, 1, Opts) of
  56. {Key, Value} ->
  57. Value;
  58. _ -> Default
  59. end.
  60. script(Dir, Conf) ->
  61. File = filename:join(Dir, "rebar.config.script"),
  62. case file:script(File, [{'CONFIG', Conf}]) of
  63. {ok, Out} ->
  64. Out;
  65. {error, _} ->
  66. Conf
  67. end.
  68. sub_dirs(Cwd, Conf) ->
  69. sub_dirs(Cwd, get_value(sub_dirs, Conf, []), []).
  70. sub_dirs(_, [], Acc) ->
  71. Acc;
  72. sub_dirs(Cwd, [Dir|T], Acc) ->
  73. SubDir = filename:join(Cwd, Dir),
  74. Conf = consult(rebar_conf_file(SubDir)),
  75. Conf1 = script(SubDir, Conf),
  76. Acc1 = sub_dirs(SubDir, get_value(sub_dirs, Conf1, []), Acc),
  77. sub_dirs(Cwd, T, [SubDir|Acc1]).
  78. lib_dirs(Cwd, Conf) ->
  79. lib_dirs(Cwd, get_value(lib_dirs, Conf, []), []).
  80. lib_dirs(_, [], Acc) ->
  81. Acc;
  82. lib_dirs(Cwd, [H|T], Acc) ->
  83. Dirs = filelib:wildcard(filename:join([Cwd, H, "*", "ebin"])),
  84. lib_dirs(Cwd, T, Acc ++ Dirs).
  85. https_to_git(X) ->
  86. re:replace(X, "https://", "git://", [{return, list}]).
  87. git_to_https(X) ->
  88. re:replace(X, "git://", "https://", [{return, list}]).