Commits

Takayuki Shimizukawa committed c863686 Merge

Merged in bsipocz/sphinx (pull request #275)

Adding the option of multiple inv for the same name & uri

Comments (0)

Files changed (2)

doc/ext/intersphinx.rst

    ``http://docs.python.org/3.2``.  It is up to you to update the inventory file
    as new objects are added to the Python documentation.
 
+   .. versionadded:: 1.3
+
+   Alternative files can be specified for each inventory. One can give a
+   tuple for the second inventory tuple item as shown in the following
+   example. This will read the inventory iterating through the (second)
+   tuple items until the first successful fetch. The primary use case for
+   this to specify mirror sites for server downtime of the primary
+   inventory::
+
+      intersphinx_mapping = {'python': ('http://docs.python.org/3.2',
+                                        (None, 'python-inv.txt'))}
+
 .. confval:: intersphinx_cache_limit
 
    The maximum number of days to cache remote inventories.  The default is

sphinx/ext/intersphinx.py

         # we can safely assume that the uri<->inv mapping is not changed
         # during partial rebuilds since a changed intersphinx_mapping
         # setting will cause a full environment reread
-        if not inv:
-            inv = posixpath.join(uri, INVENTORY_FILENAME)
-        # decide whether the inventory must be read: always read local
-        # files; remote ones only if the cache time is expired
-        if '://' not in inv or uri not in cache \
-               or cache[uri][1] < cache_time:
-            app.info('loading intersphinx inventory from %s...' % inv)
-            invdata = fetch_inventory(app, uri, inv)
-            if invdata:
-                cache[uri] = (name, now, invdata)
-            else:
-                cache.pop(uri, None)
-            update = True
+        if not isinstance(inv, tuple):
+            invs = (inv, )
+        else:
+            invs = inv
+
+        for inv in invs:
+            if not inv:
+                inv = posixpath.join(uri, INVENTORY_FILENAME)
+            # decide whether the inventory must be read: always read local
+            # files; remote ones only if the cache time is expired
+            if '://' not in inv or uri not in cache \
+                    or cache[uri][1] < cache_time:
+                app.info('loading intersphinx inventory from %s...' % inv)
+                invdata = fetch_inventory(app, uri, inv)
+                if invdata:
+                    cache[uri] = (name, now, invdata)
+                    update = True
+                    break
+
     if update:
         env.intersphinx_inventory = {}
         env.intersphinx_named_inventory = {}