Mercurial > public > mercurial-scm > hg
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: |