# HG changeset patch # User Pierre-Yves David # Date 2015-04-23 13:20:36 # Node ID b705e5ab3b07f7e3ba5f9c3db51c47d1779372d9 # Parent e79dd1c9753e96e82ddb786971f0f85165f6f8ef bundle2: capture transaction rollback message output (issue4614) The output from the transaction rollback was not included into the reply bundle. It was eventually caught by the usual 'unbundle' output capture and sent to the client but the result was out of order on the client side. We now capture the output for the transaction release and transmit it the same way as all other output. We should probably rethink the whole output capture things but this would not be appropriate for stable. The is still multiple cases were output failed to be properly capture, they will be fixed in later changesets. diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -1284,6 +1284,7 @@ def unbundle(repo, cg, heads, source, ur r = 0 # need a transaction when processing a bundle2 stream wlock = lock = tr = None + recordout = None try: check_heads(repo, heads, 'uploading changes') # push can proceed @@ -1301,11 +1302,18 @@ def unbundle(repo, cg, heads, source, ur except Exception, exc: exc.duringunbundle2 = True if r is not None: - exc._bundle2salvagedoutput = r.salvageoutput() + parts = exc._bundle2salvagedoutput = r.salvageoutput() + repo.ui.pushbuffer(error=True) + def recordout(output): + part = bundle2.bundlepart('output', data=output, + mandatory=False) + parts.append(part) raise else: lock = repo.lock() r = changegroup.addchangegroup(repo, cg, source, url) finally: lockmod.release(tr, lock, wlock) + if recordout is not None: + recordout(repo.ui.popbuffer()) return r diff --git a/tests/test-bundle2-exchange.t b/tests/test-bundle2-exchange.t --- a/tests/test-bundle2-exchange.t +++ b/tests/test-bundle2-exchange.t @@ -559,12 +559,12 @@ Doing the actual push: hook abort pushing to other searching for changes pre-close-tip:e7ec4e813ba6 draft - transaction abort! - rollback completed remote: adding changesets remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files + remote: transaction abort! + remote: rollback completed abort: pretxnclose.failpush hook exited with status 1 [255] @@ -575,10 +575,10 @@ Doing the actual push: hook abort remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files + remote: transaction abort! + remote: rollback completed abort: pretxnclose.failpush hook exited with status 1 remote: pre-close-tip:e7ec4e813ba6 draft - remote: transaction abort! - remote: rollback completed [255] $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6 @@ -588,6 +588,8 @@ Doing the actual push: hook abort remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files + remote: transaction abort! + remote: rollback completed abort: pretxnclose.failpush hook exited with status 1 [255]