From 5178693db324229b39d5d514c02c2de219eac736 Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Wed, 20 Oct 2010 22:51:37 -0700 Subject: [PATCH] attempt to flush out a bug with a test, fail --- ninja.cc | 4 ++-- ninja.h | 5 ++++- ninja_test.cc | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ninja.cc b/ninja.cc index 6e39145..9c49dc4 100644 --- a/ninja.cc +++ b/ninja.cc @@ -14,10 +14,10 @@ int main(int argc, char** argv) { return 1; } + state.stat_cache()->Dump(); Shell shell; Builder builder(&state); - Node* node = builder.AddTarget(argv[1]); - node->in_edge_->RecomputeDirty(builder.stat_helper_); + builder.AddTarget(argv[1]); state.stat_cache()->Dump(); bool success = builder.Build(&shell, &err); diff --git a/ninja.h b/ninja.h index f2044ca..bf4d20f 100644 --- a/ninja.h +++ b/ninja.h @@ -404,8 +404,11 @@ struct Builder { virtual ~Builder() {} Node* AddTarget(const string& name) { - Node* node = plan_.AddTarget(name); + Node* node = plan_.state_->GetNode(name); node->file_->StatIfNecessary(stat_helper_); + if (node->in_edge_) + node->in_edge_->RecomputeDirty(stat_helper_); + plan_.AddTarget(node); return node; } bool Build(Shell* shell, string* err); diff --git a/ninja_test.cc b/ninja_test.cc index d870ddd..bd3645b 100644 --- a/ninja_test.cc +++ b/ninja_test.cc @@ -336,3 +336,23 @@ TEST_F(StatTest, Tree) { ASSERT_TRUE(GetNode("mid1")->dirty_); ASSERT_EQ("in11", stats_[2]); } + + +TEST_F(StatTest, Middle) { + ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, +"build out: cat mid\n" +"build mid: cat in\n")); + + mtimes_["out"] = 1; + // mid remains missing. + mtimes_["in"] = 1; + + Node* out = GetNode("out"); + out->file_->Stat(this); + ASSERT_EQ(1, stats_.size()); + Edge* edge = out->in_edge_; + edge->RecomputeDirty(this); + ASSERT_FALSE(GetNode("in")->dirty_); + ASSERT_TRUE(GetNode("mid")->dirty_); + ASSERT_TRUE(GetNode("out")->dirty_); +} -- 2.7.4