mercurial/utils/storageutil.py
changeset 40427 59a870a4ad6e
parent 40325 b0fbd1792e2d
child 40432 968dd7e02ac5
equal deleted inserted replaced
40425:5e5c8f2a1eb5 40427:59a870a4ad6e
    20 from .. import (
    20 from .. import (
    21     dagop,
    21     dagop,
    22     error,
    22     error,
    23     mdiff,
    23     mdiff,
    24     pycompat,
    24     pycompat,
       
    25     repository,
    25 )
    26 )
    26 
    27 
    27 _nullhash = hashlib.sha1(nullid)
    28 _nullhash = hashlib.sha1(nullid)
    28 
    29 
    29 def hashrevisionsha1(text, p1, p2):
    30 def hashrevisionsha1(text, p1, p2):
   267 
   268 
   268     return strippoint, brokenrevs
   269     return strippoint, brokenrevs
   269 
   270 
   270 def emitrevisions(store, nodes, nodesorder, resultcls, deltaparentfn=None,
   271 def emitrevisions(store, nodes, nodesorder, resultcls, deltaparentfn=None,
   271                   candeltafn=None, rawsizefn=None, revdifffn=None, flagsfn=None,
   272                   candeltafn=None, rawsizefn=None, revdifffn=None, flagsfn=None,
   272                   sendfulltext=False,
   273                   deltamode=repository.CG_DELTAMODE_STD,
   273                   revisiondata=False, assumehaveparentrevisions=False,
   274                   revisiondata=False, assumehaveparentrevisions=False):
   274                   deltaprevious=False):
       
   275     """Generic implementation of ifiledata.emitrevisions().
   275     """Generic implementation of ifiledata.emitrevisions().
   276 
   276 
   277     Emitting revision data is subtly complex. This function attempts to
   277     Emitting revision data is subtly complex. This function attempts to
   278     encapsulate all the logic for doing so in a backend-agnostic way.
   278     encapsulate all the logic for doing so in a backend-agnostic way.
   279 
   279 
   320 
   320 
   321     ``flagsfn`` (optional)
   321     ``flagsfn`` (optional)
   322        Callable receiving a revision number and returns the integer flags
   322        Callable receiving a revision number and returns the integer flags
   323        value for it. If not defined, flags value will be 0.
   323        value for it. If not defined, flags value will be 0.
   324 
   324 
   325     ``sendfulltext``
   325     ``deltamode``
       
   326        constaint on delta to be sent:
       
   327        * CG_DELTAMODE_STD  - normal mode, try to reuse storage deltas,
       
   328        * CG_DELTAMODE_PREV - only delta against "prev",
       
   329        * CG_DELTAMODE_FULL - only issue full snapshot.
       
   330 
   326        Whether to send fulltext revisions instead of deltas, if allowed.
   331        Whether to send fulltext revisions instead of deltas, if allowed.
   327 
   332 
   328     ``nodesorder``
   333     ``nodesorder``
   329     ``revisiondata``
   334     ``revisiondata``
   330     ``assumehaveparentrevisions``
   335     ``assumehaveparentrevisions``
   331     ``deltaprevious``
       
   332        See ``ifiledata.emitrevisions()`` interface documentation.
       
   333     """
   336     """
   334 
   337 
   335     fnode = store.node
   338     fnode = store.node
   336     frev = store.rev
   339     frev = store.rev
   337 
   340 
   343         revs = set(frev(n) for n in nodes)
   346         revs = set(frev(n) for n in nodes)
   344         revs = dagop.linearize(revs, store.parentrevs)
   347         revs = dagop.linearize(revs, store.parentrevs)
   345 
   348 
   346     prevrev = None
   349     prevrev = None
   347 
   350 
   348     if deltaprevious or assumehaveparentrevisions:
   351     if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions:
   349         prevrev = store.parentrevs(revs[0])[0]
   352         prevrev = store.parentrevs(revs[0])[0]
   350 
   353 
   351     # Set of revs available to delta against.
   354     # Set of revs available to delta against.
   352     available = set()
   355     available = set()
   353 
   356 
   362             deltaparentrev = deltaparentfn(rev)
   365             deltaparentrev = deltaparentfn(rev)
   363         else:
   366         else:
   364             deltaparentrev = nullrev
   367             deltaparentrev = nullrev
   365 
   368 
   366         # Forced delta against previous mode.
   369         # Forced delta against previous mode.
   367         if deltaprevious:
   370         if deltamode == repository.CG_DELTAMODE_PREV:
   368             baserev = prevrev
   371             baserev = prevrev
   369 
   372 
   370         # We're instructed to send fulltext. Honor that.
   373         # We're instructed to send fulltext. Honor that.
   371         elif sendfulltext:
   374         elif deltamode == repository.CG_DELTAMODE_FULL:
   372             baserev = nullrev
   375             baserev = nullrev
   373 
   376 
   374         # There is a delta in storage. We try to use that because it
   377         # There is a delta in storage. We try to use that because it
   375         # amounts to effectively copying data from storage and is
   378         # amounts to effectively copying data from storage and is
   376         # therefore the fastest.
   379         # therefore the fastest.
   425                         baserevisionsize = rawsizefn(baserev)
   428                         baserevisionsize = rawsizefn(baserev)
   426                     else:
   429                     else:
   427                         baserevisionsize = len(store.revision(baserev,
   430                         baserevisionsize = len(store.revision(baserev,
   428                                                               raw=True))
   431                                                               raw=True))
   429 
   432 
   430             elif baserev == nullrev and not deltaprevious:
   433             elif (baserev == nullrev
       
   434                     and deltamode != repository.CG_DELTAMODE_PREV):
   431                 revision = store.revision(node, raw=True)
   435                 revision = store.revision(node, raw=True)
   432                 available.add(rev)
   436                 available.add(rev)
   433             else:
   437             else:
   434                 if revdifffn:
   438                 if revdifffn:
   435                     delta = revdifffn(baserev, rev)
   439                     delta = revdifffn(baserev, rev)