comparison mercurial/changegroup.py @ 38981:227ebd88ce5e

changegroup: pull _fileheader out of cgpacker It doesn't need any state from the packer. Differential Revision: https://phab.mercurial-scm.org/D4138
author Gregory Szorc <gregory.szorc@gmail.com>
date Fri, 03 Aug 2018 18:40:41 -0700
parents 4a202bccafcf
children 037debbf869c
comparison
equal deleted inserted replaced
38980:4a202bccafcf 38981:227ebd88ce5e
63 return struct.pack(">l", length + 4) 63 return struct.pack(">l", length + 4)
64 64
65 def closechunk(): 65 def closechunk():
66 """return a changegroup chunk header (string) for a zero-length chunk""" 66 """return a changegroup chunk header (string) for a zero-length chunk"""
67 return struct.pack(">l", 0) 67 return struct.pack(">l", 0)
68
69 def _fileheader(path):
70 """Obtain a changegroup chunk header for a named path."""
71 return chunkheader(len(path)) + path
68 72
69 def writechunks(ui, chunks, filename, vfs=None): 73 def writechunks(ui, chunks, filename, vfs=None):
70 """Write chunks to a file and return its filename. 74 """Write chunks to a file and return its filename.
71 75
72 The stream is assumed to be a bundle file. 76 The stream is assumed to be a bundle file.
604 self._clrevtolocalrev = self._nextclrevtolocalrev 608 self._clrevtolocalrev = self._nextclrevtolocalrev
605 self._nextclrevtolocalrev = None 609 self._nextclrevtolocalrev = None
606 610
607 return closechunk() 611 return closechunk()
608 612
609 def _fileheader(self, fname):
610 return chunkheader(len(fname)) + fname
611
612 # Extracted both for clarity and for overriding in extensions. 613 # Extracted both for clarity and for overriding in extensions.
613 def _sortgroup(self, store, ischangelog, nodelist, lookup): 614 def _sortgroup(self, store, ischangelog, nodelist, lookup):
614 """Sort nodes for change group and turn them into revnums.""" 615 """Sort nodes for change group and turn them into revnums."""
615 # Ellipses serving mode. 616 # Ellipses serving mode.
616 # 617 #
699 can be sent. Multiple manifests is not supported by cg1 and cg2. 700 can be sent. Multiple manifests is not supported by cg1 and cg2.
700 """ 701 """
701 702
702 if dir: 703 if dir:
703 assert self.version == b'03' 704 assert self.version == b'03'
704 yield self._fileheader(dir) 705 yield _fileheader(dir)
705 706
706 # TODO violates storage abstractions by assuming revlogs. 707 # TODO violates storage abstractions by assuming revlogs.
707 dirlog = self._repo.manifestlog._revlog.dirlog(dir) 708 dirlog = self._repo.manifestlog._revlog.dirlog(dir)
708 for chunk in self.group(mfnodes, dirlog, False, lookuplinknode, 709 for chunk in self.group(mfnodes, dirlog, False, lookuplinknode,
709 units=_('manifests')): 710 units=_('manifests')):
979 return linkrevnodes[x] 980 return linkrevnodes[x]
980 981
981 filenodes = self._prune(filerevlog, linkrevnodes, commonrevs) 982 filenodes = self._prune(filerevlog, linkrevnodes, commonrevs)
982 if filenodes: 983 if filenodes:
983 progress.update(i + 1, item=fname) 984 progress.update(i + 1, item=fname)
984 h = self._fileheader(fname) 985 h = _fileheader(fname)
985 size = len(h) 986 size = len(h)
986 yield h 987 yield h
987 for chunk in self.group(filenodes, filerevlog, False, 988 for chunk in self.group(filenodes, filerevlog, False,
988 lookupfilelog): 989 lookupfilelog):
989 size += len(chunk) 990 size += len(chunk)