diff options
Diffstat (limited to 'src/rebar_fetch.erl')
-rw-r--r-- | src/rebar_fetch.erl | 118 |
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, ""}) -> |