)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"805c18c99202c07506dfb1d03a1d6d5d352d3335","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for subsections"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closes https://storyboard.openstack.org/#!/story/2010375. This"},{"line_number":10,"context_line":"feature is useful for longer changelogs to add more order."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Subsections will appear underneath their top-level section, in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"69d6a91c_fa469255","line":9,"updated":"2023-02-09 14:58:14.000000000","message":"The normal way to handle this is to add a tag like:\n\n```\nStory: 2010375\n```\n\nto the end of the commit message (see: https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure for some examples) so that when this merges the story will automatically be closed","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"d8eb69ca13d9e41f21d19228a9b472b315bcdd95","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for subsections"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closes https://storyboard.openstack.org/#!/story/2010375. This"},{"line_number":10,"context_line":"feature is useful for longer changelogs to add more order."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Subsections will appear underneath their top-level section, in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fca46339_b46f37b3","line":9,"in_reply_to":"69d6a91c_fa469255","updated":"2023-02-10 02:59:23.000000000","message":"Ah, thank you.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"5ac7fbf2fdf60ba043bde9e938a79017db1bf97f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for subsections"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closes https://storyboard.openstack.org/#!/story/2010375. This"},{"line_number":10,"context_line":"feature is useful for longer changelogs to add more order."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Subsections will appear underneath their top-level section, in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1dccf343_dc87c471","line":9,"in_reply_to":"fca46339_b46f37b3","updated":"2023-02-10 20:35:33.000000000","message":"Done","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"805c18c99202c07506dfb1d03a1d6d5d352d3335","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0a340e23_7861bfe8","updated":"2023-02-09 14:58:14.000000000","message":"This is great! I\u0027m quite excited to be able to use this feature in the future. I left a few inline comments.\n\nBesides those the only thing I think that\u0027s really missing here is a release note for this new feature and also maybe expanding some of the testing to cover some negative cases with incorrectly formatted input (related to some of my questions in `config.py`) and to see how things respond to invalid subsections.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"beddf8f9613bc7de6cb605c9ac9e6851043ebc00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"901cb877_bdeb91fa","updated":"2023-03-07 17:18:30.000000000","message":"I think this would be worth of a releasenote.\n\nAlso maybe amend examples/notes/add-complex-example-6b5927c246456896.yaml with an example.","commit_id":"7071b671076c1b0b0de9fd99412fbfb72be1ff91"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"5ac7fbf2fdf60ba043bde9e938a79017db1bf97f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"82cccf94_17defc8c","updated":"2023-02-10 20:35:33.000000000","message":"Thanks, Matthew, for iterating on the syntax with me!","commit_id":"7071b671076c1b0b0de9fd99412fbfb72be1ff91"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"d55353329872183503f1058ae71eb24d61ebdd09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"bd467201_9d0bbf0a","updated":"2023-03-23 14:32:39.000000000","message":"Looks like all comments have been addressed. Agree this would be a very nice capability!","commit_id":"ee73c9409e4bbceec565a42c7090a72455b1dcfc"}],"reno/config.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"805c18c99202c07506dfb1d03a1d6d5d352d3335","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            result.append("},{"line_number":46,"context_line":"                Section(name\u003dentry[0], title\u003dentry[1], top_level\u003dTrue)"},{"line_number":47,"context_line":"            )"},{"line_number":48,"context_line":"            if len(entry) \u003e 2:"},{"line_number":49,"context_line":"                subsections \u003d entry[2]"},{"line_number":50,"context_line":"                result.extend("},{"line_number":51,"context_line":"                    Section("}],"source_content_type":"text/x-python","patch_set":1,"id":"c64c31c1_b4f81e3c","line":48,"updated":"2023-02-09 14:58:14.000000000","message":"Do you think we should be doing\n\n```\nif len(entry) \u003d\u003d 3:\n   ...\nelif len(entry) \u003e 3:\n   raise\n\n```\n\nhere instead. I just worry this will let someone pass in incorrectly formatted configuration like: `[\u0027features\u0027, \u0027New Features\u0027, [\u0027features_command_line\u0027, \u0027Command Line\u0027], [\u0027features_library\u0027, \u0027Library\u0027]]` which would pass through this and result in incorrect output","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"d8eb69ca13d9e41f21d19228a9b472b315bcdd95","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            result.append("},{"line_number":46,"context_line":"                Section(name\u003dentry[0], title\u003dentry[1], top_level\u003dTrue)"},{"line_number":47,"context_line":"            )"},{"line_number":48,"context_line":"            if len(entry) \u003e 2:"},{"line_number":49,"context_line":"                subsections \u003d entry[2]"},{"line_number":50,"context_line":"                result.extend("},{"line_number":51,"context_line":"                    Section("}],"source_content_type":"text/x-python","patch_set":1,"id":"eac70d6b_55f3330b","line":48,"in_reply_to":"c64c31c1_b4f81e3c","updated":"2023-02-10 02:59:23.000000000","message":"I think so. In fact, I accidentally used the syntax you\u0027re worried about in my test! It took me a minute to realize I was missing the outer [].\n\nGenerally, I think this could use more eager data validation. I only wasn\u0027t sure the convention on how defensive to be—we didn\u0027t validate this config option before. \n\nConcretely, it seems like in most places we only log warnings, but there are a few TODOs to convert to errors. So, here, I think I should error for invalid input?","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"6ccabfbba140764a40c72a5ce3700238714ce71c","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            result.append("},{"line_number":46,"context_line":"                Section(name\u003dentry[0], title\u003dentry[1], top_level\u003dTrue)"},{"line_number":47,"context_line":"            )"},{"line_number":48,"context_line":"            if len(entry) \u003e 2:"},{"line_number":49,"context_line":"                subsections \u003d entry[2]"},{"line_number":50,"context_line":"                result.extend("},{"line_number":51,"context_line":"                    Section("}],"source_content_type":"text/x-python","patch_set":1,"id":"f3998edd_77c60e5d","line":48,"in_reply_to":"eac70d6b_55f3330b","updated":"2023-02-10 13:04:30.000000000","message":"Yeah, I think erroring on invalid input here is best. Especially since the new syntax is easy to make a mistake with, having a clear error message earlier would be better for users trying to set custom subheadings.\n\nWe can always circle back and add better input validation on the other options too. I think that would be good in general.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"5ac7fbf2fdf60ba043bde9e938a79017db1bf97f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            result.append("},{"line_number":46,"context_line":"                Section(name\u003dentry[0], title\u003dentry[1], top_level\u003dTrue)"},{"line_number":47,"context_line":"            )"},{"line_number":48,"context_line":"            if len(entry) \u003e 2:"},{"line_number":49,"context_line":"                subsections \u003d entry[2]"},{"line_number":50,"context_line":"                result.extend("},{"line_number":51,"context_line":"                    Section("}],"source_content_type":"text/x-python","patch_set":1,"id":"3163e615_bc1f56ad","line":48,"in_reply_to":"f3998edd_77c60e5d","updated":"2023-02-10 20:35:33.000000000","message":"Implemented. Although, I don\u0027t proactively check that a) `sections` is a list to begin with, and b) each entry within `sections` is a list","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"805c18c99202c07506dfb1d03a1d6d5d352d3335","unresolved":true,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def header_underline(self) -\u003e str:"},{"line_number":61,"context_line":"        symbol \u003d \"-\" if self.top_level else \"^\""},{"line_number":62,"context_line":"        return symbol * len(self.title)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"_OPTIONS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"d4c01c34_372feca2","line":62,"updated":"2023-02-09 14:58:14.000000000","message":"Just a question, I\u0027m wondering if we can support more than 1 level of nesting here? I think for most use cases and in general just starting with 2 levels of hierarchy is more than sufficient. By itself this gives us a lot more flexibility in building release notes. But I\u0027m just curious what this would look like if we wanted to support more levels of nesting. `docutils` supports an arbitrary number of levels (but html output will limit us to 6 total levels in the output document in practice).","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"e601e078e047fe66497638418bb96c4b37493397","unresolved":true,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def header_underline(self) -\u003e str:"},{"line_number":61,"context_line":"        symbol \u003d \"-\" if self.top_level else \"^\""},{"line_number":62,"context_line":"        return symbol * len(self.title)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"_OPTIONS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"9d182b80_08c279b8","line":62,"in_reply_to":"2f352bf6_8216f384","updated":"2023-02-10 19:29:47.000000000","message":"Huh..Good to know, thanks.\n\nIt seems possible to make this support arbitrary nesting, e.g. converting my parsing algorithm to be recursive. But, it will make that code more complex to read and the user documentation more complex, as well. A syntax like `[features, Features], [[sub, Sub], [[more_sub, More Sub]]]]` is pretty hard to read.\n\nInstead, if we want arbitrary nesting, I think I\u0027d encourage a syntax like `[name, My Title, 1]`, where 1 represents the nesting level. Then we have a flat list of sections. Much simpler syntax.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"5ac7fbf2fdf60ba043bde9e938a79017db1bf97f","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def header_underline(self) -\u003e str:"},{"line_number":61,"context_line":"        symbol \u003d \"-\" if self.top_level else \"^\""},{"line_number":62,"context_line":"        return symbol * len(self.title)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"_OPTIONS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"8595eaf4_a5a49897","line":62,"in_reply_to":"9d182b80_08c279b8","updated":"2023-02-10 20:35:33.000000000","message":"This is now implemented. I think it\u0027s much simpler and more flexible if we want even deeper nesting in the future.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"d8eb69ca13d9e41f21d19228a9b472b315bcdd95","unresolved":true,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def header_underline(self) -\u003e str:"},{"line_number":61,"context_line":"        symbol \u003d \"-\" if self.top_level else \"^\""},{"line_number":62,"context_line":"        return symbol * len(self.title)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"_OPTIONS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"fac7c9a5_8254da80","line":62,"in_reply_to":"d4c01c34_372feca2","updated":"2023-02-10 02:59:23.000000000","message":"I don\u0027t think we can. Per https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#sections, my understanding is that ^ is already the lowest level of subsections available.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"6ccabfbba140764a40c72a5ce3700238714ce71c","unresolved":true,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def header_underline(self) -\u003e str:"},{"line_number":61,"context_line":"        symbol \u003d \"-\" if self.top_level else \"^\""},{"line_number":62,"context_line":"        return symbol * len(self.title)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"_OPTIONS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"2f352bf6_8216f384","line":62,"in_reply_to":"fac7c9a5_8254da80","updated":"2023-02-10 13:04:30.000000000","message":"Heh, that section of the sphinx docs is very poorly laid out, I\u0027ve made the same mistake many times myself (until I had to dig deeper into how it worked at one point), having the example from the python style guide there makes it seem like there is a fixed hierarchy. But, before that list of symbols from the Python style guide the text says:\n\n```\nSection headers (ref) are created by underlining (and optionally overlining) the section title with a punctuation character, at least as long as the text:\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nThis is a heading\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nNormally, there are no heading levels assigned to certain characters as the structure is determined from the succession of headings\n```\n\nThen after they list the python style guides suggested section headers it says:\n\n```\nOf course, you are free to use your own marker characters (see the reST documentation), and use a deeper nesting level, but keep in mind that most target formats (HTML, LaTeX) have a limited supported nesting depth.\n```\n\nThe `reST documentation` it is referring to is: https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#sections","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"805c18c99202c07506dfb1d03a1d6d5d352d3335","unresolved":true,"context_lines":[{"line_number":195,"context_line":"        in your notes, use the ID for the subsection, e.g."},{"line_number":196,"context_line":"        ``features_command_line``. Subsections are"},{"line_number":197,"context_line":"        rendered underneath their top-level section in the"},{"line_number":198,"context_line":"        order set by this option. Warning: you should configure"},{"line_number":199,"context_line":"        ``semver_major``, ``semver_minor``, and ``semver_patch``"},{"line_number":200,"context_line":"        to include the relevant subsection names too."},{"line_number":201,"context_line":"        \"\"\")),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a77a912_7816a93d","line":198,"updated":"2023-02-09 14:58:14.000000000","message":"I wonder if we can use the sphinx directive here to make this a warning or note box? I\u0027m not sure this gets passed to sphinx intact though so it might not work.","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"},{"author":{"_account_id":35758,"name":"Eric Arellano","display_name":"Eric Arellano","email":"ericarellano@me.com","username":"arellano"},"change_message_id":"5ac7fbf2fdf60ba043bde9e938a79017db1bf97f","unresolved":true,"context_lines":[{"line_number":195,"context_line":"        in your notes, use the ID for the subsection, e.g."},{"line_number":196,"context_line":"        ``features_command_line``. Subsections are"},{"line_number":197,"context_line":"        rendered underneath their top-level section in the"},{"line_number":198,"context_line":"        order set by this option. Warning: you should configure"},{"line_number":199,"context_line":"        ``semver_major``, ``semver_minor``, and ``semver_patch``"},{"line_number":200,"context_line":"        to include the relevant subsection names too."},{"line_number":201,"context_line":"        \"\"\")),"}],"source_content_type":"text/x-python","patch_set":1,"id":"4270c3e7_b9b4b5a8","line":198,"in_reply_to":"3a77a912_7816a93d","updated":"2023-02-10 20:35:33.000000000","message":"I\u0027m not sure how I\u0027d do this. Although note that warning has always been a problem. The new syntax for subsections make that more obvious, and I moved the warning to a dedicated paragraph to make it more clear. So maybe it\u0027s fine as is?","commit_id":"9f641d2efaa402bedacc0bf40d003041b1a6b2b8"}]}
