Show More
@@ -106,7 +106,9 b' def push(repo, remote, force=False, revs' | |||
|
106 | 106 | pushop.repo.prepushoutgoinghooks(pushop.repo, |
|
107 | 107 | pushop.remote, |
|
108 | 108 | pushop.outgoing) |
|
109 | _pushchangeset(pushop) | |
|
109 | if pushop.remote.capable('bundle2'): | |
|
110 | _pushbundle2(pushop) | |
|
111 | else: | |
|
110 | 112 | _pushcomputecommonheads(pushop) |
|
111 | 113 | _pushsyncphase(pushop) |
|
112 | 114 | _pushobsolete(pushop) |
@@ -172,6 +174,35 b' def _pushcheckoutgoing(pushop):' | |||
|
172 | 174 | newbm) |
|
173 | 175 | return True |
|
174 | 176 | |
|
177 | def _pushbundle2(pushop): | |
|
178 | """push data to the remote using bundle2 | |
|
179 | ||
|
180 | The only currently supported type of data is changegroup but this will | |
|
181 | evolve in the future.""" | |
|
182 | # Send known head to the server for race detection. | |
|
183 | bundler = bundle2.bundle20(pushop.ui) | |
|
184 | if not pushop.force: | |
|
185 | part = bundle2.bundlepart('CHECK:HEADS', data=iter(pushop.remoteheads)) | |
|
186 | bundler.addpart(part) | |
|
187 | # add the changegroup bundle | |
|
188 | cg = changegroup.getlocalbundle(pushop.repo, 'push', pushop.outgoing) | |
|
189 | def cgchunks(cg=cg): | |
|
190 | yield 'HG10UN' | |
|
191 | for c in cg.getchunks(): | |
|
192 | yield c | |
|
193 | cgpart = bundle2.bundlepart('CHANGEGROUP', data=cgchunks()) | |
|
194 | bundler.addpart(cgpart) | |
|
195 | stream = util.chunkbuffer(bundler.getchunks()) | |
|
196 | sent = bundle2.unbundle20(pushop.repo.ui, stream) | |
|
197 | reply = pushop.remote.unbundle(sent, ['force'], 'push') | |
|
198 | try: | |
|
199 | op = bundle2.processbundle(pushop.repo, reply) | |
|
200 | except KeyError, exc: | |
|
201 | raise util.Abort('missing support for %s' % exc) | |
|
202 | cgreplies = op.records.getreplies(cgpart.id) | |
|
203 | assert len(cgreplies['changegroup']) == 1 | |
|
204 | pushop.ret = cgreplies['changegroup'][0]['return'] | |
|
205 | ||
|
175 | 206 | def _pushchangeset(pushop): |
|
176 | 207 | """Make the actual push of changeset bundle to remote repo""" |
|
177 | 208 | outgoing = pushop.outgoing |
@@ -637,11 +668,22 b' def unbundle(repo, cg, heads, source, ur' | |||
|
637 | 668 | |
|
638 | 669 | If the push was raced as PushRaced exception is raised.""" |
|
639 | 670 | r = 0 |
|
671 | # need a transaction when processing a bundle2 stream | |
|
672 | tr = None | |
|
640 | 673 | lock = repo.lock() |
|
641 | 674 | try: |
|
642 | 675 | check_heads(repo, heads, 'uploading changes') |
|
643 | 676 | # push can proceed |
|
644 | r = changegroup.addchangegroup(repo, cg, source, url) | |
|
677 | if util.safehasattr(cg, 'params'): | |
|
678 | tr = repo.transaction('unbundle') | |
|
679 | ret = bundle2.processbundle(repo, cg, lambda: tr) | |
|
680 | tr.close() | |
|
681 | stream = util.chunkbuffer(ret.reply.getchunks()) | |
|
682 | r = bundle2.unbundle20(repo.ui, stream) | |
|
683 | else: | |
|
684 | r = changegroup.addchangegroup(repo, cg, source, url) | |
|
645 | 685 | finally: |
|
686 | if tr is not None: | |
|
687 | tr.release() | |
|
646 | 688 | lock.release() |
|
647 | 689 | return r |
@@ -668,11 +668,21 b' clone --pull' | |||
|
668 | 668 | |
|
669 | 669 | pull |
|
670 | 670 | |
|
671 | $ hg -R other pull | |
|
671 | $ hg -R other pull -r 24b6387c8c8c | |
|
672 | 672 | pulling from $TESTTMP/main (glob) |
|
673 | 673 | searching for changes |
|
674 | 674 | adding changesets |
|
675 | 675 | adding manifests |
|
676 | 676 | adding file changes |
|
677 |
added |
|
|
677 | added 1 changesets with 1 changes to 1 files (+1 heads) | |
|
678 | 678 | (run 'hg heads' to see heads, 'hg merge' to merge) |
|
679 | ||
|
680 | push | |
|
681 | ||
|
682 | $ hg -R main push other --rev eea13746799a | |
|
683 | pushing to other | |
|
684 | searching for changes | |
|
685 | adding changesets | |
|
686 | adding manifests | |
|
687 | adding file changes | |
|
688 | added 1 changesets with 0 changes to 0 files (-1 heads) |
General Comments 0
You need to be logged in to leave comments.
Login now