diff --git a/swh/storage/in_memory.py b/swh/storage/in_memory.py --- a/swh/storage/in_memory.py +++ b/swh/storage/in_memory.py @@ -450,6 +450,9 @@ The corresponding directory entry if found, None otherwise. """ + return self._directory_entry_get_by_path(directory, paths, b'') + + def _directory_entry_get_by_path(self, directory, paths, prefix): if not paths: return @@ -461,6 +464,8 @@ def _get_entry(entries, name): for entry in entries: if entry['name'] == name: + entry = entry.copy() + entry['name'] = prefix + entry['name'] return entry first_item = _get_entry(contents, paths[0]) @@ -471,8 +476,8 @@ if not first_item or first_item['type'] != 'dir': return - return self.directory_entry_get_by_path( - first_item['target'], paths[1:]) + return self._directory_entry_get_by_path( + first_item['target'], paths[1:], prefix + paths[0] + b'/') def revision_add(self, revisions): """Add revisions to the storage diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py --- a/swh/storage/tests/test_storage.py +++ b/swh/storage/tests/test_storage.py @@ -191,6 +191,18 @@ ], } + self.dir4 = { + 'id': hash_to_bytes('33e45d56f88993aae6a0198013efa80716fd8922'), + 'entries': [ + { + 'name': b'subdir1', + 'type': 'dir', + 'target': self.dir3['id'], + 'perms': from_disk.DentryPerms.directory, + }, + ] + } + self.minus_offset = datetime.timezone(datetime.timedelta(minutes=-120)) self.plus_offset = datetime.timezone(datetime.timedelta(minutes=120)) @@ -930,8 +942,8 @@ init_missing = list(self.storage.directory_missing([self.dir3['id']])) self.assertEqual([self.dir3['id']], init_missing) - actual_result = self.storage.directory_add([self.dir3]) - self.assertEqual(actual_result, {'directory:add': 1}) + actual_result = self.storage.directory_add([self.dir3, self.dir4]) + self.assertEqual(actual_result, {'directory:add': 2}) expected_entries = [ { @@ -980,6 +992,16 @@ [entry['name']]) self.assertEqual(actual_entry, expected_entry) + # same, but deeper + for entry, expected_entry in zip(self.dir3['entries'], + expected_entries): + actual_entry = self.storage.directory_entry_get_by_path( + self.dir4['id'], + [b'subdir1', entry['name']]) + expected_entry = expected_entry.copy() + expected_entry['name'] = b'subdir1/' + expected_entry['name'] + self.assertEqual(actual_entry, expected_entry) + # when (nothing should be found here since self.dir is not persisted.) for entry in self.dir['entries']: actual_entry = self.storage.directory_entry_get_by_path(