Ensure genindex output is deterministic.

See also <https://github.com/sphinx-doc/sphinx/pull/1694>

Signed-off-by: Chris Lamb <chris@chris-lamb.co.uk>
This commit is contained in:
Chris Lamb 2015-01-31 20:21:21 +00:00
parent 018c3b6532
commit 20546b17c0

View File

@ -14,6 +14,7 @@ import os
import sys import sys
import time import time
import types import types
import bisect
import codecs import codecs
import imghdr import imghdr
import string import string
@ -1800,7 +1801,8 @@ class BuildEnvironment:
except NoUri: except NoUri:
pass pass
else: else:
entry[0].append((main, uri)) # maintain links in sorted/deterministic order
bisect.insort(entry[0], (main, uri))
for fn, entries in iteritems(self.indexentries): for fn, entries in iteritems(self.indexentries):
# new entry types must be listed in directives/other.py! # new entry types must be listed in directives/other.py!
@ -1838,8 +1840,10 @@ class BuildEnvironment:
def keyfunc(entry, lcletters=string.ascii_lowercase + '_'): def keyfunc(entry, lcletters=string.ascii_lowercase + '_'):
lckey = unicodedata.normalize('NFD', entry[0].lower()) lckey = unicodedata.normalize('NFD', entry[0].lower())
if lckey[0:1] in lcletters: if lckey[0:1] in lcletters:
return chr(127) + lckey lckey = chr(127) + lckey
return lckey # ensure a determinstic order *within* letters by also sorting on
# the entry itself
return (lckey, entry[0])
newlist = sorted(new.items(), key=keyfunc) newlist = sorted(new.items(), key=keyfunc)
if group_entries: if group_entries: