summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Widgren <daniel.widgren@gmail.com>2015-06-01 12:44:13 +0200
committerViacheslav Kovalev <kovyl2404@gmail.com>2015-06-26 11:24:02 +0300
commita029e957fd674030bc289ea928d7cb7204cf5d1c (patch)
treeecee252bc60ac010dc5d85aab0740c3ba0e804db /src
parentd734beb850596f831ffd34cb2c6b252bb1ede6a1 (diff)
Fixed two tests for windows 8.1 and added touch functionality
Diffstat (limited to 'src')
-rw-r--r--src/rebar_file_utils.erl49
1 files changed, 34 insertions, 15 deletions
diff --git a/src/rebar_file_utils.erl b/src/rebar_file_utils.erl
index 915da9a..32abd4b 100644
--- a/src/rebar_file_utils.erl
+++ b/src/rebar_file_utils.erl
@@ -36,10 +36,14 @@
write_file_if_contents_differ/2,
system_tmpdir/0,
system_tmpdir/1,
- reset_dir/1]).
+ reset_dir/1,
+ touch/1]).
-include("rebar.hrl").
+
-include_lib("providers/include/providers.hrl").
+-include_lib("kernel/include/file.hrl").
+
%% ===================================================================
%% Public API
@@ -71,6 +75,11 @@ symlink_or_copy(Source, Target) ->
{error, eexist} ->
ok;
{error, _} ->
+ Target2 = case is_binary(Target) of
+ true -> unicode:characters_to_list(Target);
+ false -> Target
+ end,
+ rm_rf(Target2),
cp_r([Source], Target)
end.
@@ -135,7 +144,7 @@ mv(Source, Dest) ->
end.
win32_robocopy_ok({ok, _}) -> true;
-win32_robocopy_ok({error, {Rc, _}}) when Rc<9, Rc==16 -> true;
+win32_robocopy_ok({error, {Rc, _}}) when Rc<9; Rc=:=16 -> true;
win32_robocopy_ok(_) -> false.
delete_each([]) ->
@@ -189,6 +198,17 @@ reset_dir(Path) ->
%% recreate the directory
filelib:ensure_dir(filename:join([Path, "dummy.beam"])).
+
+%% Linux touch but using erlang functions to work in bot *nix os and
+%% windows
+-spec touch(Path) -> ok | {error, Reason} when
+ Path :: file:name(),
+ Reason :: file:posix().
+touch(Path) ->
+ {ok, A} = file:read_file_info(Path),
+ ok = file:write_file_info(Path, A#file_info{mtime = calendar:local_time(),
+ atime = calendar:local_time()}).
+
%% ===================================================================
%% Internal functions
%% ===================================================================
@@ -201,28 +221,27 @@ delete_each_dir_win32([Dir | Rest]) ->
delete_each_dir_win32(Rest).
xcopy_win32(Source,Dest)->
- {ok, R} = rebar_utils:sh(
- ?FMT("xcopy \"~s\" \"~s\" /q /y /e 2> nul",
+ %% "xcopy \"~s\" \"~s\" /q /y /e 2> nul", Chanegd to robocopy to
+ %% handle long names. May have issues with older windows.
+ Res = rebar_utils:sh(
+ ?FMT("robocopy \"~s\" \"~s\" /e /is 2> nul",
[filename:nativename(Source), filename:nativename(Dest)]),
[{use_stdout, false}, return_on_error]),
- case length(R) > 0 of
- %% when xcopy fails, stdout is empty and and error message is printed
- %% to stderr (which is redirected to nul)
- true -> ok;
- false ->
- {error, lists:flatten(
- io_lib:format("Failed to xcopy from ~s to ~s~n",
- [Source, Dest]))}
+ case win32_robocopy_ok(Res) of
+ true -> ok;
+ false ->
+ {error, lists:flatten(
+ io_lib:format("Failed to copy ~s to ~s~n",
+ [Source, Dest]))}
end.
cp_r_win32({true, SourceDir}, {true, DestDir}) ->
%% from directory to directory
- SourceBase = filename:basename(SourceDir),
- ok = case file:make_dir(filename:join(DestDir, SourceBase)) of
+ ok = case file:make_dir(DestDir) of
{error, eexist} -> ok;
Other -> Other
end,
- ok = xcopy_win32(SourceDir, filename:join(DestDir, SourceBase));
+ ok = xcopy_win32(SourceDir, DestDir);
cp_r_win32({false, Source} = S,{true, DestDir}) ->
%% from file to directory
cp_r_win32(S, {false, filename:join(DestDir, filename:basename(Source))});