Build self-consistent graphs for dupe edges with multiple outputs.
authorNico Weber <nicolasweber@gmx.de>
Sun, 15 Mar 2015 23:34:03 +0000 (19:34 -0400)
committerNico Weber <nicolasweber@gmx.de>
Sun, 15 Mar 2015 23:34:03 +0000 (19:34 -0400)
commit56e9d08c028d2c16f787041dc1f41271464a8bdc
tree7c666efb09121fba46787e3bd3b47bf28ddeb5f2
parent51f06facf46e7a1a5338a4ca2ec9b8441c44c405
Build self-consistent graphs for dupe edges with multiple outputs.

Fixes #867, both the crashes and "[stuck]" issues.

The problem was that a duplicate edge would modify the in_edge of the
outputs of the new build rule, but the edge corresponding to the old
build rule would still think that the in_edge points to itself.
`old_edge->outputs_[0]->in_edge()` would not return `old_edge`, which
confused the scan logic.

As fix, let `State::AddOut()` reject changing in_edge if it's already
set.  This changes behavior in a minor way: Previously, if there were
multiple edges for a single output, the last edge would be kept.  Now,
the first edge is kept.  This only had mostly-well-defined semantics if
all duplicate edges are the same (which is the only case I've seen in
practice), and for that case the behavior doesn't change.

For testing, add a VerifyGraph() function and call that every time any
test graph is parsed.  That's a bit more code than just copying the test
cases from the bug into build_test.cc, but it also yields better test
coverage overall.
src/manifest_parser.cc
src/manifest_parser_test.cc
src/state.cc
src/test.cc
src/test.h