comparison mercurial/changegroup.py @ 27754:a09f143daaf4

changegroup3: move treemanifest support into _unpackmanifests() By putting the treemanifest code in _unpackmanifests(), _addchangegroupfiles() will only be about files again, and we get a nice symmetry between _packmanifests() and _unpackmanifest(). The immediate benefit to me is that remotefilelog should not need to be updated to work with treemanifests. It should also make server.validate and progress output easier to get right. Probably bundlerepo too.
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 08 Jan 2016 16:12:58 -0800
parents d4071cc73f46
children 7ced54ebf972
comparison
equal deleted inserted replaced
27753:d4071cc73f46 27754:a09f143daaf4
514 version = '03' 514 version = '03'
515 515
516 def _deltaheader(self, headertuple, prevnode): 516 def _deltaheader(self, headertuple, prevnode):
517 node, p1, p2, deltabase, cs, flags = headertuple 517 node, p1, p2, deltabase, cs, flags = headertuple
518 return node, p1, p2, deltabase, cs, flags 518 return node, p1, p2, deltabase, cs, flags
519
520 def _unpackmanifests(self, repo, revmap, trp, prog, numchanges):
521 super(cg3unpacker, self)._unpackmanifests(repo, revmap, trp, prog,
522 numchanges)
523 while True:
524 chunkdata = self.filelogheader()
525 if not chunkdata:
526 break
527 # If we get here, there are directory manifests in the changegroup
528 d = chunkdata["filename"]
529 repo.ui.debug("adding %s revisions\n" % d)
530 dirlog = repo.manifest.dirlog(d)
531 if not dirlog.addgroup(self, revmap, trp):
532 raise error.Abort(_("received dir revlog group is empty"))
519 533
520 class headerlessfixup(object): 534 class headerlessfixup(object):
521 def __init__(self, fh, h): 535 def __init__(self, fh, h):
522 self._h = h 536 self._h = h
523 self._fh = fh 537 self._fh = fh
1053 return changegroupsubset(repo, basenodes, repo.heads(), source) 1067 return changegroupsubset(repo, basenodes, repo.heads(), source)
1054 1068
1055 def _addchangegroupfiles(repo, source, revmap, trp, pr, needfiles): 1069 def _addchangegroupfiles(repo, source, revmap, trp, pr, needfiles):
1056 revisions = 0 1070 revisions = 0
1057 files = 0 1071 files = 0
1058 submfsdone = False
1059 while True: 1072 while True:
1060 chunkdata = source.filelogheader() 1073 chunkdata = source.filelogheader()
1061 if not chunkdata: 1074 if not chunkdata:
1062 if source.version == "03" and not submfsdone:
1063 submfsdone = True
1064 continue
1065 break 1075 break
1066 f = chunkdata["filename"] 1076 f = chunkdata["filename"]
1067 repo.ui.debug("adding %s revisions\n" % f) 1077 repo.ui.debug("adding %s revisions\n" % f)
1068 pr() 1078 pr()
1069 directory = (f[-1] == '/') 1079 fl = repo.file(f)
1070 if directory:
1071 # a directory using treemanifests
1072 fl = repo.manifest.dirlog(f)
1073 else:
1074 fl = repo.file(f)
1075 o = len(fl) 1080 o = len(fl)
1076 try: 1081 try:
1077 if not fl.addgroup(source, revmap, trp): 1082 if not fl.addgroup(source, revmap, trp):
1078 raise error.Abort(_("received file revlog group is empty")) 1083 raise error.Abort(_("received file revlog group is empty"))
1079 except error.CensoredBaseError as e: 1084 except error.CensoredBaseError as e:
1080 raise error.Abort(_("received delta base is censored: %s") % e) 1085 raise error.Abort(_("received delta base is censored: %s") % e)
1081 if not directory: 1086 revisions += len(fl) - o
1082 revisions += len(fl) - o 1087 files += 1
1083 files += 1
1084 if f in needfiles: 1088 if f in needfiles:
1085 needs = needfiles[f] 1089 needs = needfiles[f]
1086 for new in xrange(o, len(fl)): 1090 for new in xrange(o, len(fl)):
1087 n = fl.node(new) 1091 n = fl.node(new)
1088 if n in needs: 1092 if n in needs: