Let DepsLog::RecordDeps() update its in-memory representation.
authorNico Weber <nicolasweber@gmx.de>
Tue, 30 Apr 2013 15:55:49 +0000 (08:55 -0700)
committerNico Weber <nicolasweber@gmx.de>
Tue, 30 Apr 2013 15:55:49 +0000 (08:55 -0700)
This is a behavior change, but it should be safe: Graph only queries the
deps log at startup, before running any command. Nothing else currently
queries the deps log.

src/deps_log.cc
src/deps_log_test.cc

index 8d90765..fd7d107 100644 (file)
@@ -106,6 +106,7 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
   if (!made_change)
     return true;
 
+  // Update on-disk representation.
   uint16_t size = 4 * (1 + 1 + (uint16_t)node_count);
   size |= 0x8000;  // Deps record: set high bit.
   fwrite(&size, 2, 1, file_);
@@ -118,6 +119,12 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
     fwrite(&id, 4, 1, file_);
   }
 
+  // Update in-memory representation.
+  Deps* deps = new Deps(mtime, node_count);
+  for (int i = 0; i < node_count; ++i)
+    deps->nodes[i] = nodes[i];
+  UpdateDeps(node->id(), deps);
+
   return true;
 }
 
index 14f1572..31f0414 100644 (file)
@@ -49,6 +49,13 @@ TEST_F(DepsLogTest, WriteRead) {
     deps.push_back(state1.GetNode("foo.h"));
     deps.push_back(state1.GetNode("bar2.h"));
     log1.RecordDeps(state1.GetNode("out2.o"), 2, deps);
+
+    DepsLog::Deps* log_deps = log1.GetDeps(state1.GetNode("out.o"));
+    ASSERT_TRUE(log_deps);
+    ASSERT_EQ(1, log_deps->mtime);
+    ASSERT_EQ(2, log_deps->node_count);
+    ASSERT_EQ("foo.h", log_deps->nodes[0]->path());
+    ASSERT_EQ("bar.h", log_deps->nodes[1]->path());
   }
 
   log1.Close();
@@ -66,14 +73,13 @@ TEST_F(DepsLogTest, WriteRead) {
     ASSERT_EQ(node1->id(), node2->id());
   }
 
-  // log1 has no deps entries, as it was only used for writing.
-  // Manually check the entries in log2.
-  DepsLog::Deps* deps = log2.GetDeps(state2.GetNode("out.o"));
-  ASSERT_TRUE(deps);
-  ASSERT_EQ(1, deps->mtime);
-  ASSERT_EQ(2, deps->node_count);
-  ASSERT_EQ("foo.h", deps->nodes[0]->path());
-  ASSERT_EQ("bar.h", deps->nodes[1]->path());
+  // Spot-check the entries in log2.
+  DepsLog::Deps* log_deps = log2.GetDeps(state2.GetNode("out2.o"));
+  ASSERT_TRUE(log_deps);
+  ASSERT_EQ(2, log_deps->mtime);
+  ASSERT_EQ(2, log_deps->node_count);
+  ASSERT_EQ("foo.h", log_deps->nodes[0]->path());
+  ASSERT_EQ("bar2.h", log_deps->nodes[1]->path());
 }
 
 // Verify that adding the same deps twice doesn't grow the file.