)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"18a361c4d6c5887e6d2add9c29732b761ceee44e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0cf6bb18_e0adff7e","updated":"2026-03-05 20:28:47.000000000","message":"Thanks for the quick turnaround here.","commit_id":"3d937dbb1cba58e390b8ec1f70b0747a605b0f82"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"57290067728c7af34f32725746157c12ac42cbb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fd2914ab_9b995a57","in_reply_to":"0cf6bb18_e0adff7e","updated":"2026-03-05 20:40:02.000000000","message":"Thanks for the quick review, o/.","commit_id":"3d937dbb1cba58e390b8ec1f70b0747a605b0f82"}],"oslo_utils/strutils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"801a3838645c3f0ef60923e7ae3ed6382f09039a","unresolved":true,"context_lines":[{"line_number":504,"context_line":"def mask_dict_password("},{"line_number":505,"context_line":"    dictionary: collections.abc.Mapping[Any, Any],"},{"line_number":506,"context_line":"    secret: str \u003d \"***\",  # noqa: S107"},{"line_number":507,"context_line":"    deep: bool \u003d False,"},{"line_number":508,"context_line":") -\u003e dict[str, Any]:"},{"line_number":509,"context_line":"    \"\"\"Replace password with *secret* in a dictionary recursively."},{"line_number":510,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2dc33cd2_76f910c4","line":507,"updated":"2026-03-05 17:32:36.000000000","message":"Are we *totally* sure what this should be opt-in? It seems like an information leak waiting to happen","commit_id":"dbe8dfb231fb8d3a7c79719aacba781a7e20424a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a1898ee203c46ca616d5804459350a8461a0084e","unresolved":false,"context_lines":[{"line_number":504,"context_line":"def mask_dict_password("},{"line_number":505,"context_line":"    dictionary: collections.abc.Mapping[Any, Any],"},{"line_number":506,"context_line":"    secret: str \u003d \"***\",  # noqa: S107"},{"line_number":507,"context_line":"    deep: bool \u003d False,"},{"line_number":508,"context_line":") -\u003e dict[str, Any]:"},{"line_number":509,"context_line":"    \"\"\"Replace password with *secret* in a dictionary recursively."},{"line_number":510,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8c5d7ce7_754e87b4","line":507,"in_reply_to":"2dc33cd2_76f910c4","updated":"2026-03-05 20:22:13.000000000","message":"Done","commit_id":"dbe8dfb231fb8d3a7c79719aacba781a7e20424a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a1898ee203c46ca616d5804459350a8461a0084e","unresolved":true,"context_lines":[{"line_number":487,"context_line":""},{"line_number":488,"context_line":"def _deep_mask(value: object, secret: str) -\u003e object:"},{"line_number":489,"context_line":"    if isinstance(value, collections.abc.Mapping):"},{"line_number":490,"context_line":"        return mask_dict_password(value, secret\u003dsecret)"},{"line_number":491,"context_line":"    if isinstance(value, (list, tuple)):"},{"line_number":492,"context_line":"        items \u003d [_deep_mask(v, secret\u003dsecret) for v in value]"},{"line_number":493,"context_line":"        return items if isinstance(value, list) else tuple(items)"},{"line_number":494,"context_line":"    if isinstance(value, str):"},{"line_number":495,"context_line":"        return mask_password(value, secret\u003dsecret)"},{"line_number":496,"context_line":"    return value"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4dda7a40_e3ed7e85","line":495,"range":{"start_line":490,"start_character":55,"end_line":495,"end_character":50},"updated":"2026-03-05 20:22:13.000000000","message":"Per my comment below.\n\n```suggestion\n        return mask_dict_password(value, secret\u003dsecret)\n\n    if isinstance(value, str):\n        return mask_password(value, secret\u003dsecret)\n\n    if isinstance(value, collections.abc.Collection):\n        items \u003d [_deep_mask(v, secret\u003dsecret) for v in value]\n        return items if isinstance(value, list) else tuple(items)\n```","commit_id":"d1e7b8efa0772da58a85ee816540ea69ce9fbe21"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"d6a86401852f1582f40dfabac661293269e7c183","unresolved":false,"context_lines":[{"line_number":487,"context_line":""},{"line_number":488,"context_line":"def _deep_mask(value: object, secret: str) -\u003e object:"},{"line_number":489,"context_line":"    if isinstance(value, collections.abc.Mapping):"},{"line_number":490,"context_line":"        return mask_dict_password(value, secret\u003dsecret)"},{"line_number":491,"context_line":"    if isinstance(value, (list, tuple)):"},{"line_number":492,"context_line":"        items \u003d [_deep_mask(v, secret\u003dsecret) for v in value]"},{"line_number":493,"context_line":"        return items if isinstance(value, list) else tuple(items)"},{"line_number":494,"context_line":"    if isinstance(value, str):"},{"line_number":495,"context_line":"        return mask_password(value, secret\u003dsecret)"},{"line_number":496,"context_line":"    return value"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7437be4b_032442b8","line":495,"range":{"start_line":490,"start_character":55,"end_line":495,"end_character":50},"in_reply_to":"4dda7a40_e3ed7e85","updated":"2026-03-05 20:26:44.000000000","message":"Fix applied.","commit_id":"d1e7b8efa0772da58a85ee816540ea69ce9fbe21"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a1898ee203c46ca616d5804459350a8461a0084e","unresolved":true,"context_lines":[{"line_number":578,"context_line":"            # _SANITIZE_KEYS, so we fall through to here"},{"line_number":579,"context_line":"            if isinstance(v, str):"},{"line_number":580,"context_line":"                out[k] \u003d mask_password(v, secret\u003dsecret)"},{"line_number":581,"context_line":"            elif isinstance(v, (list, tuple)):"},{"line_number":582,"context_line":"                out[k] \u003d _deep_mask(v, secret\u003dsecret)"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # Just leave it alone."}],"source_content_type":"text/x-python","patch_set":2,"id":"d469469b_ced6310c","line":581,"updated":"2026-03-05 20:22:13.000000000","message":"```suggestion\n            elif isinstance(v, collections.abc.Collection):\n```\n\nThis will handle sets also. It\u0027ll also handle strings so we\u0027ll have to be careful to handle them first, as we do here.","commit_id":"d1e7b8efa0772da58a85ee816540ea69ce9fbe21"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"d6a86401852f1582f40dfabac661293269e7c183","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            # _SANITIZE_KEYS, so we fall through to here"},{"line_number":579,"context_line":"            if isinstance(v, str):"},{"line_number":580,"context_line":"                out[k] \u003d mask_password(v, secret\u003dsecret)"},{"line_number":581,"context_line":"            elif isinstance(v, (list, tuple)):"},{"line_number":582,"context_line":"                out[k] \u003d _deep_mask(v, secret\u003dsecret)"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # Just leave it alone."}],"source_content_type":"text/x-python","patch_set":2,"id":"9197c2b4_c809d362","line":581,"in_reply_to":"d469469b_ced6310c","updated":"2026-03-05 20:26:44.000000000","message":"Fix applied.","commit_id":"d1e7b8efa0772da58a85ee816540ea69ce9fbe21"}]}
