summaryrefslogtreecommitdiff
path: root/src/rebar_fetch.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_fetch.erl')
-rw-r--r--src/rebar_fetch.erl118
1 files changed, 58 insertions, 60 deletions
diff --git a/src/rebar_fetch.erl b/src/rebar_fetch.erl
index 024e032..09e52a9 100644
--- a/src/rebar_fetch.erl
+++ b/src/rebar_fetch.erl
@@ -19,13 +19,6 @@
-include("rebar.hrl").
--type dep_name() :: atom().
--type dep_vsn() :: ec_semver:any_version().
--type dep_source() :: {atom(), string(), ref()}.
--type ref() :: string() | {atom(), string()}.
-
--type dep() :: { dep_name(), dep_vsn(), dep_source() }.
-
-record(p4_settings, {
client=undefined,
transport="tcp4:perforce:1666",
@@ -50,12 +43,18 @@ init_p4_settings(Basename) ->
current_ref(AppDir, {git, _, _}) ->
string:strip(os:cmd("git --git-dir='" ++ AppDir ++ "/.git' rev-parse --verify HEAD"), both, $\n).
-download_source(AppDir, {p4, Url}) ->
- download_source(AppDir, {p4, Url, "#head"});
-download_source(AppDir, {p4, Url, Rev}) ->
- download_source(AppDir, {p4, Url, Rev, init_p4_settings(filename:basename(AppDir))});
-download_source(AppDir, {p4, Url, _Rev, Settings}) ->
- ok = filelib:ensure_dir(AppDir),
+download_source(AppDir, Source) ->
+ ec_file:mkdir_p(AppDir),
+ TmpDir = ec_file:insecure_mkdtemp(),
+ download_source_tmp(TmpDir, Source),
+ ok = ec_file:copy(TmpDir, binary_to_list(filename:absname(AppDir)), [recursive]).
+
+download_source_tmp(TmpDir, {p4, Url}) ->
+ download_source_tmp(TmpDir, {p4, Url, "#head"});
+download_source_tmp(TmpDir, {p4, Url, Rev}) ->
+ download_source_tmp(TmpDir, {p4, Url, Rev, init_p4_settings(filename:basename(TmpDir))});
+download_source_tmp(TmpDir, {p4, Url, _Rev, Settings}) ->
+ ok = filelib:ensure_dir(TmpDir),
rebar_utils:sh_send("p4 client -i",
?FMT("Client: ~s~n"
++"Description: generated by Rebar~n"
@@ -63,68 +62,67 @@ download_source(AppDir, {p4, Url, _Rev, Settings}) ->
++"View:~n"
++" ~s/... //~s/...~n",
[Settings#p4_settings.client,
- AppDir,
+ TmpDir,
Url,
Settings#p4_settings.client]),
[]),
rebar_utils:sh(?FMT("p4 -c ~s sync -f", [Settings#p4_settings.client]), []);
-download_source(AppDir, {hg, Url, Rev}) ->
- ok = filelib:ensure_dir(AppDir),
- rebar_utils:sh(?FMT("hg clone -U ~s ~s", [Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]),
- rebar_utils:sh(?FMT("hg update ~s", [Rev]), [{cd, AppDir}]);
-download_source(AppDir, {git, Url}) ->
- download_source(AppDir, {git, Url, {branch, "HEAD"}});
-download_source(AppDir, {git, Url, ""}) ->
- download_source(AppDir, {git, Url, {branch, "HEAD"}});
-download_source(AppDir, {git, Url, {branch, Branch}}) ->
- ok = filelib:ensure_dir(AppDir),
- rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]),
- rebar_utils:sh(?FMT("git checkout -q origin/~s", [Branch]), [{cd, AppDir}]);
-download_source(AppDir, {git, Url, {tag, Tag}}) ->
- ok = filelib:ensure_dir(AppDir),
- rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]),
- rebar_utils:sh(?FMT("git checkout -q ~s", [Tag]), [{cd, AppDir}]);
-download_source(AppDir, {git, Url, Rev}) ->
- ok = filelib:ensure_dir(AppDir),
- rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]),
- rebar_utils:sh(?FMT("git checkout -q ~s", [Rev]), [{cd, AppDir}]);
-download_source(AppDir, {bzr, Url, Rev}) ->
- ok = filelib:ensure_dir(AppDir),
+download_source_tmp(TmpDir, {hg, Url, Rev}) ->
+ ok = filelib:ensure_dir(TmpDir),
+ rebar_utils:sh(?FMT("hg clone -U ~s ~s", [Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]),
+ rebar_utils:sh(?FMT("hg update ~s", [Rev]), [{cd, TmpDir}]);
+download_source_tmp(TmpDir, {git, Url}) ->
+ download_source_tmp(TmpDir, {git, Url, {branch, "HEAD"}});
+download_source_tmp(TmpDir, {git, Url, ""}) ->
+ download_source_tmp(TmpDir, {git, Url, {branch, "HEAD"}});
+download_source_tmp(TmpDir, {git, Url, {branch, Branch}}) ->
+ ok = filelib:ensure_dir(TmpDir),
+ rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]),
+ rebar_utils:sh(?FMT("git checkout -q origin/~s", [Branch]), [{cd, TmpDir}]);
+download_source_tmp(TmpDir, {git, Url, {tag, Tag}}) ->
+ ok = filelib:ensure_dir(TmpDir),
+ rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]),
+ rebar_utils:sh(?FMT("git checkout -q ~s", [Tag]), [{cd, TmpDir}]);
+download_source_tmp(TmpDir, {git, Url, Rev}) ->
+ ok = filelib:ensure_dir(TmpDir),
+ rebar_utils:sh(?FMT("git clone -n ~s ~s", [Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]),
+ rebar_utils:sh(?FMT("git checkout -q ~s", [Rev]), [{cd, TmpDir}]);
+download_source_tmp(TmpDir, {bzr, Url, Rev}) ->
+ ok = filelib:ensure_dir(TmpDir),
rebar_utils:sh(?FMT("bzr branch -r ~s ~s ~s",
- [Rev, Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]);
-download_source(AppDir, {svn, Url, Rev}) ->
- ok = filelib:ensure_dir(AppDir),
+ [Rev, Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]);
+download_source_tmp(TmpDir, {svn, Url, Rev}) ->
+ ok = filelib:ensure_dir(TmpDir),
rebar_utils:sh(?FMT("svn checkout -r ~s ~s ~s",
- [Rev, Url, filename:basename(AppDir)]),
- [{cd, filename:dirname(AppDir)}]);
-download_source(AppDir, {rsync, Url}) ->
- ok = filelib:ensure_dir(AppDir),
- rebar_utils:sh(?FMT("rsync -az --delete ~s/ ~s", [Url, AppDir]), []);
-download_source(AppDir, {fossil, Url}) ->
- download_source(AppDir, {fossil, Url, ""});
-download_source(AppDir, {fossil, Url, Version}) ->
- Repository = filename:join(AppDir, filename:basename(AppDir) ++ ".fossil"),
+ [Rev, Url, filename:basename(TmpDir)]),
+ [{cd, filename:dirname(TmpDir)}]);
+download_source_tmp(TmpDir, {rsync, Url}) ->
+ ok = filelib:ensure_dir(TmpDir),
+ rebar_utils:sh(?FMT("rsync -az --delete ~s/ ~s", [Url, TmpDir]), []);
+download_source_tmp(TmpDir, {fossil, Url}) ->
+ download_source_tmp(TmpDir, {fossil, Url, ""});
+download_source_tmp(TmpDir, {fossil, Url, Version}) ->
+ Repository = filename:join(TmpDir, filename:basename(TmpDir) ++ ".fossil"),
ok = filelib:ensure_dir(Repository),
- ok = file:set_cwd(AppDir),
+ ok = file:set_cwd(TmpDir),
rebar_utils:sh(?FMT("fossil clone ~s ~s", [Url, Repository]),
- [{cd, AppDir}]),
+ [{cd, TmpDir}]),
rebar_utils:sh(?FMT("fossil open ~s ~s --nested", [Repository, Version]),
[]);
-download_source(AppDir, {AppName, AppVersion, Url}) when is_binary(AppName)
- , is_binary(AppVersion) ->
- TmpDir = ec_file:insecure_mkdtemp(),
+download_source_tmp(TmpDir, {AppName, AppVersion, Url}) when is_binary(AppName)
+ , is_binary(AppVersion) ->
TmpFile = binary_to_list(filename:join(TmpDir, <<AppName/binary, "-", AppVersion/binary>>)),
{ok, saved_to_file} = httpc:request(get, {binary_to_list(Url), []}, [], [{stream, TmpFile}]),
- ok = erl_tar:extract(TmpFile, [{cwd, filename:dirname(AppDir)}, compressed]),
+ ok = erl_tar:extract(TmpFile, [{cwd, filename:dirname(TmpDir)}, compressed]),
ok.
update_source1(AppDir, Args) when element(1, Args) =:= p4 ->
- download_source(AppDir, Args);
+ download_source_tmp(AppDir, Args);
update_source1(AppDir, {git, Url}) ->
update_source1(AppDir, {git, Url, {branch, "HEAD"}});
update_source1(AppDir, {git, Url, ""}) ->