Mercurial > hg
changeset 47230:0e9105bf54cb
revlog: unify checks for supported flag
The new code use a simple declaration to do centralised checking. This is
clearer, shorter and less error prone. This will be especially useful as we plan
to add a fourth format: changelog-v2.
Differential Revision: https://phab.mercurial-scm.org/D10621
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 12:30:35 +0200 |
parents | 21b3e6116bd1 |
children | 4d1c893b9095 |
files | mercurial/revlog.py mercurial/revlogutils/constants.py |
diffstat | 2 files changed, 20 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Mon May 03 12:30:24 2021 +0200 +++ b/mercurial/revlog.py Mon May 03 12:30:35 2021 +0200 @@ -46,6 +46,7 @@ REVLOG_DEFAULT_FLAGS, REVLOG_DEFAULT_FORMAT, REVLOG_DEFAULT_VERSION, + SUPPORTED_FLAGS, ) from .revlogutils.flagutil import ( REVIDX_DEFAULT_FLAGS, @@ -487,33 +488,24 @@ self._format_flags = header & ~0xFFFF self._format_version = header & 0xFFFF + supported_flags = SUPPORTED_FLAGS.get(self._format_version) + if supported_flags is None: + msg = _(b'unknown version (%d) in revlog %s') + msg %= (self._format_version, self.display_id) + raise error.RevlogError(msg) + elif self._format_flags & ~supported_flags: + msg = _(b'unknown flags (%#04x) in version %d revlog %s') + display_flag = self._format_flags >> 16 + msg %= (display_flag, self._format_version, self.display_id) + raise error.RevlogError(msg) + if self._format_version == REVLOGV0: - if self._format_flags: - msg = _(b'unknown flags (%#04x) in version %d revlog %s') - display_flag = self._format_flags >> 16 - msg %= (display_flag, self._format_version, self.display_id) - raise error.RevlogError(msg) - self._inline = False self._generaldelta = False - elif self._format_version == REVLOGV1: - if self._format_flags & ~REVLOGV1_FLAGS: - msg = _(b'unknown flags (%#04x) in version %d revlog %s') - display_flag = self._format_flags >> 16 - msg %= (display_flag, self._format_version, self.display_id) - raise error.RevlogError(msg) - self._inline = self._format_flags & FLAG_INLINE_DATA self._generaldelta = self._format_flags & FLAG_GENERALDELTA - elif self._format_version == REVLOGV2: - if self._format_flags & ~REVLOGV2_FLAGS: - msg = _(b'unknown flags (%#04x) in version %d revlog %s') - display_flag = self._format_flags >> 16 - msg %= (display_flag, self._format_version, self.display_id) - raise error.RevlogError(msg) - # There is a bug in the transaction handling when going from an # inline revlog to a separate index and data file. Turn it off until # it's fixed, since v2 revlogs sometimes get rewritten on exchange. @@ -523,11 +515,8 @@ self._generaldelta = True # revlog-v2 has built in sidedata support self.hassidedata = True - else: - msg = _(b'unknown version (%d) in revlog %s') - msg %= (self._format_version, self.display_id) - raise error.RevlogError(msg) + assert False, 'unreachable' index_data = entry_data self._indexfile = entry_point
--- a/mercurial/revlogutils/constants.py Mon May 03 12:30:24 2021 +0200 +++ b/mercurial/revlogutils/constants.py Mon May 03 12:30:35 2021 +0200 @@ -45,6 +45,7 @@ REVLOG_DEFAULT_FLAGS = FLAG_INLINE_DATA REVLOG_DEFAULT_FORMAT = REVLOGV1 REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS +REVLOGV0_FLAGS = 0 REVLOGV1_FLAGS = FLAG_INLINE_DATA | FLAG_GENERALDELTA REVLOGV2_FLAGS = FLAG_INLINE_DATA @@ -113,4 +114,10 @@ # bitmark for flags that could cause rawdata content change REVIDX_RAWTEXT_CHANGING_FLAGS = REVIDX_ISCENSORED | REVIDX_EXTSTORED +SUPPORTED_FLAGS = { + REVLOGV0: REVLOGV0_FLAGS, + REVLOGV1: REVLOGV1_FLAGS, + REVLOGV2: REVLOGV2_FLAGS, +} + SPARSE_REVLOG_MAX_CHAIN_LENGTH = 1000