summaryrefslogtreecommitdiff
path: root/src/rebar_utils.erl
diff options
context:
space:
mode:
authorDave Smith <dizzyd@dizzyd.com>2011-10-25 23:59:50 -0600
committerTuncer Ayaz <tuncer.ayaz@gmail.com>2011-10-26 23:16:36 +0200
commit17616d1078063ea0748d009e3a111c4b615262e8 (patch)
treed714ece6f68f8ee1085c8b7edbcabe7385b70c32 /src/rebar_utils.erl
parentb65d5904f555874e24a4610ea63d8c10ecf62448 (diff)
Overhaul environment expansion for better performance
The introduction of setup_env as a global concept caused the rebar_port_compiler implementation to start getting called a LOT. The expansion of environment variables that happens in the port compiler was O(n^n), which means you could see upwards of 80k invocations of lists:foldl on a single app "./rebar clean". This commit reworks the expansion to be O(n^2), and reduces the running time for the same operation by 60%+. On a large project like Riak, the end result is that a build went from 200 seconds to 73.
Diffstat (limited to 'src/rebar_utils.erl')
-rw-r--r--src/rebar_utils.erl18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 84567ba..88c0c25 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -186,12 +186,18 @@ expand_code_path() ->
%% The end of form $FOO is delimited with whitespace or eol
%%
expand_env_variable(InStr, VarName, RawVarValue) ->
- ReOpts = [global, {return, list}],
- VarValue = re:replace(RawVarValue, "\\\\", "\\\\\\\\", ReOpts),
- R1 = re:replace(InStr, "\\\$" ++ VarName ++ "\\s", VarValue ++ " ",
- [global]),
- R2 = re:replace(R1, "\\\$" ++ VarName ++ "\$", VarValue),
- re:replace(R2, "\\\${" ++ VarName ++ "}", VarValue, ReOpts).
+ case string:chr(InStr, $$) of
+ 0 ->
+ %% No variables to expand
+ InStr;
+ _ ->
+ ReOpts = [global, {return, list}],
+ VarValue = re:replace(RawVarValue, "\\\\", "\\\\\\\\", [global]),
+ %% Use a regex to match/replace:
+ %% $FOO\s | ${FOO} | $FOO eol
+ RegEx = io_lib:format("\\\$(~s(\\s|$)|{~s})", [VarName, VarName]),
+ re:replace(InStr, RegEx, VarValue ++ "\\2", ReOpts)
+ end.
%% ====================================================================