summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2012-08-17 17:25:21 (GMT)
committerEvan Martin <martine@danga.com>2012-08-17 17:35:41 (GMT)
commit697350d1220f50c32043875b49c71c8a294098a4 (patch)
tree970abb9bdef44e79f49423a1cf5646bb8e5743cd
parent413103c4c472410c10da179a841b5e3b05e576c0 (diff)
downloadNinja-697350d1220f50c32043875b49c71c8a294098a4.zip
Ninja-697350d1220f50c32043875b49c71c8a294098a4.tar.gz
Ninja-697350d1220f50c32043875b49c71c8a294098a4.tar.bz2
make it more explicit that a bad build log causes us to rebuild
(Committing this on top of b56fe80 since they're related, but I may end up reverting both.)
-rw-r--r--src/build_log.cc9
-rw-r--r--src/build_log_test.cc2
-rw-r--r--src/ninja.cc5
3 files changed, 12 insertions, 4 deletions
diff --git a/src/build_log.cc b/src/build_log.cc
index e72a93e..73c2b5d 100644
--- a/src/build_log.cc
+++ b/src/build_log.cc
@@ -235,10 +235,13 @@ bool BuildLog::Load(const string& path, string* err) {
sscanf(line_start, kFileSignature, &log_version);
if (log_version < kOldestSupportedVersion) {
- *err = "unable to extract version from build log, perhaps due to "
- "being too old; you must clobber your build output and rebuild";
+ *err = ("build log version invalid, perhaps due to being too old; "
+ "starting over");
fclose(file);
- return false;
+ unlink(path.c_str());
+ // Don't report this as a failure. An empty build log will cause
+ // us to rebuild the outputs anyway.
+ return true;
}
}
diff --git a/src/build_log_test.cc b/src/build_log_test.cc
index 186dad9..3005333 100644
--- a/src/build_log_test.cc
+++ b/src/build_log_test.cc
@@ -154,7 +154,7 @@ TEST_F(BuildLogTest, ObsoleteOldVersion) {
string err;
BuildLog log;
- EXPECT_FALSE(log.Load(kTestFilename, &err));
+ EXPECT_TRUE(log.Load(kTestFilename, &err));
ASSERT_NE(err.find("version"), string::npos);
}
diff --git a/src/ninja.cc b/src/ninja.cc
index 00bd104..19438e5 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -759,6 +759,11 @@ reload:
Error("loading build log %s: %s", log_path.c_str(), err.c_str());
return 1;
}
+ if (!err.empty()) {
+ // Hack: Load() can return a warning via err by returning true.
+ Warning("%s", err.c_str());
+ err.clear();
+ }
if (!build_log.OpenForWrite(log_path, &err)) {
Error("opening build log: %s", err.c_str());