summaryrefslogtreecommitdiff
path: root/sphinx/ext/intersphinx.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/ext/intersphinx.py')
-rw-r--r--sphinx/ext/intersphinx.py32
1 files changed, 26 insertions, 6 deletions
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py
index 7ec89ab7f..5d373c689 100644
--- a/sphinx/ext/intersphinx.py
+++ b/sphinx/ext/intersphinx.py
@@ -178,9 +178,9 @@ def fetch_inventory(app, uri, inv):
else:
f = open(path.join(app.srcdir, inv), 'rb')
except Exception as err:
- logger.warning('intersphinx inventory %r not fetchable due to %s: %s',
- inv, err.__class__, err)
- return
+ err.args = ('intersphinx inventory %r not fetchable due to %s: %s',
+ inv, err.__class__, err)
+ raise
try:
if hasattr(f, 'url'):
newinv = f.url # type: ignore
@@ -196,8 +196,9 @@ def fetch_inventory(app, uri, inv):
except ValueError as exc:
raise ValueError('unknown or unsupported inventory version: %r' % exc)
except Exception as err:
- logger.warning('intersphinx inventory %r not readable due to %s: %s',
- inv, err.__class__.__name__, err)
+ err.args = ('intersphinx inventory %r not readable due to %s: %s',
+ inv, err.__class__.__name__, err)
+ raise
else:
return invdata
@@ -231,6 +232,7 @@ def load_mappings(app):
else:
invs = inv # type: ignore
+ failures = []
for inv in invs:
if not inv:
inv = posixpath.join(uri, INVENTORY_FILENAME)
@@ -240,12 +242,30 @@ def load_mappings(app):
or inventories.cache[uri][1] < cache_time:
safe_inv_url = _get_safe_url(inv) # type: ignore
logger.info('loading intersphinx inventory from %s...', safe_inv_url)
- invdata = fetch_inventory(app, uri, inv)
+ try:
+ invdata = fetch_inventory(app, uri, inv)
+ except Exception as err:
+ failures.append(err.args)
+ continue
+
if invdata:
inventories.cache[uri] = (name, now, invdata)
update = True
break
+ if failures == []:
+ pass
+ elif len(failures) < len(invs):
+ logger.info("encountered some issues with some of the inventories,"
+ " but they had working alternatives:")
+ for fail in failures:
+ logger.info(*fail)
+ else:
+ logger.warning("failed to reach any of the inventories "
+ "with the following issues:")
+ for fail in failures:
+ logger.warning(*fail)
+
if update:
inventories.clear()