erlware / relx

Sane, simple release creation for Erlang
http://erlware.github.io/relx
Apache License 2.0
697 stars 232 forks source link

avoid crash when overlay is malformed #916

Closed sg2342 closed 2 years ago

sg2342 commented 2 years ago

fix: erlware#867

sg2342 commented 2 years ago

i amended the PR to format link_failed and unable_to_chmod errors. without it, rebar3 would throw 'no function clause matching' exceptions on these.

sg2342 commented 2 years ago

With the PR merged and included in a rebar3 release; the rebar3 release task behavior will change (with examples taken from the shelltest in #917):

1 malformed_overlay

anything not understood by relx_overlay, e.g. {overlay, [{malformed, foo}]}

1.1 BEFORE merge: crash

rebar3 release fails (exit code 1), error output:

===> Uncaught error in rebar_core. Run with DIAGNOSTIC=1 to see stacktrace or consult rebar3.crashdump

1.2 AFTER merge

rebar3 release succeeds (exit code 0), error output:

===> Overlay section malformed: {malformed,foo}

2 unable_to_make_dir

failure to create a directory, e.g. {overlay, [{mkdir, "releases/RELEASES"}]}

2.1 BEFORE merge: silent faiure

rebar3 release succeeds (exit code 0), no error output.

2.2 AFTER merge

rebar3 release fails (exit code 1), error output:

===> Unable to make directory /tmp/relx/shelltests/overlay_error_test/_build/mkdir_error/rel/overlay_error_test/releases/RELEASES because eexist

3 copy_failed

failure to copy file, e.g. {overlay, [{copy, "does_not_exist", "something"}]}

3.1 BEFORE merge: silent failure, tar task behaves different

4 read_template

failure to read a template file e.g. {overlay, [{template, "does_not_exist", "something"}]}

4.1 BEFORE merge: silent failure, tar task behaves different

5 write_template

failure to write a templated file e.g. {overlay, [{template, "README.md", "releases"}]}

5.1 BEFORE merge: silent failure

rebar3 release succeeds (exit code 0), no error output.

5.2 AFTER merge

rebar3 release fails (exit code 1), error output:

===> Unable to write to /tmp/relx/shelltests/overlay_error_test/_build/template_write_error/rel/overlay_error_test/releases because eisdir

6 template_dir

failure to create a enclosing directory e.g. {overlay, [{template, "README.md", "releases/RELEASES/foo"}]}

6.1 BEFORE merge: silent failure, tar task behaves different

7 chmod_error

failure to modify file mode bits e.g. {overlay, [{chmod, 0, "does_not_exist"}]}

7.1 BEFORE merge: silent failure

rebar3 release succeeds (exit code 0), no error output.

7.1 AFTER merge

rebar3 release fails (exit code 1), error output:

===> Unable to chmod 0 does_not_exist because of enoent

8 link_error

failure to create a symbolic link. It is surprisingly hard to get rlx_overlay:link_to/4 to fail...

 {mode, dev},
 {overlay, [{link, "README.md", "../../../../../../../../../../../../../../../../../../../../../../../../f"}]}

8.1 BEFORE merge: silent failure, tar task behaves different