]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
render "backports"/ "forward ports" automatically, only write out
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 17 Sep 2013 20:03:15 +0000 (15:03 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 17 Sep 2013 20:05:28 +0000 (15:05 -0500)
changelog once

Conflicts:
doc/build/changelog/changelog_09.rst

Conflicts:
doc/build/changelog/changelog_07.rst
doc/build/changelog/changelog_08.rst

doc/build/builder/changelog.py
doc/build/changelog/changelog_07.rst

index 85ae6dba05c4481a98b6eacc2aac051af69bd4c8..37df38ac89757dab22ca847c128f3431508ca03e 100644 (file)
@@ -31,11 +31,13 @@ class EnvDirective(object):
     def env(self):
         return self.state.document.settings.env
 
+    @classmethod
+    def changes(cls, env):
+        return env.temp_data['ChangeLogDirective_changes']
+
 class ChangeLogDirective(EnvDirective, Directive):
     has_content = True
 
-    type_ = "change"
-
     default_section = 'misc'
 
     def _organize_by_section(self, changes):
@@ -45,6 +47,8 @@ class ChangeLogDirective(EnvDirective, Directive):
         bysection = collections.defaultdict(list)
         all_sections = set()
         for rec in changes:
+            if self.version not in rec['versions']:
+                continue
             inner_tag = rec['tags'].intersection(self.inner_tag_sort)
             if inner_tag:
                 inner_tag = inner_tag.pop()
@@ -68,26 +72,29 @@ class ChangeLogDirective(EnvDirective, Directive):
                     bysection[(self.default_section, inner_tag)].append(rec)
         return bysection, all_sections
 
-    @classmethod
-    def changes(cls, env):
-        return env.temp_data['ChangeLogDirective_%s_changes' % cls.type_]
-
     def _setup_run(self):
         self.sections = self.env.config.changelog_sections
         self.inner_tag_sort = self.env.config.changelog_inner_tag_sort + [""]
-        self.env.temp_data['ChangeLogDirective_%s_changes' % self.type_] = []
+        if 'ChangeLogDirective_changes' not in self.env.temp_data:
+            self.env.temp_data['ChangeLogDirective_changes'] = []
         self._parsed_content = _parse_content(self.content)
 
+        self.version = version = self._parsed_content.get('version', '')
+        self.env.temp_data['ChangeLogDirective_version'] = version
+
         p = nodes.paragraph('', '',)
         self.state.nested_parse(self.content[1:], 0, p)
 
     def run(self):
         self._setup_run()
+
+        if 'ChangeLogDirective_includes' in self.env.temp_data:
+            return []
+
         changes = self.changes(self.env)
         output = []
 
-        self.version = version = self._parsed_content.get('version', '')
-        id_prefix = "%s-%s" % (self.type_, version)
+        id_prefix = "change-%s" % (self.version, )
         topsection = self._run_top(id_prefix)
         output.append(topsection)
 
@@ -151,7 +158,7 @@ class ChangeLogDirective(EnvDirective, Directive):
         text = _text_rawsource_from_node(para)
 
         to_hash = "%s %s" % (self.version, text[0:100])
-        targetid = "%s-%s" % (self.type_,
+        targetid = "change-%s" % (
                         md5.md5(to_hash.encode('ascii', 'ignore')
                             ).hexdigest())
         targetnode = nodes.target('', '', ids=[targetid])
@@ -163,6 +170,16 @@ class ChangeLogDirective(EnvDirective, Directive):
                     )
         para.append(permalink)
 
+        if len(rec['versions']) > 1:
+
+            backported_changes = rec['sorted_versions'][rec['sorted_versions'].index(self.version) + 1:]
+            if backported_changes:
+                backported = nodes.paragraph('')
+                backported.append(nodes.Text("This change is also ", ""))
+                backported.append(nodes.strong("", "backported"))
+                backported.append(nodes.Text(" to: %s" % ", ".join(backported_changes), ""))
+                para.append(backported)
+
         insert_ticket = nodes.paragraph('')
         para.append(insert_ticket)
 
@@ -177,7 +194,7 @@ class ChangeLogDirective(EnvDirective, Directive):
                 if i > 0:
                     insert_ticket.append(nodes.Text(", ", ", "))
                 else:
-                    insert_ticket.append(nodes.Text(" ", " "))
+                    insert_ticket.append(nodes.Text("References: """))
                 i += 1
                 if render is not None:
                     refuri = render % refname
@@ -208,33 +225,69 @@ class ChangeLogDirective(EnvDirective, Directive):
             )
         )
 
+class ChangeLogImportDirective(EnvDirective, Directive):
+    has_content = True
+
+    def _setup_run(self):
+        if 'ChangeLogDirective_changes' not in self.env.temp_data:
+            self.env.temp_data['ChangeLogDirective_changes'] = []
+
+    def run(self):
+        self._setup_run()
+
+        # tell ChangeLogDirective we're here, also prevent
+        # nested .. include calls
+        if 'ChangeLogDirective_includes' not in self.env.temp_data:
+            self.env.temp_data['ChangeLogDirective_includes'] = True
+            p = nodes.paragraph('', '',)
+            self.state.nested_parse(self.content, 0, p)
+            del self.env.temp_data['ChangeLogDirective_includes']
+
+        return []
 
 class ChangeDirective(EnvDirective, Directive):
     has_content = True
 
-    type_ = "change"
-    parent_cls = ChangeLogDirective
-
     def run(self):
         content = _parse_content(self.content)
         p = nodes.paragraph('', '',)
         sorted_tags = _comma_list(content.get('tags', ''))
+        declared_version = self.env.temp_data['ChangeLogDirective_version']
+        versions = set(_comma_list(content.get("versions", ""))).difference(['']).\
+                            union([declared_version])
+
+        # if we don't refer to any other versions and we're in an include,
+        # skip
+        if len(versions) == 1 and 'ChangeLogDirective_includes' in self.env.temp_data:
+            return []
+
+        def int_ver(ver):
+            out = []
+            for dig in ver.split("."):
+                try:
+                    out.append(int(dig))
+                except ValueError:
+                    out.append(0)
+            return tuple(out)
+
         rec = {
             'tags': set(sorted_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_,
+            'type': "change",
             "title": content.get("title", None),
-            'sorted_tags': sorted_tags
+            'sorted_tags': sorted_tags,
+            "versions": versions,
+            "sorted_versions": list(reversed(sorted(versions, key=int_ver)))
         }
 
         if "declarative" in rec['tags']:
             rec['tags'].add("orm")
 
         self.state.nested_parse(content['text'], 0, p)
-        self.parent_cls.changes(self.env).append(rec)
+        ChangeLogDirective.changes(self.env).append(rec)
 
         return []
 
@@ -269,6 +322,7 @@ def make_ticket_link(name, rawtext, text, lineno, inliner,
 def setup(app):
     app.add_directive('changelog', ChangeLogDirective)
     app.add_directive('change', ChangeDirective)
+    app.add_directive('changelog_imports', ChangeLogImportDirective)
     app.add_config_value("changelog_sections", [], 'env')
     app.add_config_value("changelog_inner_tag_sort", [], 'env')
     app.add_config_value("changelog_render_ticket",
index d7d3019d2ea8568d10109ad302cb155b0bd100f9..0127c8a54a6c91dee4ec91b40f31a6abc7f3cf0d 100644 (file)
@@ -9,6 +9,7 @@
     .. change::
         :tags: bug, orm
         :tickets: 2807
+        :versions: 0.8.3, 0.9.0
 
         Fixed bug where list instrumentation would fail to represent a
         setslice of ``[0:0]`` correctly, which in particular could occur
@@ -19,6 +20,7 @@
     .. change::
         :tags: bug, sql
         :tickets: 2801
+        :versions: 0.8.3, 0.9.0
 
         Fixed regression dating back to 0.7.9 whereby the name of a CTE might
         not be properly quoted if it was referred to in multiple FROM clauses.
@@ -26,6 +28,7 @@
     .. change::
         :tags: mysql, bug
         :tickets: 2791
+        :versions: 0.8.3, 0.9.0
 
         Updates to MySQL reserved words for versions 5.5, 5.6, courtesy
         Hanno Schlichting.
@@ -33,6 +36,7 @@
     .. change::
         :tags: sql, bug, cte
         :tickets: 2783
+        :versions: 0.8.3, 0.9.0
 
         Fixed bug in common table expression system where if the CTE were
         used only as an ``alias()`` construct, it would not render using the
     .. change::
         :tags: bug, sql
         :tickets: 2784
+        :versions: 0.8.3, 0.9.0
 
         Fixed bug in :class:`.CheckConstraint` DDL where the "quote" flag from a
         :class:`.Column` object would not be propagated.
 
     .. change::
-      :tags: bug, orm
-      :tickets: 2699
+        :tags: bug, orm
+        :tickets: 2699
+        :versions: 0.8.1
 
       Fixed bug when a query of the form:
       ``query(SubClass).options(subqueryload(Baseclass.attrname))``,
@@ -60,8 +66,9 @@
       otherwise working correctly.
 
     .. change::
-      :tags: bug, orm
-      :tickets: 2689
+        :tags: bug, orm
+        :tickets: 2689
+        :versions: 0.8.1
 
       Fixed bug in unit of work whereby a joined-inheritance
       subclass could insert the row for the "sub" table
@@ -71,6 +78,7 @@
     .. change::
         :tags: feature, postgresql
         :tickets: 2676
+        :versions: 0.8.0
 
       Added support for Postgresql's traditional SUBSTRING
       function syntax, renders as "SUBSTRING(x FROM y FOR z)"
     .. change::
         :tags: sqlite, bug
         :tickets: 2568
+        :versions: 0.8.0b2
 
       More adjustment to this SQLite related issue which was released in
       0.7.9, to intercept legacy SQLite quoting characters when reflecting
     .. change::
         :tags: sql, bug
         :tickets: 2631
+        :versions: 0.8.0b2
 
       Fixed bug where using server_onupdate=<FetchedValue|DefaultClause>
       without passing the "for_update=True" flag would apply the default