aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlx_prv_overlay.erl
diff options
context:
space:
mode:
authorDavid Best <[email protected]>2015-02-23 08:57:33 -0800
committerDavid Best <[email protected]>2015-04-01 11:52:22 -0700
commit8d6a41901c1d59fadb81e6b9ed578784478852de (patch)
treeb72848b6eb61430f4d1a4f4df0bc4c4bb32a2b1d /src/rlx_prv_overlay.erl
parentde6b6aa7d48a7f1a238cd9667344d3054b184470 (diff)
downloadrelx-8d6a41901c1d59fadb81e6b9ed578784478852de.tar.gz
relx-8d6a41901c1d59fadb81e6b9ed578784478852de.tar.bz2
relx-8d6a41901c1d59fadb81e6b9ed578784478852de.zip
support symbolic link overlays in dev_mode
If dev_mode=true, an overlay action of 'link' will create the target as a symbolic link, otherwise it will be copied. In any case, the target will be copied, not linked, in the .tar file.
Diffstat (limited to 'src/rlx_prv_overlay.erl')
-rw-r--r--src/rlx_prv_overlay.erl44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl
index cdce915..47b0b3c 100644
--- a/src/rlx_prv_overlay.erl
+++ b/src/rlx_prv_overlay.erl
@@ -347,6 +347,21 @@ do_individual_overlay(State, OverlayVars, {copy, From, To}) ->
copy_to(State, FromFile, ToFile)
end)
end);
+do_individual_overlay(State, OverlayVars, {link, From, To}) ->
+ case rlx_state:dev_mode(State) of
+ false ->
+ do_individual_overlay(State, OverlayVars, {copy, From, To});
+ true ->
+ FromTemplateName = make_template_name("rlx_copy_from_template", From),
+ ToTemplateName = make_template_name("rlx_copy_to_template", To),
+ file_render_do(OverlayVars, From, FromTemplateName,
+ fun(FromFile) ->
+ file_render_do(OverlayVars, To, ToTemplateName,
+ fun(ToFile) ->
+ link_to(State, FromFile, ToFile)
+ end)
+ end)
+ end;
do_individual_overlay(State, OverlayVars, {template, From, To}) ->
FromTemplateName = make_template_name("rlx_template_from_template", From),
ToTemplateName = make_template_name("rlx_template_to_template", To),
@@ -395,6 +410,35 @@ copy_to(State, FromFile0, ToFile0) ->
ToFile1, Err})
end.
+-spec link_to(rlx_state:t(), file:name(), file:name()) -> ok | relx:error().
+link_to(State, FromFile0, ToFile0) ->
+ RelativeRoot = get_relative_root(State),
+ ToFile1 = absolutize(State, filename:join(rlx_state:output_dir(State),
+ erlang:iolist_to_binary(ToFile0))),
+
+ FromFile1 = absolutize(State, filename:join(RelativeRoot,
+ erlang:iolist_to_binary(FromFile0))),
+ ToFile2 = case is_directory(ToFile0, ToFile1) of
+ false ->
+ filelib:ensure_dir(ToFile1),
+ ToFile1;
+ true ->
+ rlx_util:mkdir_p(ToFile1),
+ erlang:iolist_to_binary(filename:join(ToFile1,
+ filename:basename(FromFile1)))
+ end,
+ case ec_file:is_symlink(ToFile2) of
+ true -> file:delete(ToFile2);
+ false -> ec_file:remove(ToFile2, [recursive])
+ end,
+ case file:make_symlink(FromFile1, ToFile2) of
+ ok -> ok;
+ {error, Err} ->
+ ?RLX_ERROR({link_failed,
+ FromFile1,
+ ToFile1, Err})
+ end.
+
get_relative_root(State) ->
case rlx_state:config_file(State) of
[] ->