blob: 76eefa60eb0bfd67468b1bbb2d7fc1d41c2d42af [file] [log] [blame]
-module(mochiweb_skel).
-export([skelcopy/2]).
-include_lib("kernel/include/file.hrl").
%% External API
skelcopy(DestDir, Name) ->
ok = ensuredir(DestDir),
LDst = case length(filename:dirname(DestDir)) of
1 -> %% handle case when dirname returns "/"
0;
N ->
N + 1
end,
skelcopy(src(), DestDir, Name, LDst),
DestLink = filename:join([DestDir, Name, "deps", "mochiweb-src"]),
ok = filelib:ensure_dir(DestLink),
ok = file:make_symlink(
filename:join(filename:dirname(code:which(?MODULE)), ".."),
DestLink).
%% Internal API
src() ->
Dir = filename:dirname(code:which(?MODULE)),
filename:join(Dir, "../priv/skel").
skel() ->
"skel".
skelcopy(Src, DestDir, Name, LDst) ->
Dest = re:replace(filename:basename(Src), skel(), Name,
[global, {return, list}]),
case file:read_file_info(Src) of
{ok, #file_info{type=directory, mode=Mode}} ->
Dir = DestDir ++ "/" ++ Dest,
EDst = lists:nthtail(LDst, Dir),
ok = ensuredir(Dir),
ok = file:write_file_info(Dir, #file_info{mode=Mode}),
case filename:basename(Src) of
"ebin" ->
ok;
_ ->
{ok, Files} = file:list_dir(Src),
io:format("~s/~n", [EDst]),
lists:foreach(fun ("." ++ _) -> ok;
(F) ->
skelcopy(filename:join(Src, F),
Dir,
Name,
LDst)
end,
Files),
ok
end;
{ok, #file_info{type=regular, mode=Mode}} ->
OutFile = filename:join(DestDir, Dest),
{ok, B} = file:read_file(Src),
S = re:replace(binary_to_list(B), skel(), Name,
[{return, list}, global]),
ok = file:write_file(OutFile, list_to_binary(S)),
ok = file:write_file_info(OutFile, #file_info{mode=Mode}),
io:format(" ~s~n", [filename:basename(Src)]),
ok;
{ok, _} ->
io:format("ignored source file: ~p~n", [Src]),
ok
end.
ensuredir(Dir) ->
case file:make_dir(Dir) of
ok ->
ok;
{error, eexist} ->
ok;
E ->
E
end.
%%
%% Tests
%%
-include_lib("eunit/include/eunit.hrl").
-ifdef(TEST).
-endif.