Mercurial > kallithea
view scripts/docs-headings.py @ 5770:82f818616265
db: cache SCM instance short-term (tied to SQLAlchemy session lifetime)
Repeatedly checking whether SCM instances are invalidated is slow, and
we don't actually _want_ SCM instances to invalidate half-way through
a request either.
Therefore cache them in on the db.Repository object, the lifetime
of which is directly tied to the lifetime of the SQLAlchemy session,
the lifetime of which is tied directly to the individual HTTP request.
This way, we only check for invalidation the first time the SCM instance
is accessed in a request.
This will improve performance in cases where we have (by definition) badly
written code that retrieves repo objects several times.
author | Søren Løvborg <sorenl@unity3d.com> |
---|---|
date | Tue, 08 Mar 2016 12:28:06 +0100 |
parents | ed2fb6e84a02 |
children | 665dfa112f2c |
line wrap: on
line source
#!/usr/bin/env python2 """ Consistent formatting of rst section titles """ import re import subprocess spaces = [ (0, 1), # we assume this is a over-and-underlined header (2, 1), (1, 1), (1, 0), (1, 0), ] # http://sphinx-doc.org/rest.html : # for the Python documentation, this convention is used which you may follow: # # with overline, for parts # * with overline, for chapters # =, for sections # -, for subsections # ^, for subsubsections # ", for paragraphs pystyles = ['#', '*', '=', '-', '^', '"'] # match on a header line underlined with one of the valid characters headermatch = re.compile(r'''\n*(.+)\n([][!"#$%&'()*+,./:;<=>?@\\^_`{|}~-])\2{2,}\n+''', flags=re.MULTILINE) def main(): for fn in subprocess.check_output(['hg', 'loc', 'set:**.rst+kallithea/i18n/how_to']).splitlines(): print 'processing %s:' % fn s = file(fn).read() # find levels and their styles lastpos = 0 styles = [] for markup in headermatch.findall(s): style = markup[1] if style in styles: stylepos = styles.index(style) if stylepos > lastpos + 1: print 'bad style %r with level %s - was at %s' % (style, stylepos, lastpos) else: stylepos = len(styles) if stylepos > lastpos + 1: print 'bad new style %r - expected %r' % (style, styles[lastpos + 1]) else: styles.append(style) lastpos = stylepos # remove superfluous spacing (may however be restored by header spacing) s = re.sub(r'''(\n\n)\n*''', r'\1', s, flags=re.MULTILINE) if styles: newstyles = pystyles[pystyles.index(styles[0]):] def subf(m): title, style = m.groups() level = styles.index(style) before, after = spaces[level] newstyle = newstyles[level] return '\n' * (before + 1) + title + '\n' + newstyle * len(title) + '\n' * (after + 1) s = headermatch.sub(subf, s) # remove superfluous spacing when headers are adjacent s = re.sub(r'''(\n.+\n([][!"#$%&'()*+,./:;<=>?@\\^_`{|}~-])\2{2,}\n\n\n)\n*''', r'\1', s, flags=re.MULTILINE) # fix trailing space and spacing before link sections s = s.strip() + '\n' s = re.sub(r'''\n+((?:\.\. _[^\n]*\n)+)$''', r'\n\n\n\1', s) file(fn, 'w').write(s) print subprocess.check_output(['hg', 'diff', fn]) print if __name__ == '__main__': main()