From f805bc6bfb233d78c4faffe1e262ceb14e2912a3 Mon Sep 17 00:00:00 2001 From: Rio Yu <52408936+rioyu123@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:28:20 +0800 Subject: [PATCH] fix: preserve memory filesystem entries on same-path rename --- pyglove/core/io/file_system.py | 2 ++ pyglove/core/io/file_system_test.py | 30 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/pyglove/core/io/file_system.py b/pyglove/core/io/file_system.py index 0cdfee1..e28156c 100644 --- a/pyglove/core/io/file_system.py +++ b/pyglove/core/io/file_system.py @@ -447,6 +447,8 @@ def rename( raise FileNotFoundError(oldpath_str) new_entry = self._locate(newpath_str) + if new_entry is entry: + return if new_entry is not None: if isinstance(entry, dict): # oldpath is dir if not isinstance(new_entry, dict): diff --git a/pyglove/core/io/file_system_test.py b/pyglove/core/io/file_system_test.py index 5ea8d06..217883a 100644 --- a/pyglove/core/io/file_system_test.py +++ b/pyglove/core/io/file_system_test.py @@ -378,6 +378,36 @@ def test_rename(self): with self.assertRaises(FileNotFoundError): fs.rename('/mem/non-existent', '/mem/y') + def test_rename_same_file(self): + fs = file_system.MemoryFileSystem() + fs.mkdirs('/mem/a') + path = '/mem/a/foo.txt' + with fs.open(path, 'w') as f: + f.write('foo') + + fs.rename(path, path) + + with fs.open(path) as f: + self.assertEqual(f.read(), 'foo') + + def test_rename_same_directory(self): + for children in ([], ['b']): + with self.subTest(children=children): + fs = file_system.MemoryFileSystem() + fs.mkdirs('/mem/a') + for child in children: + fs.mkdir('/mem/a/' + child) + + fs.rename('/mem/a', '/mem/a') + + self.assertTrue(fs.isdir('/mem/a')) + self.assertEqual(fs.listdir('/mem/a'), children) + + def test_rename_same_missing_path(self): + fs = file_system.MemoryFileSystem() + with self.assertRaises(FileNotFoundError): + fs.rename('/mem/missing', '/mem/missing') + def test_copy(self): fs = file_system.MemoryFileSystem() fs.mkdirs('/mem/a')