From: Mike Bayer Date: Sun, 21 Oct 2012 23:30:35 +0000 (-0400) Subject: see what the link thing looks like here X-Git-Tag: rel_0_4_1~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b29682f893bce9bbdde360f430833e57f7f98ff3;p=thirdparty%2Fsqlalchemy%2Falembic.git see what the link thing looks like here --- diff --git a/docs/build/ext/changelog.py b/docs/build/ext/changelog.py index 24ceaeaa..023d1181 100644 --- a/docs/build/ext/changelog.py +++ b/docs/build/ext/changelog.py @@ -5,6 +5,7 @@ from docutils import nodes import textwrap import itertools import collections +import md5 def _comma_list(text): return re.split(r"\s*,\s*", text.strip()) @@ -143,29 +144,49 @@ class ChangeLogDirective(EnvDirective, Directive): topsection.append(nodes.Text("no release date")) return topsection + def _render_rec(self, rec, section, cat, append_sec): para = rec['node'].deepcopy() + + text = _text_rawsource_from_node(para) + if len(text) > 50: + targetid = "%s-%s" % (self.type_, + md5.md5(text[0:100].encode('ascii', 'ignore') + ).hexdigest()) + targetnode = nodes.target('', '', ids=[targetid]) + para.insert(0, targetnode) + permalink = nodes.reference('', '', + nodes.Text("(link)", "(link)"), + refid=targetid, + classes=['changeset-link'] + ) + para.append(permalink) + insert_ticket = nodes.paragraph('') para.append(insert_ticket) - for i, ticket in enumerate(rec['tickets']): - if i > 0: - insert_ticket.append(nodes.Text(", ", ", ")) - else: - insert_ticket.append(nodes.Text(" ", " ")) - refuri = self.env.config.changelog_render_ticket - if refuri is not None: - refuri = refuri % ticket - insert_ticket.append( - nodes.reference('', '', - nodes.Text("#%s" % ticket, "#%s" % ticket), - refuri=refuri - ) - ) - else: - insert_ticket.append( - nodes.Text("#%s" % ticket, "#%s" % ticket) - ) + i = 0 + for collection, render, prefix in ( + (rec['tickets'], self.env.config.changelog_render_ticket, "#%s"), + (rec['pullreq'], self.env.config.changelog_render_pullreq, + "pull request %s"), + (rec['changeset'], self.env.config.changelog_render_changeset, "r%s"), + ): + for refname in collection: + if i > 0: + insert_ticket.append(nodes.Text(", ", ", ")) + else: + insert_ticket.append(nodes.Text(" ", " ")) + i += 1 + if render is not None: + refuri = render % refname + node = nodes.reference('', '', + nodes.Text(prefix % refname, prefix % refname), + refuri=refuri + ) + else: + node = nodes.Text(prefix % refname, prefix % refname) + insert_ticket.append(node) if rec['tags']: tag_node = nodes.strong('', @@ -199,6 +220,8 @@ class ChangeDirective(EnvDirective, Directive): rec = { 'tags': set(_comma_list(content.get('tags', ''))).difference(['']), 'tickets': set(_comma_list(content.get('tickets', ''))).difference(['']), + 'pullreq': set(_comma_list(content.get('pullreq', ''))).difference(['']), + 'changeset': set(_comma_list(content.get('changeset', ''))).difference(['']), 'node': p, 'type': self.type_, "title": content.get("title", None) @@ -212,6 +235,15 @@ class ChangeDirective(EnvDirective, Directive): return [] +def _text_rawsource_from_node(node): + src = [] + stack = [node] + while stack: + n = stack.pop(0) + if isinstance(n, nodes.Text): + src.append(n.rawsource) + stack.extend(n.children) + return "".join(src) def _rst2sphinx(text): return StringList( @@ -227,3 +259,11 @@ def setup(app): None, 'env' ) + app.add_config_value("changelog_render_pullreq", + None, + 'env' + ) + app.add_config_value("changelog_render_changeset", + None, + 'env' + )