summaryrefslogtreecommitdiffstats
path: root/src/deps_log.cc
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2013-04-29 07:42:21 (GMT)
committerNico Weber <nicolasweber@gmx.de>2013-04-29 07:42:21 (GMT)
commit92f48ca30762447864ef808cf62ccd1ca76cd23d (patch)
tree2c91a4dad7586b068d51e673d6d9edd26223ba70 /src/deps_log.cc
parent3699cb6aa2fb29125bf725cb50fbcc593da8a8a1 (diff)
downloadNinja-92f48ca30762447864ef808cf62ccd1ca76cd23d.zip
Ninja-92f48ca30762447864ef808cf62ccd1ca76cd23d.tar.gz
Ninja-92f48ca30762447864ef808cf62ccd1ca76cd23d.tar.bz2
Make sure that recompaction writes a pristine new depslog.
...even if a prior run of DepsLog::Recompact() exited without cleaning up, for example due to a crash or because someone added a `return true;` in the middle of the function while debugging. Or because someone hits ctrl-c during deps log recompaction. No test, because I can't think of a way to trigger this scenario programmatically. Part of issue #554.
Diffstat (limited to 'src/deps_log.cc')
-rw-r--r--src/deps_log.cc5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/deps_log.cc b/src/deps_log.cc
index c52503b..d0d0202 100644
--- a/src/deps_log.cc
+++ b/src/deps_log.cc
@@ -244,6 +244,11 @@ bool DepsLog::Recompact(const string& path, string* err) {
printf("Recompacting deps...\n");
string temp_path = path + ".recompact";
+
+ // OpenForWrite() opens for append. Make sure it's not appending to a
+ // left-over file from a previous recompaction attempt that crashed somehow.
+ unlink(temp_path.c_str());
+
DepsLog new_log;
if (!new_log.OpenForWrite(temp_path, err))
return false;