PageRenderTime 33ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/mochiweb_skel.erl

http://github.com/basho/mochiweb
Erlang | 84 lines | 70 code | 9 blank | 5 comment | 0 complexity | 48f18eff89f7d381274b4576668e6560 MD5 | raw file
Possible License(s): MIT
  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. ok = file:make_symlink(
  15. filename:join(filename:dirname(code:which(?MODULE)), ".."),
  16. filename:join([DestDir, Name, "deps", "mochiweb-src"])).
  17. %% Internal API
  18. src() ->
  19. Dir = filename:dirname(code:which(?MODULE)),
  20. filename:join(Dir, "../priv/skel").
  21. skel() ->
  22. "skel".
  23. skelcopy(Src, DestDir, Name, LDst) ->
  24. Dest = re:replace(filename:basename(Src), skel(), Name,
  25. [global, {return, list}]),
  26. case file:read_file_info(Src) of
  27. {ok, #file_info{type=directory, mode=Mode}} ->
  28. Dir = DestDir ++ "/" ++ Dest,
  29. EDst = lists:nthtail(LDst, Dir),
  30. ok = ensuredir(Dir),
  31. ok = file:write_file_info(Dir, #file_info{mode=Mode}),
  32. case filename:basename(Src) of
  33. "ebin" ->
  34. ok;
  35. _ ->
  36. {ok, Files} = file:list_dir(Src),
  37. io:format("~s/~n", [EDst]),
  38. lists:foreach(fun ("." ++ _) -> ok;
  39. (F) ->
  40. skelcopy(filename:join(Src, F),
  41. Dir,
  42. Name,
  43. LDst)
  44. end,
  45. Files),
  46. ok
  47. end;
  48. {ok, #file_info{type=regular, mode=Mode}} ->
  49. OutFile = filename:join(DestDir, Dest),
  50. {ok, B} = file:read_file(Src),
  51. S = re:replace(binary_to_list(B), skel(), Name,
  52. [{return, list}, global]),
  53. ok = file:write_file(OutFile, list_to_binary(S)),
  54. ok = file:write_file_info(OutFile, #file_info{mode=Mode}),
  55. io:format(" ~s~n", [filename:basename(Src)]),
  56. ok;
  57. {ok, _} ->
  58. io:format("ignored source file: ~p~n", [Src]),
  59. ok
  60. end.
  61. ensuredir(Dir) ->
  62. case file:make_dir(Dir) of
  63. ok ->
  64. ok;
  65. {error, eexist} ->
  66. ok;
  67. E ->
  68. E
  69. end.
  70. %%
  71. %% Tests
  72. %%
  73. -include_lib("eunit/include/eunit.hrl").
  74. -ifdef(TEST).
  75. -endif.