From 878aa468d144d854005a6d4f0c7785a5185f0bf9 Mon Sep 17 00:00:00 2001 From: von Heydebrand Julian Date: Wed, 13 Mar 2024 16:21:22 +0100 Subject: Gracefully handle outdated .ninja_log during '-t recompact' When we explicitly unlink the file we should return LOAD_NOT_FOUND instead of LOAD_SUCCESS --- misc/output_test.py | 23 +++++++++++++++++++++++ src/build_log.cc | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/misc/output_test.py b/misc/output_test.py index 78848cb..13b0926 100755 --- a/misc/output_test.py +++ b/misc/output_test.py @@ -127,6 +127,29 @@ build a: cat self.assertEqual(run('', flags='-t recompact'), '') self.assertEqual(run('', flags='-t restat'), '') + def test_issue_2048(self): + with tempfile.TemporaryDirectory() as d: + with open(os.path.join(d, 'build.ninja'), 'w'): + pass + + with open(os.path.join(d, '.ninja_log'), 'w') as f: + f.write('# ninja log v4\n') + + try: + output = subprocess.check_output([NINJA_PATH, '-t', 'recompact'], + cwd=d, + env=default_env, + stderr=subprocess.STDOUT, + text=True + ) + + self.assertEqual( + output.strip(), + "ninja: warning: build log version is too old; starting over" + ) + except subprocess.CalledProcessError as err: + self.fail("non-zero exit code with: " + err.output) + def test_status(self): self.assertEqual(run(''), 'ninja: no work to do.\n') self.assertEqual(run('', pipe=True), 'ninja: no work to do.\n') diff --git a/src/build_log.cc b/src/build_log.cc index cf21182..792d1a3 100644 --- a/src/build_log.cc +++ b/src/build_log.cc @@ -291,9 +291,9 @@ LoadStatus BuildLog::Load(const string& path, string* err) { if (invalid_log_version) { fclose(file); unlink(path.c_str()); - // Don't report this as a failure. An empty build log will cause + // Don't report this as a failure. A missing build log will cause // us to rebuild the outputs anyway. - return LOAD_SUCCESS; + return LOAD_NOT_FOUND; } } -- cgit v0.12