/deps/mochiweb/src/mochiweb_skel.erl

http://github.com/zotonic/zotonic · Erlang · 86 lines · 72 code · 9 blank · 5 comment · 0 complexity · 3dc6f7738ca2ee67b9cf1393f60437a1 MD5 · raw file

  1. -module(mochiweb_skel).
  2. -export([skelcopy/2]).
  3. -include_lib("kernel/include/file.hrl").
  4. %% External API
  5. skelcopy(DestDir, Name) ->
  6. ok = ensuredir(DestDir),
  7. LDst = case length(filename:dirname(DestDir)) of
  8. 1 -> %% handle case when dirname returns "/"
  9. 0;
  10. N ->
  11. N + 1
  12. end,
  13. skelcopy(src(), DestDir, Name, LDst),
  14. DestLink = filename:join([DestDir, Name, "deps", "mochiweb-src"]),
  15. ok = filelib:ensure_dir(DestLink),
  16. ok = file:make_symlink(
  17. filename:join(filename:dirname(code:which(?MODULE)), ".."),
  18. DestLink).
  19. %% Internal API
  20. src() ->
  21. Dir = filename:dirname(code:which(?MODULE)),
  22. filename:join(Dir, "../priv/skel").
  23. skel() ->
  24. "skel".
  25. skelcopy(Src, DestDir, Name, LDst) ->
  26. Dest = re:replace(filename:basename(Src), skel(), Name,
  27. [global, {return, list}]),
  28. case file:read_file_info(Src) of
  29. {ok, #file_info{type=directory, mode=Mode}} ->
  30. Dir = DestDir ++ "/" ++ Dest,
  31. EDst = lists:nthtail(LDst, Dir),
  32. ok = ensuredir(Dir),
  33. ok = file:write_file_info(Dir, #file_info{mode=Mode}),
  34. case filename:basename(Src) of
  35. "ebin" ->
  36. ok;
  37. _ ->
  38. {ok, Files} = file:list_dir(Src),
  39. io:format("~s/~n", [EDst]),
  40. lists:foreach(fun ("." ++ _) -> ok;
  41. (F) ->
  42. skelcopy(filename:join(Src, F),
  43. Dir,
  44. Name,
  45. LDst)
  46. end,
  47. Files),
  48. ok
  49. end;
  50. {ok, #file_info{type=regular, mode=Mode}} ->
  51. OutFile = filename:join(DestDir, Dest),
  52. {ok, B} = file:read_file(Src),
  53. S = re:replace(binary_to_list(B), skel(), Name,
  54. [{return, list}, global]),
  55. ok = file:write_file(OutFile, list_to_binary(S)),
  56. ok = file:write_file_info(OutFile, #file_info{mode=Mode}),
  57. io:format(" ~s~n", [filename:basename(Src)]),
  58. ok;
  59. {ok, _} ->
  60. io:format("ignored source file: ~p~n", [Src]),
  61. ok
  62. end.
  63. ensuredir(Dir) ->
  64. case file:make_dir(Dir) of
  65. ok ->
  66. ok;
  67. {error, eexist} ->
  68. ok;
  69. E ->
  70. E
  71. end.
  72. %%
  73. %% Tests
  74. %%
  75. -ifdef(TEST).
  76. -include_lib("eunit/include/eunit.hrl").
  77. -endif.