diff options
author | Jan Niklas Hasse <jhasse@bixense.com> | 2019-11-16 15:09:06 (GMT) |
---|---|---|
committer | Jan Niklas Hasse <jhasse@bixense.com> | 2019-12-23 13:11:09 (GMT) |
commit | 8f87ee0469820d247fa20971c07dbad5f2aa744e (patch) | |
tree | 6e7fba2da028d4ebfbae6b475cdef636c9e50fd4 /src/ninja.cc | |
parent | a67718de4e5e4f78b6f66c6a3ecd0432941c7df3 (diff) | |
download | Ninja-8f87ee0469820d247fa20971c07dbad5f2aa744e.zip Ninja-8f87ee0469820d247fa20971c07dbad5f2aa744e.tar.gz Ninja-8f87ee0469820d247fa20971c07dbad5f2aa744e.tar.bz2 |
Add restat tool which recalculates all mtimes in the build log
Diffstat (limited to 'src/ninja.cc')
-rw-r--r-- | src/ninja.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/ninja.cc b/src/ninja.cc index c24f09d..8b76ded 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -125,6 +125,7 @@ struct NinjaMain : public BuildLogUser { int ToolClean(const Options* options, int argc, char* argv[]); int ToolCompilationDatabase(const Options* options, int argc, char* argv[]); int ToolRecompact(const Options* options, int argc, char* argv[]); + int ToolRestat(const Options* options, int argc, char* argv[]); int ToolUrtle(const Options* options, int argc, char** argv); int ToolRules(const Options* options, int argc, char* argv[]); @@ -852,6 +853,41 @@ int NinjaMain::ToolRecompact(const Options* options, int argc, char* argv[]) { return 0; } +int NinjaMain::ToolRestat(const Options* options, int argc, char* argv[]) { + if (!EnsureBuildDirExists()) + return 1; + + string log_path = ".ninja_log"; + if (!build_dir_.empty()) + log_path = build_dir_ + "/" + log_path; + + string err; + if (!build_log_.Load(log_path, &err)) { + Error("loading build log %s: %s", log_path.c_str(), err.c_str()); + return EXIT_FAILURE; + } + if (!err.empty()) { + // Hack: Load() can return a warning via err by returning true. + Warning("%s", err.c_str()); + err.clear(); + } + + bool success = build_log_.Restat(log_path, disk_interface_, &err); + if (!success) { + Error("failed recompaction: %s", err.c_str()); + return EXIT_FAILURE; + } + + if (!config_.dry_run) { + if (!build_log_.OpenForWrite(log_path, *this, &err)) { + Error("opening build log: %s", err.c_str()); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} + int NinjaMain::ToolUrtle(const Options* options, int argc, char** argv) { // RLE encoded. const char* urtle = @@ -904,6 +940,8 @@ const Tool* ChooseTool(const string& tool_name) { Tool::RUN_AFTER_LOAD, &NinjaMain::ToolCompilationDatabase }, { "recompact", "recompacts ninja-internal data structures", Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRecompact }, + { "restat", "restats all outputs in the build log", + Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRestat }, { "rules", "list all rules", Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRules }, { "urtle", NULL, |