Mercurial > hg-stable
changeset 50507:5a2fb64d38b2
store: use specialized class for store entries
We introduce two different classes for revlog and other entries. For now, we
still have multiple entry for the same revlog, but we will work toward grouping
the different file in a single entry in this series.
Having the distinction is a step toward this goal.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 15 May 2023 08:56:56 +0200 |
parents | 9fdc28e21b68 |
children | c37450a5f1dc |
files | hgext/remotefilelog/remotefilelogserver.py mercurial/store.py |
diffstat | 2 files changed, 44 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/remotefilelog/remotefilelogserver.py Mon May 15 08:56:40 2023 +0200 +++ b/hgext/remotefilelog/remotefilelogserver.py Mon May 15 08:56:56 2023 +0200 @@ -162,11 +162,8 @@ ): n = util.pconvert(fp[striplen:]) d = store.decodedir(n) - yield store.StoreEntry( + yield store.SimpleStoreEntry( unencoded_path=d, - is_revlog=True, - revlog_type=None, - is_revlog_main=False, is_volatile=False, file_size=st.st_size, )
--- a/mercurial/store.py Mon May 15 08:56:40 2023 +0200 +++ b/mercurial/store.py Mon May 15 08:56:56 2023 +0200 @@ -454,15 +454,12 @@ @attr.s(slots=True) -class StoreEntry: +class BaseStoreEntry: """An entry in the store This is returned by `store.walk` and represent some data in the store.""" unencoded_path = attr.ib() - is_revlog = attr.ib(default=False) - revlog_type = attr.ib(default=None) - is_revlog_main = attr.ib(default=None) is_volatile = attr.ib(default=False) file_size = attr.ib(default=None) @@ -477,6 +474,22 @@ @attr.s(slots=True) +class SimpleStoreEntry(BaseStoreEntry): + """A generic entry in the store""" + + is_revlog = False + + +@attr.s(slots=True) +class RevlogStoreEntry(BaseStoreEntry): + """A revlog entry in the store""" + + is_revlog = True + revlog_type = attr.ib(default=None) + is_revlog_main = attr.ib(default=None) + + +@attr.s(slots=True) class StoreFile: """a file matching an entry""" @@ -536,7 +549,7 @@ def datafiles( self, matcher=None, undecodable=None - ) -> Generator[StoreEntry, None, None]: + ) -> Generator[BaseStoreEntry, None, None]: """Like walk, but excluding the changelog and root manifest. When [undecodable] is None, revlogs names that can't be @@ -546,35 +559,42 @@ files = self._walk(b'data', True) + self._walk(b'meta', True) for (t, u, s) in files: if t is not None: - yield StoreEntry( + yield RevlogStoreEntry( unencoded_path=u, - is_revlog=True, revlog_type=FILEFLAGS_FILELOG, is_revlog_main=bool(t & FILEFLAGS_REVLOG_MAIN), is_volatile=bool(t & FILEFLAGS_VOLATILE), file_size=s, ) - def topfiles(self) -> Generator[StoreEntry, None, None]: + def topfiles(self) -> Generator[BaseStoreEntry, None, None]: # yield manifest before changelog files = reversed(self._walk(b'', False)) for (t, u, s) in files: if u.startswith(b'00changelog'): - revlog_type = FILEFLAGS_CHANGELOG + yield RevlogStoreEntry( + unencoded_path=u, + revlog_type=FILEFLAGS_CHANGELOG, + is_revlog_main=bool(t & FILEFLAGS_REVLOG_MAIN), + is_volatile=bool(t & FILEFLAGS_VOLATILE), + file_size=s, + ) elif u.startswith(b'00manifest'): - revlog_type = FILEFLAGS_MANIFESTLOG + yield RevlogStoreEntry( + unencoded_path=u, + revlog_type=FILEFLAGS_MANIFESTLOG, + is_revlog_main=bool(t & FILEFLAGS_REVLOG_MAIN), + is_volatile=bool(t & FILEFLAGS_VOLATILE), + file_size=s, + ) else: - revlog_type = None - yield StoreEntry( - unencoded_path=u, - is_revlog=revlog_type is not None, - revlog_type=revlog_type, - is_revlog_main=bool(t & FILEFLAGS_REVLOG_MAIN), - is_volatile=bool(t & FILEFLAGS_VOLATILE), - file_size=s, - ) + yield SimpleStoreEntry( + unencoded_path=u, + is_volatile=bool(t & FILEFLAGS_VOLATILE), + file_size=s, + ) - def walk(self, matcher=None) -> Generator[StoreEntry, None, None]: + def walk(self, matcher=None) -> Generator[BaseStoreEntry, None, None]: """return files related to data storage (ie: revlogs) yields (file_type, unencoded, size) @@ -629,7 +649,7 @@ def datafiles( self, matcher=None, undecodable=None - ) -> Generator[StoreEntry, None, None]: + ) -> Generator[BaseStoreEntry, None, None]: for entry in super(encodedstore, self).datafiles(): try: f1 = entry.unencoded_path @@ -842,7 +862,7 @@ def datafiles( self, matcher=None, undecodable=None - ) -> Generator[StoreEntry, None, None]: + ) -> Generator[BaseStoreEntry, None, None]: for f in sorted(self.fncache): if not _matchtrackedpath(f, matcher): continue @@ -854,11 +874,9 @@ # However the fncache might contains such file added by # previous version of Mercurial. continue - t |= FILEFLAGS_FILELOG try: - yield StoreEntry( + yield RevlogStoreEntry( unencoded_path=f, - is_revlog=True, revlog_type=FILEFLAGS_FILELOG, is_revlog_main=bool(t & FILEFLAGS_REVLOG_MAIN), is_volatile=bool(t & FILEFLAGS_VOLATILE),