)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6898a473_2c8383c6","updated":"2025-10-23 17:51:00.000000000","message":"The vendoring of the upstream code looks ok to me. I did try to note where there were changes which may have some impact beyond simple code formatting differences. I don\u0027t think those are super necessary to correct but may make debugging in the future easier if the code is as similar to upstream as possible.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a85de71dc3c80ef5ff8b87c1d469b079c8d90428","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f04f2f3f_375a224e","updated":"2025-10-28 18:12:21.000000000","message":"recheck test jobs shoudl be fixed now","commit_id":"73e6113a590bce9628e8f6a6d6ae018113ac80ef"}],"pbr/_compat/easy_install.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":true,"context_lines":[{"line_number":13,"context_line":"# Most of this code is copied from setuptools [1], licensed under the MIT"},{"line_number":14,"context_line":"# license"},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# [1] https://github.com/pypa/setuptools/blob/v67.8.0/setuptools/command/easy_install.py"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Permission is hereby granted, free of charge, to any person obtaining a copy"},{"line_number":19,"context_line":"# of this software and associated documentation files (the \"Software\"), to deal"}],"source_content_type":"text/x-python","patch_set":3,"id":"850551fc_5a876df1","line":16,"updated":"2025-10-23 17:51:00.000000000","message":"I note that this is an older version of setuptools, but newer setuptools refactored the code and made it far less easy to see where the actual ScriptWriter code is. Instead ScriptWriter is now in setuptools._scripts.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"32d50ee2c82047d376427595c0d5912c37674a97","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# Most of this code is copied from setuptools [1], licensed under the MIT"},{"line_number":14,"context_line":"# license"},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# [1] https://github.com/pypa/setuptools/blob/v67.8.0/setuptools/command/easy_install.py"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Permission is hereby granted, free of charge, to any person obtaining a copy"},{"line_number":19,"context_line":"# of this software and associated documentation files (the \"Software\"), to deal"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ef339c9_e34467dd","line":16,"in_reply_to":"850551fc_5a876df1","updated":"2025-10-24 09:58:45.000000000","message":"Yes. It also removed some functionality that we were relying on (but had no tests for), as called out in the commit message.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        s.encode(\u0027ascii\u0027)"},{"line_number":54,"context_line":"    except UnicodeError:"},{"line_number":55,"context_line":"        return False"},{"line_number":56,"context_line":"    return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def find_executable(executable, path\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"a463ff10_2c039cfe","line":56,"updated":"2025-10-23 17:51:00.000000000","message":"Nit the upstream code does the `return True` after line 53","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"32d50ee2c82047d376427595c0d5912c37674a97","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        s.encode(\u0027ascii\u0027)"},{"line_number":54,"context_line":"    except UnicodeError:"},{"line_number":55,"context_line":"        return False"},{"line_number":56,"context_line":"    return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def find_executable(executable, path\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7c85a0f0_285638f4","line":56,"in_reply_to":"a463ff10_2c039cfe","updated":"2025-10-24 09:58:45.000000000","message":"I don\u0027t remember fixing that so that was auto-pilot 😅","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def find_executable(executable, path\u003dNone):"},{"line_number":60,"context_line":"    \"\"\"Tries to find \u0027executable\u0027 in the directories listed in \u0027path\u0027."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A string listing directories separated by \u0027os.pathsep\u0027; defaults to"}],"source_content_type":"text/x-python","patch_set":3,"id":"f9caff8f_fd28b270","line":59,"updated":"2025-10-23 17:51:00.000000000","message":"This function seems to come from: https://github.com/pypa/setuptools/blob/v67.8.0/setuptools/_distutils/spawn.py#L75-L109 and may be worth capturing separately to the header at the top of the file due to the different source location.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"32d50ee2c82047d376427595c0d5912c37674a97","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def find_executable(executable, path\u003dNone):"},{"line_number":60,"context_line":"    \"\"\"Tries to find \u0027executable\u0027 in the directories listed in \u0027path\u0027."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A string listing directories separated by \u0027os.pathsep\u0027; defaults to"}],"source_content_type":"text/x-python","patch_set":3,"id":"34fd3820_017e62a9","line":59,"in_reply_to":"f9caff8f_fd28b270","updated":"2025-10-24 09:58:45.000000000","message":"Will do","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":true,"context_lines":[{"line_number":100,"context_line":"    \"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    options \u003d []  # type: list[str]"},{"line_number":103,"context_line":"    split_args \u003d dict()  # type: dict[str, bool]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @classmethod"},{"line_number":106,"context_line":"    def best(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6d386356_2b030fc3","line":103,"updated":"2025-10-23 17:51:00.000000000","message":"Nit the typing suffixes on these lines are not original.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"32d50ee2c82047d376427595c0d5912c37674a97","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    options \u003d []  # type: list[str]"},{"line_number":103,"context_line":"    split_args \u003d dict()  # type: dict[str, bool]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @classmethod"},{"line_number":106,"context_line":"    def best(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff5af48a_e8fb0816","line":103,"in_reply_to":"6d386356_2b030fc3","updated":"2025-10-24 09:58:45.000000000","message":"iirc, I initially started with `master` of setuptools, and that had type hints on these attributes (albeit in Python 3-style rather than comments). I can remove, but they\u0027re helpful docs in this case, and I don\u0027t see us ever changing this code again.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e59459ca7632ecc3695639458430f9b3950b7993","unresolved":true,"context_lines":[{"line_number":105,"context_line":"    @classmethod"},{"line_number":106,"context_line":"    def best(cls):"},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        choose the best commandspec class based on environmental conditions."},{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":"        return cls"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"89b28e65_d7ccdf66","line":108,"updated":"2025-10-23 17:51:00.000000000","message":"Nit the upstream docstring is `Choose the best CommandSpec class based on environmental conditions.`","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"32d50ee2c82047d376427595c0d5912c37674a97","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    @classmethod"},{"line_number":106,"context_line":"    def best(cls):"},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        choose the best commandspec class based on environmental conditions."},{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":"        return cls"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7456ff1d_557ecdc5","line":108,"in_reply_to":"89b28e65_d7ccdf66","updated":"2025-10-24 09:58:45.000000000","message":"I\u0027m not sure what happened here. Will fix.","commit_id":"4a3f881c2929f53766ba16d2625f722ec00df804"}]}
