namespace {
const char kFileSignature[] = "# ninja log v%d\n";
+const int kOldestSupportedVersion = 4;
const int kCurrentVersion = 5;
// 64bit MurmurHash2, by Austin Appleby
char* line_end = 0;
while (reader.ReadLine(&line_start, &line_end)) {
if (!log_version) {
- log_version = 1; // Assume by default.
- if (sscanf(line_start, kFileSignature, &log_version) > 0)
- continue;
+ 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";
+ return false;
+ }
}
// If no newline was found in this chunk, read the next.
if (!line_end)
continue;
- char field_separator = log_version >= 4 ? '\t' : ' ';
+ const char kFieldSeparator = '\t';
char* start = line_start;
- char* end = (char*)memchr(start, field_separator, line_end - start);
+ char* end = (char*)memchr(start, kFieldSeparator, line_end - start);
if (!end)
continue;
*end = 0;
start_time = atoi(start);
start = end + 1;
- end = (char*)memchr(start, field_separator, line_end - start);
+ end = (char*)memchr(start, kFieldSeparator, line_end - start);
if (!end)
continue;
*end = 0;
end_time = atoi(start);
start = end + 1;
- end = (char*)memchr(start, field_separator, line_end - start);
+ end = (char*)memchr(start, kFieldSeparator, line_end - start);
if (!end)
continue;
*end = 0;
restat_mtime = atol(start);
start = end + 1;
- end = (char*)memchr(start, field_separator, line_end - start);
+ end = (char*)memchr(start, kFieldSeparator, line_end - start);
if (!end)
continue;
string output = string(start, end - start);
char c = *end; *end = '\0';
entry->command_hash = (uint64_t)strtoull(start, NULL, 10);
*end = c;
- }
- else
+ } else {
entry->command_hash = LogEntry::HashCommand(StringPiece(start,
end - start));
+ }
}
fclose(file);
TEST_F(BuildLogTest, DoubleEntry) {
FILE* f = fopen(kTestFilename, "wb");
- fprintf(f, "# ninja log v3\n");
- fprintf(f, "0 1 2 out command abc\n");
- fprintf(f, "3 4 5 out command def\n");
+ fprintf(f, "# ninja log v4\n");
+ fprintf(f, "0\t1\t2\tout\tcommand abc\n");
+ fprintf(f, "3\t4\t5\tout\tcommand def\n");
fclose(f);
string err;
}
}
-TEST_F(BuildLogTest, UpgradeV3) {
+TEST_F(BuildLogTest, ObsoleteOldVersion) {
FILE* f = fopen(kTestFilename, "wb");
fprintf(f, "# ninja log v3\n");
fprintf(f, "123 456 0 out command\n");
string err;
BuildLog log;
- EXPECT_TRUE(log.Load(kTestFilename, &err));
- ASSERT_EQ("", err);
-
- BuildLog::LogEntry* e = log.LookupByOutput("out");
- ASSERT_TRUE(e);
- ASSERT_EQ(123, e->start_time);
- ASSERT_EQ(456, e->end_time);
- ASSERT_EQ(0, e->restat_mtime);
- ASSERT_NO_FATAL_FAILURE(AssertHash("command", e->command_hash));
+ EXPECT_FALSE(log.Load(kTestFilename, &err));
+ ASSERT_NE(err.find("version"), string::npos);
}
TEST_F(BuildLogTest, SpacesInOutputV4) {