changeset 50661:b59e0a4f692f

store: cache the `files()` return for store entries This make it more efficient to directly use the entries list to retrieve data in various location. It also make the entry record the file size it previously promissed to user code, especially the stream clone code.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sun, 28 May 2023 03:46:48 +0200
parents 8c7b04e69894
children 786443bd3bc1
files mercurial/store.py
diffstat 1 files changed, 20 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/store.py	Sat May 27 04:22:18 2023 +0200
+++ b/mercurial/store.py	Sun May 28 03:46:48 2023 +0200
@@ -475,6 +475,7 @@
     _entry_path = attr.ib()
     _is_volatile = attr.ib(default=False)
     _file_size = attr.ib(default=None)
+    _files = attr.ib(default=None)
 
     def __init__(
         self,
@@ -486,15 +487,18 @@
         self._entry_path = entry_path
         self._is_volatile = is_volatile
         self._file_size = file_size
+        self._files = None
 
     def files(self):
-        return [
-            StoreFile(
-                unencoded_path=self._entry_path,
-                file_size=self._file_size,
-                is_volatile=self._is_volatile,
-            )
-        ]
+        if self._files is None:
+            self._files = [
+                StoreFile(
+                    unencoded_path=self._entry_path,
+                    file_size=self._file_size,
+                    is_volatile=self._is_volatile,
+                )
+            ]
+        return self._files
 
 
 @attr.s(slots=True, init=False)
@@ -507,6 +511,7 @@
     target_id = attr.ib(default=None)
     _path_prefix = attr.ib(default=None)
     _details = attr.ib(default=None)
+    _files = attr.ib(default=None)
 
     def __init__(
         self,
@@ -521,6 +526,7 @@
         self._path_prefix = path_prefix
         assert b'.i' in details, (path_prefix, details)
         self._details = details
+        self._files = None
 
     @property
     def is_changelog(self):
@@ -539,12 +545,13 @@
         return self._path_prefix + b'.i'
 
     def files(self):
-        files = []
-        for ext in sorted(self._details, key=_ext_key):
-            path = self._path_prefix + ext
-            data = self._details[ext]
-            files.append(StoreFile(unencoded_path=path, **data))
-        return files
+        if self._files is None:
+            self._files = []
+            for ext in sorted(self._details, key=_ext_key):
+                path = self._path_prefix + ext
+                data = self._details[ext]
+                self._files.append(StoreFile(unencoded_path=path, **data))
+        return self._files
 
     def get_revlog_instance(self, repo):
         """Obtain a revlog instance from this store entry