)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"5731659cb002f44699f49af9b185e4c8339308e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"07bf8828_677b8ba4","updated":"2025-07-09 15:57:18.000000000","message":"-1 for the ConfigParser.read_file() issue inline. The other comments are just nits.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d4b01dee00de81bcad192032c0ec12770c22b89a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"02832721_24ca93fc","updated":"2025-07-11 10:12:17.000000000","message":"recheck\n\nThe fact that this has failed twice is slightly concerning, but it looks like a race that isn\u0027t reproducing on subsequent patches so...","commit_id":"4f8e23dbf497a585982ec19487ff8332f40bcb03"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"89438150e2fc50901be87083321aab30c7de580d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d1a81a6d_6982a4e0","updated":"2025-07-10 16:37:37.000000000","message":"recheck unrelated failure","commit_id":"4f8e23dbf497a585982ec19487ff8332f40bcb03"}],"pbr/_compat/five.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"5731659cb002f44699f49af9b185e4c8339308e4","unresolved":true,"context_lines":[{"line_number":47,"context_line":"if sys.version_info \u003e\u003d (3, 2):"},{"line_number":48,"context_line":"    ConfigParser \u003d configparser.ConfigParser"},{"line_number":49,"context_line":"else:"},{"line_number":50,"context_line":"    ConfigParser \u003d configparser.SafeConfigParser"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# urllib.parse.urlparse"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3cc0ca23_54ce0532","line":50,"updated":"2025-07-09 15:57:18.000000000","message":"For a followup maybe we should convert the use of `configparser` to ConfigParser` and drop the first configparser compat layer. I don\u0027t think that is worth a new patchset here as this is a direct reorganization of the existing code which is easier to review for now.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9710241b56bdad21748b080bf39154b05e5481e7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"if sys.version_info \u003e\u003d (3, 2):"},{"line_number":48,"context_line":"    ConfigParser \u003d configparser.ConfigParser"},{"line_number":49,"context_line":"else:"},{"line_number":50,"context_line":"    ConfigParser \u003d configparser.SafeConfigParser"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# urllib.parse.urlparse"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd41bfa_d563123b","line":50,"in_reply_to":"3cc0ca23_54ce0532","updated":"2025-07-09 17:58:40.000000000","message":"See my comment on `sphinxext.py`","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3949e025a3a90494f7760d8d3ce94a7a103e36fd","unresolved":true,"context_lines":[{"line_number":64,"context_line":"else:"},{"line_number":65,"context_line":"    from urllib2 import urlopen  # noqa"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# mock"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"if sys.version_info \u003e\u003d (3, 3):"},{"line_number":70,"context_line":"    from unittest import mock"},{"line_number":71,"context_line":"else:"},{"line_number":72,"context_line":"    import mock  # noqa"}],"source_content_type":"text/x-python","patch_set":2,"id":"754d4fa9_6251de73","line":72,"range":{"start_line":67,"start_character":0,"end_line":72,"end_character":23},"updated":"2025-07-10 10:31:10.000000000","message":"mock is not a runtime dependency: we can\u0027t do this here","commit_id":"186e12f8ac309511bb7204a08db6e78d14a22a81"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"48755b97edb574be47d29561ea6948d905dacb04","unresolved":false,"context_lines":[{"line_number":64,"context_line":"else:"},{"line_number":65,"context_line":"    from urllib2 import urlopen  # noqa"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# mock"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"if sys.version_info \u003e\u003d (3, 3):"},{"line_number":70,"context_line":"    from unittest import mock"},{"line_number":71,"context_line":"else:"},{"line_number":72,"context_line":"    import mock  # noqa"}],"source_content_type":"text/x-python","patch_set":2,"id":"6587d390_335a7838","line":72,"range":{"start_line":67,"start_character":0,"end_line":72,"end_character":23},"in_reply_to":"754d4fa9_6251de73","updated":"2025-07-11 13:04:41.000000000","message":"Done","commit_id":"186e12f8ac309511bb7204a08db6e78d14a22a81"}],"pbr/sphinxext.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"5731659cb002f44699f49af9b185e4c8339308e4","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from sphinx.util import logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from pbr._compat.five import configparser"},{"line_number":24,"context_line":"import pbr.version"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_project \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"564d251b_b56d1789","line":23,"updated":"2025-07-09 15:57:18.000000000","message":"This is the use of `configparser` that we might want to switch to `five.ConfigParser`.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9710241b56bdad21748b080bf39154b05e5481e7","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from sphinx.util import logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from pbr._compat.five import configparser"},{"line_number":24,"context_line":"import pbr.version"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_project \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"2fa01b9a_aecabb69","line":23,"in_reply_to":"564d251b_b56d1789","updated":"2025-07-09 17:58:40.000000000","message":"See below.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"4e4f6896c1a56e826ce5ded19a9c211af78526a9","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from sphinx.util import logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from pbr._compat.five import configparser"},{"line_number":24,"context_line":"import pbr.version"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_project \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"161a8d45_39e871ae","line":23,"in_reply_to":"564d251b_b56d1789","updated":"2025-07-09 17:30:39.000000000","message":"configparser is imported into five now. Doe that automatically make it accessible via five.configparser? If tests pass I guess this is good enough.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9710241b56bdad21748b080bf39154b05e5481e7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            project \u003d parser.get(\u0027metadata\u0027, \u0027name\u0027)"},{"line_number":73,"context_line":"            if len(project.split()) \u003d\u003d 1 and len(project) \u003e 32:"},{"line_number":74,"context_line":"                project \u003d parser.get(\u0027metadata\u0027, \u0027summary\u0027)"},{"line_number":75,"context_line":"        except configparser.Error:"},{"line_number":76,"context_line":"            logger.info(\u0027Could not extract project metadata from setup.cfg\u0027)"},{"line_number":77,"context_line":"            return None"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a2ddaa1_5612c4d7","line":75,"updated":"2025-07-09 17:58:40.000000000","message":"We need it here also","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"}],"pbr/tests/test_util.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"5731659cb002f44699f49af9b185e4c8339308e4","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    config \u003d {}"},{"line_number":30,"context_line":"    ini \u003d textwrap.dedent(ini)"},{"line_number":31,"context_line":"    parser \u003d ConfigParser()"},{"line_number":32,"context_line":"    parser.read_file(io.StringIO(ini))"},{"line_number":33,"context_line":"    for section in parser.sections():"},{"line_number":34,"context_line":"        config[section] \u003d dict(parser.items(section))"},{"line_number":35,"context_line":"    return config"}],"source_content_type":"text/x-python","patch_set":1,"id":"3720c393_85e54589","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":20},"updated":"2025-07-09 15:57:18.000000000","message":"I don\u0027t think python2 (and maybe early python3 but we care less about that) supports ConfigParser.read_file(): https://docs.python.org/2.7/library/configparser.html. This may also require a compat layer? Or we can carry a one off if else case here since it is just for testing the impact should be low.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98fc193a3b41975b3c3ca505b7465d6ca40cd1f4","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    config \u003d {}"},{"line_number":30,"context_line":"    ini \u003d textwrap.dedent(ini)"},{"line_number":31,"context_line":"    parser \u003d ConfigParser()"},{"line_number":32,"context_line":"    parser.read_file(io.StringIO(ini))"},{"line_number":33,"context_line":"    for section in parser.sections():"},{"line_number":34,"context_line":"        config[section] \u003d dict(parser.items(section))"},{"line_number":35,"context_line":"    return config"}],"source_content_type":"text/x-python","patch_set":1,"id":"6ef4abb5_79f7b298","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":20},"in_reply_to":"3720c393_85e54589","updated":"2025-07-09 16:56:07.000000000","message":"Damn, I missed that.","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9710241b56bdad21748b080bf39154b05e5481e7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    config \u003d {}"},{"line_number":30,"context_line":"    ini \u003d textwrap.dedent(ini)"},{"line_number":31,"context_line":"    parser \u003d ConfigParser()"},{"line_number":32,"context_line":"    parser.read_file(io.StringIO(ini))"},{"line_number":33,"context_line":"    for section in parser.sections():"},{"line_number":34,"context_line":"        config[section] \u003d dict(parser.items(section))"},{"line_number":35,"context_line":"    return config"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb6c5995_ff18f7c6","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":20},"in_reply_to":"6ef4abb5_79f7b298","updated":"2025-07-09 17:58:40.000000000","message":"Done","commit_id":"818b522c6b777d95e1bf74fb6f41a99ec75a22ae"}]}
