)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5d00bc07_badaba1d","updated":"2025-07-08 21:43:51.000000000","message":"There are a number of comments but the -1 is only for the `pbr._compat.get_distributions()` lookup issue.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"}],"pbr/_compat/metadata.py":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0c87b44ca640df716bab69c292a86471f945ba61","unresolved":true,"context_lines":[{"line_number":146,"context_line":"        import importlib_metadata"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            return importlib.metadata.distribution(package_name).version"},{"line_number":150,"context_line":"        except importlib_metadata.PackageNotFoundError:"},{"line_number":151,"context_line":"            raise PackageNotFound(package_name)"},{"line_number":152,"context_line":"    else:  # METADATA_LIB_LEGACY"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ab0dfa9_ea0bf7ec","line":149,"range":{"start_line":149,"start_character":28,"end_line":149,"end_character":29},"updated":"2025-07-03 19:44:35.000000000","message":"```suggestion\n            return importlib_metadata.distribution(package_name).version\n```\n?","commit_id":"e172d2e1f87f3bf15788e62c67e27af2300a162e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"677f6277ac3da5a793b1f9eaab1ff892c304ed43","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        import importlib_metadata"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            return importlib.metadata.distribution(package_name).version"},{"line_number":150,"context_line":"        except importlib_metadata.PackageNotFoundError:"},{"line_number":151,"context_line":"            raise PackageNotFound(package_name)"},{"line_number":152,"context_line":"    else:  # METADATA_LIB_LEGACY"}],"source_content_type":"text/x-python","patch_set":2,"id":"ded02449_1844495d","line":149,"range":{"start_line":149,"start_character":28,"end_line":149,"end_character":29},"in_reply_to":"3ab0dfa9_ea0bf7ec","updated":"2025-07-04 09:10:54.000000000","message":"Ugh, I knew something like this would happen 😅","commit_id":"e172d2e1f87f3bf15788e62c67e27af2300a162e"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"04277c144ea660bbe512926611308331eafe0f21","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":"    else:"},{"line_number":46,"context_line":"        _metadata_lib \u003d METADATA_LIB_BACKPORT"},{"line_number":47,"context_line":"        return _metadata_lib"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    # pkg_resources is our fallback. This will always be available on older"},{"line_number":50,"context_line":"    # Python versions since it\u0027s part of setuptools."}],"source_content_type":"text/x-python","patch_set":3,"id":"ca2b942f_19101819","line":47,"updated":"2025-07-08 16:51:49.000000000","message":"Couldn\u0027t this be simplified to just return from within the try?","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":"    else:"},{"line_number":46,"context_line":"        _metadata_lib \u003d METADATA_LIB_BACKPORT"},{"line_number":47,"context_line":"        return _metadata_lib"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    # pkg_resources is our fallback. This will always be available on older"},{"line_number":50,"context_line":"    # Python versions since it\u0027s part of setuptools."}],"source_content_type":"text/x-python","patch_set":3,"id":"4f80c3d0_18b355e2","line":47,"in_reply_to":"ca2b942f_19101819","updated":"2025-07-09 13:46:53.000000000","message":"I was trying to keep as little context in the try block as possible, but I can do this.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":true,"context_lines":[{"line_number":65,"context_line":"def get_distributions():"},{"line_number":66,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":67,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":68,"context_line":"        import importlib.metadata"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        data \u003d sorted("},{"line_number":71,"context_line":"            importlib.metadata.distributions(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"0ddb8e68_e962ea33","line":68,"updated":"2025-07-08 21:43:51.000000000","message":"This is a small nit but if we put the import in _get_metadata_lib() for importlib.metadata (we already do for importlib_metadata and pkg_resourcs) then we would only need to import once since _get_metadata_lib() caches the result with the global _metadata_lib. I doubt the performance impact is large though as python should mostly optimize these subsequent imports away so I guess it depends on what we feel is easier to read and more defensive.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"def get_distributions():"},{"line_number":66,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":67,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":68,"context_line":"        import importlib.metadata"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        data \u003d sorted("},{"line_number":71,"context_line":"            importlib.metadata.distributions(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"b4434c21_27a9f675","line":68,"in_reply_to":"0ddb8e68_e962ea33","updated":"2025-07-09 13:46:53.000000000","message":"I contemplated both approaches and decided I preferred this one. There\u0027s definite duplication, but it\u0027s very clear what library I\u0027m calling and e.g. type checkers have an easier time detecting obvious errors like using the wrong function call for a given library.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":true,"context_lines":[{"line_number":100,"context_line":"def get_metadata(package_name):"},{"line_number":101,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":102,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":103,"context_line":"        import importlib.metadata"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            data \u003d importlib.metadata.distribution(package_name).metadata["}],"source_content_type":"text/x-python","patch_set":3,"id":"6ef2189c_f421a075","line":103,"updated":"2025-07-08 21:43:51.000000000","message":"See above comment about importing importlib.metadata.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":100,"context_line":"def get_metadata(package_name):"},{"line_number":101,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":102,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":103,"context_line":"        import importlib.metadata"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            data \u003d importlib.metadata.distribution(package_name).metadata["}],"source_content_type":"text/x-python","patch_set":3,"id":"2311ba8d_2c7414be","line":103,"in_reply_to":"6ef2189c_f421a075","updated":"2025-07-09 13:46:53.000000000","message":"Acknowledged","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":true,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    try:"},{"line_number":131,"context_line":"        return json.loads(data)"},{"line_number":132,"context_line":"    except Exception:"},{"line_number":133,"context_line":"        return None"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4ce4cdf8_6cd1830d","line":132,"updated":"2025-07-08 21:43:51.000000000","message":"I wonder if it is worth a `log.debug(\u0027Invalid json content in pbr.json for %s\u0027, package_name)` or similar in this case. The old code didn\u0027t do this so don\u0027t consider this a necessity.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    try:"},{"line_number":131,"context_line":"        return json.loads(data)"},{"line_number":132,"context_line":"    except Exception:"},{"line_number":133,"context_line":"        return None"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"03a1e60c_07a1c725","line":132,"in_reply_to":"4ce4cdf8_6cd1830d","updated":"2025-07-09 13:46:53.000000000","message":"I\u0027d be inclined not to yet, since all our logging is using `distutils.log` and idk if that\u0027s being kept or not. I\u0027ve left a comment.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":true,"context_lines":[{"line_number":136,"context_line":"def get_version(package_name):"},{"line_number":137,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":138,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":139,"context_line":"        import importlib.metadata"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        try:"},{"line_number":142,"context_line":"            return importlib.metadata.distribution(package_name).version"}],"source_content_type":"text/x-python","patch_set":3,"id":"8d36f48f_ecb09417","line":139,"updated":"2025-07-08 21:43:51.000000000","message":"See above comment about importing importlib.metadata.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":136,"context_line":"def get_version(package_name):"},{"line_number":137,"context_line":"    metadata_lib \u003d _get_metadata_lib()"},{"line_number":138,"context_line":"    if metadata_lib \u003d\u003d METADATA_LIB_STDLIB:"},{"line_number":139,"context_line":"        import importlib.metadata"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        try:"},{"line_number":142,"context_line":"            return importlib.metadata.distribution(package_name).version"}],"source_content_type":"text/x-python","patch_set":3,"id":"2d9dddbd_81146b9a","line":139,"in_reply_to":"8d36f48f_ecb09417","updated":"2025-07-09 13:46:53.000000000","message":"Acknowledged","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"}],"pbr/cmd/main.py":[{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"04277c144ea660bbe512926611308331eafe0f21","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                if not part.isdigit():"},{"line_number":60,"context_line":"                    released \u003d \"pre-release\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    return {"},{"line_number":63,"context_line":"        \u0027name\u0027: package_name,"},{"line_number":64,"context_line":"        \u0027version\u0027: version,"},{"line_number":65,"context_line":"        \u0027sha\u0027: sha,"}],"source_content_type":"text/x-python","patch_set":3,"id":"8eeeac5e_85608762","line":62,"updated":"2025-07-08 16:51:49.000000000","message":"Looks like this is just a stylistic change? Or was there a deeper reason?","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"274966e54e8afdadee4556406c49924c10398152","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                if not part.isdigit():"},{"line_number":60,"context_line":"                    released \u003d \"pre-release\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    return {"},{"line_number":63,"context_line":"        \u0027name\u0027: package_name,"},{"line_number":64,"context_line":"        \u0027version\u0027: version,"},{"line_number":65,"context_line":"        \u0027sha\u0027: sha,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2d108d0b_555ed2b5","line":62,"in_reply_to":"8eeeac5e_85608762","updated":"2025-07-08 16:55:34.000000000","message":"Nope. This patch was written before the black one, and I expected black to handle this when rebased (ruff does) 🤦‍♂️","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2a586c8c7733fdfd98b151746d14fc29542a6849","unresolved":true,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def freeze(args):"},{"line_number":71,"context_line":"    for dist in pbr._compat.get_distributions():"},{"line_number":72,"context_line":"        info \u003d _get_info(dist.project_name)"},{"line_number":73,"context_line":"        output \u003d \"{name}\u003d\u003d{version}\".format(**info)"},{"line_number":74,"context_line":"        if info[\u0027sha\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"e75a6fbe_28f4857a","line":71,"updated":"2025-07-08 21:43:51.000000000","message":"Shouldn\u0027t this be `pbr.compat.metadata.get_distributions()`? The __init__.py for _compat appears to be empty so `pbr._compat.get_distributions()` won\u0027t resolve.\n\nSide note I wonder if this implies we don\u0027t test `pbr freeze` output.","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cad57a7b15a96440fb41fa47212c08ebd2b39bc7","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def freeze(args):"},{"line_number":71,"context_line":"    for dist in pbr._compat.get_distributions():"},{"line_number":72,"context_line":"        info \u003d _get_info(dist.project_name)"},{"line_number":73,"context_line":"        output \u003d \"{name}\u003d\u003d{version}\".format(**info)"},{"line_number":74,"context_line":"        if info[\u0027sha\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"4fa46e9f_3ad079fb","line":71,"in_reply_to":"e75a6fbe_28f4857a","updated":"2025-07-09 13:46:53.000000000","message":"Good catch. It should. We have tests for `freeze` in `pbr/tests/test_integration.py` (`pbr.tests.test_integration.TestInstallWithoutPbr.test_install_without_pbr`) and they passed. I have no idea how/why though...\n\nhttps://c918cbae52d07f0b694c-87cfb8a8e579ae39cc41214d7e8b69d2.ssl.cf1.rackcdn.com/openstack/62e62ffc75524570ac8f395c0d6ff442/job-output.txt","commit_id":"2677b29364bd6f1f8760c5a85efabffcabb80229"}]}
