summaryrefslogtreecommitdiff
path: root/src/rebar_file_utils.erl
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2017-01-27 14:46:42 -0500
committerFred Hebert <mononcqc@ferd.ca>2017-01-27 14:46:42 -0500
commit3f27d877e3ca1c8624bd38de6b2c4d8cf16ef65e (patch)
tree91994bbc911063bbebb5e9e153073998dffa6500 /src/rebar_file_utils.erl
parentbc3b53f1e5d1a78d94c3cc2f68404ee41a1abd66 (diff)
Re-fix the windows file movement
and clean up a bit
Diffstat (limited to 'src/rebar_file_utils.erl')
-rw-r--r--src/rebar_file_utils.erl78
1 files changed, 45 insertions, 33 deletions
diff --git a/src/rebar_file_utils.erl b/src/rebar_file_utils.erl
index 436f2d5..8158312 100644
--- a/src/rebar_file_utils.erl
+++ b/src/rebar_file_utils.erl
@@ -188,7 +188,16 @@ mv(Source, Dest) ->
case filelib:is_dir(Source) of
true ->
SrcDir = filename:nativename(Source),
- DestDir = filename:nativename(Dest),
+ DestDir = case filelib:is_dir(Dest) of
+ true ->
+ %% to simulate unix/posix mv, we have to replicate
+ %% the same directory movement by moving the whole
+ %% top-level directory, not just the insides
+ SrcName = filename:basename(Source),
+ filename:nativename(filename:join(Dest, SrcName));
+ false ->
+ filename:nativename(Dest)
+ end,
robocopy_dir(SrcDir, DestDir);
false ->
SrcDir = filename:nativename(filename:dirname(Source)),
@@ -208,43 +217,46 @@ mv(Source, Dest) ->
%% we do a regular move with robocopy without rename.
robocopy_file(SrcDir, DestDir, DestName)
; SrcName =/= DestName->
- %% If we're moving a file and the origin and
- %% destination names are different:
- %% - mktmp
- %% - robocopy source_dir tmp_dir srcname
- %% - rename srcname destname (to avoid clobbering)
- %% - robocopy tmp_dir dest_dir destname
- %% - remove tmp_dir
- case ec_file:insecure_mkdtemp() of
- {error, _Reason} ->
- {error, lists:flatten(
- io_lib:format("Failed to move ~s to ~s (tmpdir failed)~n",
- [Source, Dest]))};
- TmpPath ->
- case robocopy_file(SrcDir, TmpPath, SrcName) of
- {error, Reason} ->
- {error, Reason};
- ok ->
- TmpSrc = filename:join(TmpPath, SrcName),
- TmpDst = filename:join(TmpPath, DestName),
- case file:rename(TmpSrc, TmpDst) of
- {error, _} ->
- {error, lists:flatten(
- io_lib:format("Failed to move ~s to ~s (via rename)~n",
- [Source, Dest]))};
- ok ->
- case robocopy_file(TmpPath, DestDir, DestName) of
- Err = {error, _} -> Err;
- OK -> rm_rf(TmpPath), OK
- end
- end
- end
- end
+ robocopy_mv_and_rename(Source, Dest, SrcDir, SrcName, DestDir, DestName)
end
end
end.
+robocopy_mv_and_rename(Source, Dest, SrcDir, SrcName, DestDir, DestName) ->
+ %% If we're moving a file and the origin and
+ %% destination names are different:
+ %% - mktmp
+ %% - robocopy source_dir tmp_dir srcname
+ %% - rename srcname destname (to avoid clobbering)
+ %% - robocopy tmp_dir dest_dir destname
+ %% - remove tmp_dir
+ case ec_file:insecure_mkdtemp() of
+ {error, _Reason} ->
+ {error, lists:flatten(
+ io_lib:format("Failed to move ~s to ~s (tmpdir failed)~n",
+ [Source, Dest]))};
+ TmpPath ->
+ case robocopy_file(SrcDir, TmpPath, SrcName) of
+ {error, Reason} ->
+ {error, Reason};
+ ok ->
+ TmpSrc = filename:join(TmpPath, SrcName),
+ TmpDst = filename:join(TmpPath, DestName),
+ case file:rename(TmpSrc, TmpDst) of
+ {error, _} ->
+ {error, lists:flatten(
+ io_lib:format("Failed to move ~s to ~s (via rename)~n",
+ [Source, Dest]))};
+ ok ->
+ case robocopy_file(TmpPath, DestDir, DestName) of
+ Err = {error, _} -> Err;
+ OK -> rm_rf(TmpPath), OK
+ end
+ end
+ end
+ end.
+
robocopy_file(SrcPath, DestPath, FileName) ->
Cmd = ?FMT("robocopy /move /e \"~s\" \"~s\" \"~s\"",
[rebar_utils:escape_double_quotes(SrcPath),