sapling/mercurial
Gregory Szorc 79225ac4bc bundle2: ignore errors seeking a bundle after an exception (issue4784)
Many have seen a "stream ended unexpectedly" error. This message is
raised from changegroup.readexactly() when a read(n) operation fails
to return exactly N bytes.

I believe most occurrences of this error in the wild stem from
the code changed in this patch. Before, if bundle2's part applicator
raised an Exception when processing/applying parts, the exception
handler would attempt to iterate the remaining parts. If I/O
during this iteration failed, it would likely raise the
"stream ended unexpectedly" exception.

The problem with this approach is that if we already encountered
an I/O error iterating the bundle2 data during application, then
any further I/O would almost certainly fail. If the original stream
were closed, changegroup.readexactly() would obtain an empty
string, triggering "stream ended unexpectedly" with "got 0." This is
the error message that users would see. What's worse is that the
original I/O related exception would be lost since a new exception
would be raised. This made debugging the actual I/O failure
effectively impossible.

This patch changes the exception handler for bundle2 application to
ignore errors when seeking the underlying stream. When the underlying
error is I/O related, the seek should fail fast and the original
exception will be re-raised. The output changes in
test-http-bad-server.t demonstrate this.

When the underlying error is not I/O related and the stream can be
seeked, the old behavior is preserved.
2017-04-16 11:55:08 -07:00
..
cffi setup: move cffi stuff to mercurial/cffi 2016-11-09 22:08:30 +00:00
default.d mergetools.rc: find OSX FileMerge in the new location inside Xcode 4.3 2015-10-16 11:37:34 +02:00
help serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
hgweb hgwebdir: allow a repository to be hosted at "/" 2017-03-31 23:00:41 -04:00
httpclient httpclient: update to 54868ef054d2 of httpplus 2016-06-27 11:53:50 -04:00
pure lazymanifest: write a more efficient, pypy friendly version of lazymanifest 2016-09-12 13:37:14 +02:00
templates gitweb: handle "patch" query parameter in filelog view 2017-04-13 10:04:09 +02:00
__init__.py py3: add pycompat.unicode and add it to importer 2017-04-07 23:35:51 +05:30
ancestor.py py3: add __bool__ to every class defining __nonzero__ 2017-03-13 12:40:14 -07:00
archival.py py3: remove use of *L syntax 2016-09-01 02:29:46 +05:30
base85.c base85: fix comparison of an int and a long 2015-08-21 14:29:42 -04:00
bdiff_module.c bdiff: use Python memory allocator in fixws 2017-03-09 11:54:25 -08:00
bdiff.c bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bdiff.h bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bitmanipulation.h internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
bookmarks.py bookmarks: abort 'push -B .' when no active bookmark 2016-06-13 23:50:26 +02:00
branchmap.py rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount 2016-07-18 22:25:09 +02:00
bundle2.py bundle2: ignore errors seeking a bundle after an exception (issue4784) 2017-04-16 11:55:08 -07:00
bundlerepo.py bundlerepo: fix raw handling in revision() 2017-04-06 17:45:47 -07:00
byterange.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
changegroup.py changegroup: store old heads as a set 2017-03-23 19:54:59 -07:00
changelog.py revlog: make 'storedeltachains' a "public" attribute 2016-10-14 02:25:08 +02:00
chgserver.py pager: set some environment variables if they're not set 2017-04-13 08:27:19 -07:00
cmdutil.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
color.py color: replace str() with pycompat.bytestr() 2017-03-29 14:47:52 +05:30
commands.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
commandserver.py commandserver: update comment about setpgid 2016-07-18 15:59:08 +01:00
compat.h compat: define ssize_t as int on 32bit Windows, silences C4142 warning 2016-07-15 23:54:56 +09:00
config.py ui: move configlist parser to config.py 2017-03-17 09:19:56 -07:00
context.py hidden: extract the code generating "filtered rev" error for wrapping 2017-04-15 18:13:10 +02:00
copies.py merge: avoid superfluous filemerges when grafting through renames (issue5407) 2016-10-25 21:01:53 +02:00
crecord.py crecord: avoid setting non-existing SIGTSTP signal on windows (issue5512) 2017-04-06 11:28:25 +02:00
dagparser.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
dagutil.py dagutil: use absolute_import 2015-08-08 19:04:09 -07:00
debugcommands.py upgrade: extract code in its own module 2017-04-07 18:53:17 +02:00
demandimport.py windows: add win32com.shell to demandimport ignore list 2017-04-14 12:34:26 -07:00
destutil.py update: use single quotes in use warning 2016-09-02 21:49:33 +00:00
diffhelpers.c diffhelpers: fix botched return statement from e48d70075d8a 2015-01-28 13:34:20 -05:00
dirs.c dirs: use PyVarObject_HEAD_INIT 2016-10-13 13:14:14 +02:00
dirstate.py dirstate: fix debug.dirstate.delaywrite to use the new "now" after sleeping 2016-10-18 16:52:35 +02:00
dirstateguard.py dirstateguard: move to new module so I can break some layering violations 2016-11-21 21:29:32 -05:00
discovery.py checkheads: upgrade the obsolescence postprocessing logic (issue4354) 2017-04-15 02:55:18 +02:00
dispatch.py stdio: catch StdioError in dispatch.run and clean up appropriately 2017-04-11 14:54:12 -07:00
dummycert.pem
encoding.py py3: convert encoding name and mode to str 2016-09-28 20:39:06 +09:00
error.py error: rename RichIOError to PeerTransportError 2017-04-16 11:12:37 -07:00
exchange.py exchange: use v2 bundles for modern compression engines (issue5506) 2017-03-16 12:33:15 -07:00
exewrapper.c exewrapper: add .dll to LoadLibrary() argument 2016-04-27 09:23:39 -07:00
extensions.py extensions: move the "import" logic out from "load" 2016-10-03 03:37:10 +01:00
fancyopts.py flags: allow specifying --no-boolean-flag on the command line (BC) 2016-09-13 22:57:57 -04:00
filelog.py revlog: merge hash checking subfunctions 2016-12-13 14:21:36 +00:00
filemerge.py py3: make format strings unicodes and not bytes 2016-10-08 16:10:58 +02:00
fileset.py help: clarify quotes are needed for filesets.size expressions 2016-09-21 16:33:37 +00:00
formatter.py templatekw: add public function to wrap a dict by _hybrid object 2017-04-05 22:28:09 +09:00
graphmod.py revset: add new topographical sort 2016-06-13 18:20:00 +01:00
hbisect.py bisect: move check_state into the bisect module 2016-08-24 04:25:20 +02:00
help.py help: make "mergetool" an alias for "merge-tools" 2017-01-13 21:21:02 -08:00
hg.py py3: replace str() with bytes() 2017-04-07 13:46:35 +05:30
hook.py hook: add hook name information to external hook 2017-03-31 11:53:56 +02:00
httpconnection.py httpconnection: allow a global auth.cookiefile config entry 2017-03-09 22:35:10 -08:00
httppeer.py httppeer: don't send empty Vary request header 2017-04-16 11:28:02 -07:00
i18n.py i18n: make the locale directory name the same string type as the datapath 2016-10-08 05:26:18 -04:00
keepalive.py keepalive: send HTTP request headers in a deterministic order 2017-04-13 18:04:38 -07:00
localrepo.py track-tags: write all tag changes to a file 2017-03-28 10:15:02 +02:00
lock.py lock: do not encode result of gethostname on Python 2 2017-03-12 16:26:34 -07:00
lsprof.py lsprof: use print function 2016-01-02 11:40:53 -08:00
lsprofcalltree.py lsprofcalltree: use print function 2016-01-02 11:45:29 -08:00
mail.py mail: handle renamed email.Header 2016-10-07 17:30:11 +02:00
manifest.c manifest: use PyVarObject_HEAD_INIT 2016-10-13 13:17:23 +02:00
manifest.py treemanifest: add walksubtrees api 2017-04-10 13:07:47 -07:00
match.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
mdiff.py mdiff: add a hunkinrange helper function 2017-04-01 12:24:59 +02:00
merge.py merge: more safe detection of criss cross merge conflict between dm and r 2017-02-01 02:10:30 +01:00
mergeutil.py checkunresolved: move to new package to help avoid import cycles 2016-11-21 21:31:45 -05:00
minirst.py help: search section of help topic by translated section name correctly 2016-05-13 07:19:59 +09:00
mpatch_module.c mpatch: raise MemoryError instead of mpatchError if lalloc() failed 2016-08-07 10:06:56 +09:00
mpatch.c internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
mpatch.h mpatch: raise MemoryError instead of mpatchError if lalloc() failed 2016-08-07 10:06:56 +09:00
namespaces.py namespaces: fix name/node confusion 2016-03-16 23:12:43 +00:00
node.py node: use byte literals to construct nullid and wdirid 2016-03-12 14:04:57 -08:00
obsolete.py obsolete: use single quotes in use warning 2016-09-20 23:48:19 +00:00
osutil.c osutil: use PyLongObject on Python 3 for listdir_slot 2016-10-09 13:47:46 +02:00
parser.py parser: preserve order of keyword arguments 2017-04-09 11:58:27 +09:00
parsers.c parsers: avoid PySliceObject cast on Python 3 2016-10-13 13:34:53 +02:00
patch.py diff: add --binary option for git mode diffs 2017-04-05 15:31:08 -07:00
pathencode.c pathencode: use assert() for PyBytes_Check() 2016-10-13 21:42:11 +02:00
pathutil.py util: rename checkcase() to fscasesensitive() (API) 2016-08-30 09:22:53 -07:00
peer.py py3: convert to next() function 2016-05-16 21:30:53 +00:00
phases.py phases: emit phases to pushkey protocol in deterministic order 2017-04-13 22:12:04 -07:00
policy.py policy: add cffi policy for PyPy 2016-06-07 15:35:58 +02:00
posix.py merge with stable 2017-01-04 14:52:59 -05:00
profiling.py py3: replace pycompat.getenv with encoding.environ.get 2017-01-15 13:17:05 +05:30
progress.py progress: stop excessive clearing (issue4801) 2016-05-06 17:53:06 -05:00
pushkey.py pushkey: use absolute_import 2015-08-08 19:57:27 -07:00
pvec.py pvec: use absolute_import 2015-12-21 21:32:58 -08:00
pycompat.py pycompat: import correct cookie module on Python 3 2017-04-12 18:42:20 -07:00
rcutil.py pager: set some environment variables if they're not set 2017-04-13 08:27:19 -07:00
registrar.py templater: add support for keyword arguments 2017-04-03 21:22:39 +09:00
repair.py repair: use rawvfs when copying extra store files 2017-04-08 11:36:39 -07:00
repoview.py cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1 2016-06-10 00:12:33 -04:00
revlog.py revlog: make "size" diverge from "rawsize" 2017-04-09 12:53:31 -07:00
revset.py revset: properly parse "descend" argument of followlines() 2017-04-15 11:29:42 +02:00
revsetlang.py revsetlang: add a getboolean helper function 2017-04-15 11:26:09 +02:00
scmposix.py smcposix: pass unicode as first argument to array.array 2017-03-12 22:27:53 +05:30
scmutil.py vfs: deprecate all old classes in scmutil 2017-04-03 14:21:38 +02:00
scmwindows.py py3: conditionalize _winreg import 2016-08-10 04:35:44 +05:30
server.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
setdiscovery.py setdiscovery: use iterbatch interface instead of batch 2016-03-01 17:44:41 -05:00
similar.py similar: remove caching from the module level 2017-01-13 11:42:36 -08:00
simplemerge.py simplemerge: move conflict warning message to filemerge 2015-10-09 13:54:52 -07:00
smartset.py py3: add __bool__ to every class defining __nonzero__ 2017-03-13 12:40:14 -07:00
sshpeer.py sshpeer: fix docstring typo 2017-04-13 14:48:18 -04:00
sshserver.py wireproto: compress data from a generator 2016-10-16 11:10:21 -07:00
sslutil.py sslutil: guard against broken certifi installations (issue5406) 2016-10-19 18:06:14 +02:00
statichttprepo.py manifest: make manifestlog a storecache 2016-10-18 17:33:39 -07:00
statprof.py py3: use pycompat.fsencode() to convert __file__ to bytes 2017-02-20 18:40:42 +05:30
store.py store: py26 compat, don't use a dict comprehension 2016-10-09 12:58:22 +02:00
streamclone.py streamclone: clear caches after writing changes into files for visibility 2016-09-12 03:06:29 +09:00
subrepo.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
tagmerge.py tagmerge: use 'wvfs' instead of 'wfile' 2017-03-15 00:28:58 -07:00
tags.py track-tags: write all tag changes to a file 2017-03-28 10:15:02 +02:00
templatefilters.py templater: remove __iter__() from _hybrid, resolve it explicitly 2017-04-04 22:19:02 +09:00
templatekw.py templatekw: add public function to wrap a dict by _hybrid object 2017-04-05 22:28:09 +09:00
templater.py templater: add shorthand for building a dict like {"key": key} 2017-04-03 23:13:49 +09:00
transaction.py transaction: open a file with checkambig=True to avoid file stat ambiguity 2016-09-22 21:52:00 +09:00
treediscovery.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
txnutil.py txnutil: factor out the logic to read file in according to HG_PENDING 2017-02-21 01:20:59 +09:00
ui.py stdio: raise StdioError if something goes wrong in ui.flush 2017-04-11 14:54:12 -07:00
unionrepo.py revlog: add 'raw' argument to revision and _addrevision 2017-01-05 17:16:07 +00:00
upgrade.py upgrade: simplify the "origin" dispatch in dry run 2017-04-11 00:03:11 +02:00
url.py url: support auth.cookiesfile for adding cookies to HTTP requests 2017-03-09 22:40:52 -08:00
util.h parsers: move PyInt aliasing out of util.h 2016-10-09 13:50:53 +02:00
util.py util: pass sysstrs to warnings.filterwarnings 2017-04-13 13:12:49 -04:00
verify.py verify: fix length check 2017-03-29 14:49:14 -07:00
vfs.py py3: abuse r'' to preserve str-ness of literals passed to __setattr__() 2017-03-26 16:33:12 +09:00
win32.py py3: use pycompat.getcwd instead of os.getcwd 2016-12-22 01:54:17 +05:30
windows.py windows: add context manager support to mixedfilemodewrapper 2017-04-11 21:38:11 -04:00
wireproto.py wireproto: properly report server Abort during 'getbundle' 2017-02-10 18:20:58 +01:00
worker.py worker: flush messages written by child processes before exit 2017-02-25 12:48:50 +09:00