summaryrefslogtreecommitdiff
path: root/src/rebar_erlc_compiler.erl
diff options
context:
space:
mode:
authorDavid Kubecka <davidkubecka@seznam.cz>2015-03-23 04:40:52 +0100
committerDavid Kubecka <davidkubecka@seznam.cz>2015-04-06 22:10:15 +0200
commit13fe77d3f5a5e0fb4521d2fbab3280b6d864e82a (patch)
tree5bf9932df8468542f641f048227bcbcb386c04f7 /src/rebar_erlc_compiler.erl
parent22acf8db67b01e25f10ae3fdf19e6199f1012a8b (diff)
downloadrebar-13fe77d3f5a5e0fb4521d2fbab3280b6d864e82a.tar.gz
Avoid extra list traversal when checking for modified source files
Diffstat (limited to 'src/rebar_erlc_compiler.erl')
-rw-r--r--src/rebar_erlc_compiler.erl32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl
index e8b77a6..19dc40a 100644
--- a/src/rebar_erlc_compiler.erl
+++ b/src/rebar_erlc_compiler.erl
@@ -406,16 +406,23 @@ init_erlcinfo(InclDirs, Erls) ->
ok = file:delete(erlcinfo_file())
end,
Dirs = source_and_include_dirs(InclDirs, Erls),
- Updates = [update_erlcinfo(G, Erl, Dirs) || Erl <- Erls],
- Modified = lists:member(modified, Updates),
- ok = store_erlcinfo(G, Modified, InclDirs),
+ Modified = lists:foldl(update_erlcinfo_fun(G, Dirs), false, Erls),
+ if Modified -> store_erlcinfo(G, InclDirs); not Modified -> ok end,
G.
source_and_include_dirs(InclDirs, Erls) ->
SourceDirs = lists:map(fun filename:dirname/1, Erls),
lists:usort(["include" | InclDirs ++ SourceDirs]).
-update_erlcinfo(G, Source, Dirs) ->
+update_erlcinfo_fun(G, Dirs) ->
+ fun(Erl, Modified) ->
+ case update_erlcinfo(G, Dirs, Erl) of
+ modified -> true;
+ unmodified -> Modified
+ end
+ end.
+
+update_erlcinfo(G, Dirs, Source) ->
case digraph:vertex(G, Source) of
{_, LastUpdated} ->
case filelib:last_modified(Source) of
@@ -426,14 +433,12 @@ update_erlcinfo(G, Source, Dirs) ->
digraph:del_vertex(G, Source),
modified;
LastModified when LastUpdated < LastModified ->
- modify_erlcinfo(G, Source, Dirs),
- modified;
+ modify_erlcinfo(G, Source, Dirs);
_ ->
unmodified
end;
false ->
- modify_erlcinfo(G, Source, Dirs),
- modified
+ modify_erlcinfo(G, Source, Dirs)
end.
modify_erlcinfo(G, Source, Dirs) ->
@@ -445,9 +450,10 @@ modify_erlcinfo(G, Source, Dirs) ->
digraph:add_vertex(G, Source, LastUpdated),
lists:foreach(
fun(Incl) ->
- update_erlcinfo(G, Incl, Dirs),
+ update_erlcinfo(G, Dirs, Incl),
digraph:add_edge(G, Source, Incl)
- end, AbsIncls).
+ end, AbsIncls),
+ modified.
restore_erlcinfo(G, InclDirs) ->
case file:read_file(erlcinfo_file()) of
@@ -468,9 +474,7 @@ restore_erlcinfo(G, InclDirs) ->
ok
end.
-store_erlcinfo(_G, _Modified = false, _InclDirs) ->
- ok;
-store_erlcinfo(G, _Modified, InclDirs) ->
+store_erlcinfo(G, InclDirs) ->
Vs = lists:map(
fun(V) ->
digraph:vertex(G, V)
@@ -486,7 +490,7 @@ store_erlcinfo(G, _Modified, InclDirs) ->
File = erlcinfo_file(),
ok = filelib:ensure_dir(File),
Data = term_to_binary(#erlcinfo{info={Vs, Es, InclDirs}}, [{compressed, 9}]),
- file:write_file(File, Data).
+ ok = file:write_file(File, Data).
%% NOTE: If, for example, one of the entries in Files refers to
%% gen_server.erl, that entry will be dropped. It is dropped because