From ba915bb290ad6692d63c02345acb8d215bc9ad6f Mon Sep 17 00:00:00 2001 From: Jim Paris Date: Fri, 23 Aug 2019 16:23:07 -0400 Subject: [PATCH] Use os.replace instead of os.remove; remove a "no cover" --- nilmdb/utils/atomic.py | 12 ++---------- tests/test_misc.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/nilmdb/utils/atomic.py b/nilmdb/utils/atomic.py index 0d236ea..6facce0 100644 --- a/nilmdb/utils/atomic.py +++ b/nilmdb/utils/atomic.py @@ -4,8 +4,7 @@ import os def replace_file(filename, content): """Attempt to atomically and durably replace the filename with the - given contents. This is intended to be 'pretty good on most - OSes', but not necessarily bulletproof.""" + given contents""" newfilename = filename + b".new" @@ -16,11 +15,4 @@ def replace_file(filename, content): os.fsync(f.fileno()) # Move new file over old one - try: - os.rename(newfilename, filename) - except OSError: # pragma: no cover - # Some OSes might not support renaming over an existing file. - # This is definitely NOT atomic! - os.remove(filename) - os.rename(newfilename, filename) - + os.replace(newfilename, filename) diff --git a/tests/test_misc.py b/tests/test_misc.py index 70195d5..da9cf76 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -32,3 +32,15 @@ class TestMisc(object): return None with assert_raises(TypeError): nilmdb.utils.lock.exclusive_lock(FakeFile()) + + def test_replace_file(self): + fn = b"tests/misc-testdb/file" + try: + os.mkdir(os.path.dirname(fn)) + except FileExistsError: + pass + with open(fn, "wb") as f: + f.write(b"hello, world") + nilmdb.utils.atomic.replace_file(fn, b"goodbye, world") + with open(fn, "rb") as f: + eq_(f.read(), b"goodbye, world")