]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
see what the link thing looks like here
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 21 Oct 2012 23:30:35 +0000 (19:30 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 21 Oct 2012 23:30:35 +0000 (19:30 -0400)
docs/build/ext/changelog.py

index 24ceaeaa3a9448bf5400e65ac212e2ae08705b3f..023d11818f793053949186bc65c8bb48801ea030 100644 (file)
@@ -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'
+        )