diff options
author | Dave Smith <dizzyd@dizzyd.com> | 2011-10-25 23:59:50 -0600 |
---|---|---|
committer | Tuncer Ayaz <tuncer.ayaz@gmail.com> | 2011-10-26 23:16:36 +0200 |
commit | 17616d1078063ea0748d009e3a111c4b615262e8 (patch) | |
tree | d714ece6f68f8ee1085c8b7edbcabe7385b70c32 /src/rebar_utils.erl | |
parent | b65d5904f555874e24a4610ea63d8c10ecf62448 (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.erl | 18 |
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. %% ==================================================================== |