summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--THANKS1
-rwxr-xr-xbootstrap2
-rw-r--r--priv/templates/gitignore1
-rw-r--r--src/rebar.app.src1
-rw-r--r--src/rebar_base_compiler.erl2
-rw-r--r--src/rebar_erlc_compiler.erl2
-rw-r--r--src/rebar_git_resource.erl72
-rw-r--r--src/rebar_prv_eunit.erl11
-rw-r--r--src/rebar_prv_get_deps.erl37
-rw-r--r--src/rebar_prv_shell.erl6
-rw-r--r--src/rebar_templater.erl2
11 files changed, 114 insertions, 23 deletions
diff --git a/THANKS b/THANKS
index c5f7522..63f4aaa 100644
--- a/THANKS
+++ b/THANKS
@@ -137,3 +137,4 @@ Stefan Grundmann
Carlos Eduardo de Paula
Derek Brown
Heinz N. Gies
+Roberto Aloi
diff --git a/bootstrap b/bootstrap
index c7f0e06..5359660 100755
--- a/bootstrap
+++ b/bootstrap
@@ -24,7 +24,7 @@ main(_) ->
bootstrap_rebar3(),
%% Build rebar.app from rebar.app.src
- {ok, App} = rebar_app_info:new(rebar, "3.3.2", filename:absname("_build/default/lib/rebar/")),
+ {ok, App} = rebar_app_info:new(rebar, "3.3.3", filename:absname("_build/default/lib/rebar/")),
rebar_otp_app:compile(rebar_state:new(), App),
%% Because we are compiling files that are loaded already we want to silence
diff --git a/priv/templates/gitignore b/priv/templates/gitignore
index 121a4de..468614d 100644
--- a/priv/templates/gitignore
+++ b/priv/templates/gitignore
@@ -14,3 +14,4 @@ erl_crash.dump
logs
_build
.idea
+rebar3.crashdump
diff --git a/src/rebar.app.src b/src/rebar.app.src
index 5b735cf..74efe97 100644
--- a/src/rebar.app.src
+++ b/src/rebar.app.src
@@ -52,6 +52,7 @@
rebar_prv_edoc,
rebar_prv_escriptize,
rebar_prv_eunit,
+ rebar_prv_get_deps,
rebar_prv_help,
rebar_prv_install_deps,
rebar_prv_local_install,
diff --git a/src/rebar_base_compiler.erl b/src/rebar_base_compiler.erl
index bfd79a5..9aa7419 100644
--- a/src/rebar_base_compiler.erl
+++ b/src/rebar_base_compiler.erl
@@ -54,7 +54,7 @@ run(Config, FirstFiles, SourceDir, SourceExt, TargetDir, TargetExt,
run(Config, FirstFiles, SourceDir, SourceExt, TargetDir, TargetExt,
Compile3Fn, Opts) ->
%% Convert simple extension to proper regex
- SourceExtRe = "^(?!._).*\\" ++ SourceExt ++ [$$],
+ SourceExtRe = "^(?!\\._).*\\" ++ SourceExt ++ [$$],
Recursive = proplists:get_value(recursive, Opts, true),
%% Find all possible source files
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl
index d4d257f..95573fd 100644
--- a/src/rebar_erlc_compiler.erl
+++ b/src/rebar_erlc_compiler.erl
@@ -48,7 +48,7 @@
-type compile_opt() :: {recursive, boolean()}.
-define(DEFAULT_OUTDIR, "ebin").
--define(RE_PREFIX, "^(?!._)").
+-define(RE_PREFIX, "^(?!\\._)").
%% ===================================================================
%% Public API
diff --git a/src/rebar_git_resource.erl b/src/rebar_git_resource.erl
index acb9ec0..201b8b6 100644
--- a/src/rebar_git_resource.erl
+++ b/src/rebar_git_resource.erl
@@ -107,28 +107,50 @@ download(Dir, {git, Url, ""}, State) ->
download(Dir, {git, Url, {branch, "master"}}, State);
download(Dir, {git, Url, {branch, Branch}}, _State) ->
ok = filelib:ensure_dir(Dir),
- rebar_utils:sh(?FMT("git clone ~s ~s -b ~s --single-branch",
- [rebar_utils:escape_chars(Url),
- rebar_utils:escape_chars(filename:basename(Dir)),
- rebar_utils:escape_chars(Branch)]),
- [{cd, filename:dirname(Dir)}]);
+ git_clone(branch, git_vsn(), Url, Dir, Branch);
download(Dir, {git, Url, {tag, Tag}}, _State) ->
ok = filelib:ensure_dir(Dir),
- rebar_utils:sh(?FMT("git clone ~s ~s -b ~s --single-branch",
- [rebar_utils:escape_chars(Url),
- rebar_utils:escape_chars(filename:basename(Dir)),
- rebar_utils:escape_chars(Tag)]),
- [{cd, filename:dirname(Dir)}]);
+ git_clone(tag, git_vsn(), Url, Dir, Tag);
download(Dir, {git, Url, {ref, Ref}}, _State) ->
ok = filelib:ensure_dir(Dir),
+ git_clone(ref, git_vsn(), Url, Dir, Ref);
+download(Dir, {git, Url, Rev}, _State) ->
+ ?WARN("WARNING: It is recommended to use {branch, Name}, {tag, Tag} or {ref, Ref}, otherwise updating the dep may not work as expected.", []),
+ ok = filelib:ensure_dir(Dir),
+ git_clone(rev, git_vsn(), Url, Dir, Rev).
+
+%% Use different git clone commands depending on git --version
+git_clone(branch,Vsn,Url,Dir,Branch) when Vsn >= {1,7,10}; Vsn =:= undefined ->
+ rebar_utils:sh(?FMT("git clone ~s ~s -b ~s --single-branch",
+ [rebar_utils:escape_chars(Url),
+ rebar_utils:escape_chars(filename:basename(Dir)),
+ rebar_utils:escape_chars(Branch)]),
+ [{cd, filename:dirname(Dir)}]);
+git_clone(branch,_Vsn,Url,Dir,Branch) ->
+ rebar_utils:sh(?FMT("git clone ~s ~s -b ~s",
+ [rebar_utils:escape_chars(Url),
+ rebar_utils:escape_chars(filename:basename(Dir)),
+ rebar_utils:escape_chars(Branch)]),
+ [{cd, filename:dirname(Dir)}]);
+git_clone(tag,Vsn,Url,Dir,Tag) when Vsn >= {1,7,10}; Vsn =:= undefined ->
+ rebar_utils:sh(?FMT("git clone ~s ~s -b ~s --single-branch",
+ [rebar_utils:escape_chars(Url),
+ rebar_utils:escape_chars(filename:basename(Dir)),
+ rebar_utils:escape_chars(Tag)]),
+ [{cd, filename:dirname(Dir)}]);
+git_clone(tag,_Vsn,Url,Dir,Tag) ->
+ rebar_utils:sh(?FMT("git clone ~s ~s -b ~s",
+ [rebar_utils:escape_chars(Url),
+ rebar_utils:escape_chars(filename:basename(Dir)),
+ rebar_utils:escape_chars(Tag)]),
+ [{cd, filename:dirname(Dir)}]);
+git_clone(ref,_Vsn,Url,Dir,Ref) ->
rebar_utils:sh(?FMT("git clone -n ~s ~s",
[rebar_utils:escape_chars(Url),
rebar_utils:escape_chars(filename:basename(Dir))]),
[{cd, filename:dirname(Dir)}]),
rebar_utils:sh(?FMT("git checkout -q ~s", [Ref]), [{cd, Dir}]);
-download(Dir, {git, Url, Rev}, _State) ->
- ?WARN("WARNING: It is recommended to use {branch, Name}, {tag, Tag} or {ref, Ref}, otherwise updating the dep may not work as expected.", []),
- ok = filelib:ensure_dir(Dir),
+git_clone(rev,_Vsn,Url,Dir,Rev) ->
rebar_utils:sh(?FMT("git clone -n ~s ~s",
[rebar_utils:escape_chars(Url),
rebar_utils:escape_chars(filename:basename(Dir))]),
@@ -136,6 +158,30 @@ download(Dir, {git, Url, Rev}, _State) ->
rebar_utils:sh(?FMT("git checkout -q ~s", [rebar_utils:escape_chars(Rev)]),
[{cd, Dir}]).
+git_vsn() ->
+ case application:get_env(rebar, git_vsn) of
+ {ok, Vsn} -> Vsn;
+ undefined ->
+ Vsn = git_vsn_fetch(),
+ application:set_env(rebar, git_vsn, Vsn),
+ Vsn
+ end.
+
+git_vsn_fetch() ->
+ case rebar_utils:sh("git --version",[]) of
+ {ok, VsnStr} ->
+ case re:run(VsnStr, "git version\\h+(\\d)\\.(\\d)\\.(\\d).*",[{capture,[1,2,3],list}]) of
+ {match,[Maj,Min,Patch]} ->
+ {list_to_integer(Maj),
+ list_to_integer(Min),
+ list_to_integer(Patch)};
+ nomatch ->
+ undefined
+ end;
+ {error, _} ->
+ undefined
+ end.
+
make_vsn(Dir) ->
case collect_default_refcount(Dir) of
Vsn={plain, _} ->
diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl
index 6fdf33e..7d44137 100644
--- a/src/rebar_prv_eunit.erl
+++ b/src/rebar_prv_eunit.erl
@@ -18,7 +18,7 @@
%% we need to modify app_info state before compile
-define(DEPS, [lock]).
--define(DEFAULT_TEST_REGEX, "^(?!._).*\\.erl\$").
+-define(DEFAULT_TEST_REGEX, "^(?!\\._).*\\.erl\$").
%% ===================================================================
%% Public API
@@ -195,17 +195,18 @@ gather_src([Dir|Rest], Regex, Srcs) ->
gather_src(Rest, Regex, Srcs ++ rebar_utils:find_files(Dir, Regex, true)).
dedupe_tests({AppMods, TestMods}) ->
+ UniqueTestMods = lists:usort(TestMods) -- AppMods,
%% for each modules in TestMods create a test if there is not a module
%% in AppMods that will trigger it
- F = fun(Mod) ->
- M = filename:basename(Mod, ".erl"),
- MatchesTest = fun(Dir) -> filename:basename(Dir, ".erl") ++ "_tests" == M end,
+ F = fun(TestMod) ->
+ M = filename:rootname(filename:basename(TestMod)),
+ MatchesTest = fun(AppMod) -> filename:rootname(filename:basename(AppMod)) ++ "_tests" == M end,
case lists:any(MatchesTest, AppMods) of
false -> {true, {module, list_to_atom(M)}};
true -> false
end
end,
- lists:usort(rebar_utils:filtermap(F, TestMods)).
+ rebar_utils:filtermap(F, UniqueTestMods).
inject_eunit_state(State, {ok, Tests}) ->
Apps = rebar_state:project_apps(State),
diff --git a/src/rebar_prv_get_deps.erl b/src/rebar_prv_get_deps.erl
new file mode 100644
index 0000000..020e50b
--- /dev/null
+++ b/src/rebar_prv_get_deps.erl
@@ -0,0 +1,37 @@
+%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
+%% ex: ts=4 sw=4 et
+
+-module(rebar_prv_get_deps).
+
+-behaviour(provider).
+
+-export([init/1,
+ do/1,
+ format_error/1]).
+
+-define(PROVIDER, 'get-deps').
+-define(DEPS, [lock]).
+
+%% ===================================================================
+%% Public API
+%% ===================================================================
+
+-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
+init(State) ->
+ Provider = providers:create([{name, ?PROVIDER},
+ {module, ?MODULE},
+ {deps, ?DEPS},
+ {bare, true},
+ {example, "rebar3 get-deps"},
+ {short_desc, "Fetch dependencies."},
+ {desc, "Fetch project dependencies."},
+ {opts, []},
+ {profiles, []}]),
+ {ok, rebar_state:add_provider(State, Provider)}.
+
+-spec do(rebar_state:t()) -> {ok, rebar_state:t()}.
+do(State) -> {ok, State}.
+
+-spec format_error(any()) -> iolist().
+format_error(Reason) ->
+ io_lib:format("~p", [Reason]). \ No newline at end of file
diff --git a/src/rebar_prv_shell.erl b/src/rebar_prv_shell.erl
index 31b2e17..72efcf1 100644
--- a/src/rebar_prv_shell.erl
+++ b/src/rebar_prv_shell.erl
@@ -339,7 +339,7 @@ reread_config(State) ->
boot_apps(Apps) ->
?WARN("The rebar3 shell is a development tool; to deploy "
"applications in production, consider using releases "
- "(http://www.rebar3.org/v3.0/docs/releases)", []),
+ "(http://www.rebar3.org/docs/releases)", []),
Normalized = normalize_boot_apps(Apps),
Res = [application:ensure_all_started(App) || App <- Normalized],
_ = [?INFO("Booted ~p", [App])
@@ -352,11 +352,15 @@ boot_apps(Apps) ->
normalize_load_apps([]) -> [];
normalize_load_apps([{App, _} | T]) -> [App | normalize_load_apps(T)];
normalize_load_apps([{App, _Vsn, load} | T]) -> [App | normalize_load_apps(T)];
+normalize_load_apps([{App, _Vsn, Operator} | T]) when is_atom(Operator) ->
+ [App | normalize_load_apps(T)];
normalize_load_apps([App | T]) when is_atom(App) -> [App | normalize_load_apps(T)].
normalize_boot_apps([]) -> [];
normalize_boot_apps([{_App, load} | T]) -> normalize_boot_apps(T);
normalize_boot_apps([{_App, _Vsn, load} | T]) -> normalize_boot_apps(T);
+normalize_boot_apps([{App, _Vsn, Operator} | T]) when is_atom(Operator) ->
+ [App | normalize_boot_apps(T)];
normalize_boot_apps([{App, _Vsn} | T]) -> [App | normalize_boot_apps(T)];
normalize_boot_apps([App | T]) when is_atom(App) -> [App | normalize_boot_apps(T)].
diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl
index 7e0aae4..e64ce71 100644
--- a/src/rebar_templater.erl
+++ b/src/rebar_templater.erl
@@ -33,7 +33,7 @@
-include("rebar.hrl").
--define(TEMPLATE_RE, "^(?!._).*\\.template\$").
+-define(TEMPLATE_RE, "^(?!\\._).*\\.template\$").
%% ===================================================================
%% Public API