Mercurial > public > mercurial-scm > hg-stable
diff mercurial/bundle2.py @ 20891:1c6cd23fc221
bundle2: add some distinction between mandatory and advisory part
Mandatory part cannot be ignored when unknown. We raise a simple KeyError
exception when this happen.
This is very early version of this logic, see inline comment for future
improvement lead.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Mon, 24 Mar 2014 13:02:02 -0700 |
parents | ec7fc110faee |
children | 6fe95448596d |
line wrap: on
line diff
--- a/mercurial/bundle2.py Mon Mar 24 15:51:00 2014 -0700 +++ b/mercurial/bundle2.py Mon Mar 24 13:02:02 2014 -0700 @@ -119,6 +119,19 @@ The current implementation always produces either zero or one chunk. This is an implementation limitation that will ultimatly be lifted. + +Bundle processing +============================ + +Each part is processed in order using a "part handler". Handler are registered +for a certain part type. + +The matching of a part to its handler is case insensitive. The case of the +part type is used to know if a part is mandatory or advisory. If the Part type +contains any uppercase char it is considered mandatory. When no handler is +known for a Mandatory part, the process is aborted and an exception is raised. +If the part is advisory and no handler is known, the part is ignored. + """ import util @@ -161,8 +174,9 @@ ... """ def _decorator(func): - assert parttype not in parthandlermapping - parthandlermapping[parttype] = func + lparttype = parttype.lower() # enforce lower case matching. + assert lparttype not in parthandlermapping + parthandlermapping[lparttype] = func return func return _decorator @@ -179,8 +193,7 @@ This is very early version of this function that will be strongly reworked before final usage. - All unknown parts are currently ignored (Mandatory parts logic will comes - later). + Unknown Mandatory part will abort the process. """ ui = repo.ui # Extraction of the unbundler object will most likely change. It may be @@ -200,6 +213,11 @@ handler = parthandlermapping[key] ui.debug('found an handler for part %r\n' % parttype) except KeyError: + if key != parttype: # mandatory parts + # todo: + # - use a more precise exception + # - consume the bundle2 stream anyway. + raise ui.debug('ignoring unknown advisory part %r\n' % key) # todo: consume the part (once we use streamed parts) continue