From b498e86ef79a37d2779a63d97fd6ee4336d03422 Mon Sep 17 00:00:00 2001 From: Francis Joanis Date: Fri, 16 Dec 2011 15:25:08 -0500 Subject: [PATCH] Delete existing erl files in ?EUNIT_DIR Before copying the .erl files to the .eunit directory ensure that they are deleted if they already exist. This prevents EACCES errors to happen when trying to re-copy .erl files that are read-only. --- src/rebar_eunit.erl | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/rebar_eunit.erl b/src/rebar_eunit.erl index 2743b0e..410d1f5 100644 --- a/src/rebar_eunit.erl +++ b/src/rebar_eunit.erl @@ -85,6 +85,27 @@ eunit(Config, _AppFile) -> %% in src but in a subdirectory of src. Cover only looks in cwd and ../src %% for source files. SrcErls = rebar_utils:find_files("src", ".*\\.erl\$"), + + %% If it is not the first time rebar eunit is executed, there will be source + %% files already present in ?EUNIT_DIR. Since some SCMs (like Perforce) set + %% the source files as being read only (unless they are checked out), we + %% need to be sure that the files already present in ?EUNIT_DIR are writable + %% before doing the copy. This is done here by removing any file that was + %% already present before calling rebar_file_utils:cp_r. + + %% Get the full path to a file that was previously copied in ?EUNIT_DIR + ToCleanUp = fun(F, Acc) -> + F2 = filename:basename(F), + F3 = filename:join([?EUNIT_DIR, F2]), + case filelib:is_regular(F3) of + true -> [F3|Acc]; + false -> Acc + end + end, + + ok = rebar_file_utils:delete_each(lists:foldl(ToCleanUp, [], TestErls)), + ok = rebar_file_utils:delete_each(lists:foldl(ToCleanUp, [], SrcErls)), + ok = rebar_file_utils:cp_r(SrcErls ++ TestErls, ?EUNIT_DIR), %% Compile erlang code to ?EUNIT_DIR, using a tweaked config