From 55ee3158df65e4a6a4a73fa81af1ce3e7693a930 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 17 Sep 2013 15:03:15 -0500 Subject: [PATCH] render "backports"/ "forward ports" automatically, only write out 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 | 88 ++++++++++++++++++++++------ doc/build/changelog/changelog_07.rst | 18 ++++-- 2 files changed, 85 insertions(+), 21 deletions(-) diff --git a/doc/build/builder/changelog.py b/doc/build/builder/changelog.py index 85ae6dba05..37df38ac89 100644 --- a/doc/build/builder/changelog.py +++ b/doc/build/builder/changelog.py @@ -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", diff --git a/doc/build/changelog/changelog_07.rst b/doc/build/changelog/changelog_07.rst index d7d3019d2e..0127c8a54a 100644 --- a/doc/build/changelog/changelog_07.rst +++ b/doc/build/changelog/changelog_07.rst @@ -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 @@ -41,13 +45,15 @@ .. 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)" @@ -189,6 +197,7 @@ .. 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 @@ -199,6 +208,7 @@ .. change:: :tags: sql, bug :tickets: 2631 + :versions: 0.8.0b2 Fixed bug where using server_onupdate= without passing the "for_update=True" flag would apply the default -- 2.47.2