)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"436ec6c282948c7ec46f2b15bd0cde096511a930","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c9cfaff8_583b4813","updated":"2026-08-19 11:59:50.000000000","message":"some non-blocking suggestions here https://review.opendev.org/c/openstack/swift/+/1001482","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"3761573a5c692035b1cf2086081f9feb798435bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8fe86a15_25e59635","in_reply_to":"c9cfaff8_583b4813","updated":"2026-08-19 14:34:18.000000000","message":"Thanks, squashed them into this one.","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"54b296e809405a3e11a164e5e59dde4e43dd35bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"6dae63a1_7ab9f40a","updated":"2026-08-20 08:52:04.000000000","message":"even better with the tests fixed :)","commit_id":"4f0838bebf9cba079e74e1613a0ba295b39af2f8"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ef139f9b50db8146bb77ed149df2c90614936942","unresolved":true,"context_lines":[{"line_number":91,"context_line":"            update_etag_is_at_header(req, sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":92,"context_line":"            # objects uploaded by the legacy swift3 middleware stored the"},{"line_number":93,"context_line":"            # S3-style etag under a different sysmeta name"},{"line_number":94,"context_line":"            update_etag_is_at_header(req, \u0027x-object-sysmeta-swift3-etag\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        object_name \u003d req.object_name"},{"line_number":97,"context_line":"        version_id \u003d req.params.get(\u0027versionId\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"cff53627_485b34fc","line":94,"updated":"2026-08-19 11:23:32.000000000","message":"I added a helper in the parent patch to mirror the s3api sysmeta namespace, would you be ok to use that? https://review.opendev.org/c/openstack/swift/+/1001356/2/swift/common/middleware/s3api/utils.py","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c946ff3b9db658ad7c4d3085e6466429cde916a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            update_etag_is_at_header(req, sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":92,"context_line":"            # objects uploaded by the legacy swift3 middleware stored the"},{"line_number":93,"context_line":"            # S3-style etag under a different sysmeta name"},{"line_number":94,"context_line":"            update_etag_is_at_header(req, \u0027x-object-sysmeta-swift3-etag\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        object_name \u003d req.object_name"},{"line_number":97,"context_line":"        version_id \u003d req.params.get(\u0027versionId\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfe5309a_96631000","line":94,"in_reply_to":"cff53627_485b34fc","updated":"2026-08-20 08:44:00.000000000","message":"Done","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"56abbe92983d45d9555099f1f4e07f427f25e053","unresolved":true,"context_lines":[{"line_number":128,"context_line":"    def test_object_HEAD(self):"},{"line_number":129,"context_line":"        self._test_object_GETorHEAD(\u0027HEAD\u0027)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _do_test_object_GETorHEAD_conditional(self, method, req_headers,"},{"line_number":132,"context_line":"                                              resp_headers\u003dNone):"},{"line_number":133,"context_line":"        headers \u003d dict(self.response_headers)"},{"line_number":134,"context_line":"        headers.update(resp_headers or {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c3a5fd4_5d67769b","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":33},"updated":"2026-08-19 11:34:10.000000000","message":"there are no HEAD test cases","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c946ff3b9db658ad7c4d3085e6466429cde916a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    def test_object_HEAD(self):"},{"line_number":129,"context_line":"        self._test_object_GETorHEAD(\u0027HEAD\u0027)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _do_test_object_GETorHEAD_conditional(self, method, req_headers,"},{"line_number":132,"context_line":"                                              resp_headers\u003dNone):"},{"line_number":133,"context_line":"        headers \u003d dict(self.response_headers)"},{"line_number":134,"context_line":"        headers.update(resp_headers or {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"466cb4c1_fda05ac5","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":33},"in_reply_to":"2c3a5fd4_5d67769b","updated":"2026-08-20 08:44:00.000000000","message":"Done","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"436ec6c282948c7ec46f2b15bd0cde096511a930","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        status, _, _ \u003d self.call_s3api(req)"},{"line_number":144,"context_line":"        # note: with s3_acl enabled the precondition may be evaluated by the"},{"line_number":145,"context_line":"        # acl HEAD subrequest, in which case there is no backend call for"},{"line_number":146,"context_line":"        # ``method`` to inspect"},{"line_number":147,"context_line":"        sw_headers \u003d [h for m, p, h in self.swift.calls_with_headers"},{"line_number":148,"context_line":"                      if m \u003d\u003d method and p \u003d\u003d \u0027/v1/AUTH_test/bucket/object\u0027]"},{"line_number":149,"context_line":"        return status.split()[0], sw_headers[-1] if sw_headers else None"}],"source_content_type":"text/x-python","patch_set":2,"id":"83f78804_bd6aae4c","line":146,"updated":"2026-08-19 11:59:50.000000000","message":"we could just filter the calls by path I think, and then the test will cover the cases when the acl HEAD returns 412","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c946ff3b9db658ad7c4d3085e6466429cde916a","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        status, _, _ \u003d self.call_s3api(req)"},{"line_number":144,"context_line":"        # note: with s3_acl enabled the precondition may be evaluated by the"},{"line_number":145,"context_line":"        # acl HEAD subrequest, in which case there is no backend call for"},{"line_number":146,"context_line":"        # ``method`` to inspect"},{"line_number":147,"context_line":"        sw_headers \u003d [h for m, p, h in self.swift.calls_with_headers"},{"line_number":148,"context_line":"                      if m \u003d\u003d method and p \u003d\u003d \u0027/v1/AUTH_test/bucket/object\u0027]"},{"line_number":149,"context_line":"        return status.split()[0], sw_headers[-1] if sw_headers else None"}],"source_content_type":"text/x-python","patch_set":2,"id":"8805570c_7b2512b2","line":146,"in_reply_to":"83f78804_bd6aae4c","updated":"2026-08-20 08:44:00.000000000","message":"Done","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"436ec6c282948c7ec46f2b15bd0cde096511a930","unresolved":true,"context_lines":[{"line_number":158,"context_line":"        self.assertEqual(\u0027200\u0027, status)"},{"line_number":159,"context_line":"        self.assertEqual(\u0027x-object-sysmeta-s3api-etag,\u0027"},{"line_number":160,"context_line":"                         \u0027x-object-sysmeta-swift3-etag\u0027,"},{"line_number":161,"context_line":"                         sw_headers.get(\u0027X-Backend-Etag-Is-At\u0027))"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def test_object_GET_if_match_legacy_swift3_etag_mismatch(self):"},{"line_number":164,"context_line":"        legacy_etag \u003d \u0027%s-2\u0027 % self.etag"}],"source_content_type":"text/x-python","patch_set":2,"id":"62fb1e2f_6c2d7785","line":161,"updated":"2026-08-19 11:59:50.000000000","message":"this assertion should be true in all test cases","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c946ff3b9db658ad7c4d3085e6466429cde916a","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.assertEqual(\u0027200\u0027, status)"},{"line_number":159,"context_line":"        self.assertEqual(\u0027x-object-sysmeta-s3api-etag,\u0027"},{"line_number":160,"context_line":"                         \u0027x-object-sysmeta-swift3-etag\u0027,"},{"line_number":161,"context_line":"                         sw_headers.get(\u0027X-Backend-Etag-Is-At\u0027))"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def test_object_GET_if_match_legacy_swift3_etag_mismatch(self):"},{"line_number":164,"context_line":"        legacy_etag \u003d \u0027%s-2\u0027 % self.etag"}],"source_content_type":"text/x-python","patch_set":2,"id":"656dd0f2_7b0328b0","line":161,"in_reply_to":"62fb1e2f_6c2d7785","updated":"2026-08-20 08:44:00.000000000","message":"Done","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"56abbe92983d45d9555099f1f4e07f427f25e053","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        status, sw_headers \u003d self._do_test_object_GETorHEAD_conditional("},{"line_number":166,"context_line":"            \u0027GET\u0027, {\u0027If-Match\u0027: \u0027\"not-%s\"\u0027 % legacy_etag},"},{"line_number":167,"context_line":"            {\u0027X-Object-Sysmeta-Swift3-Etag\u0027: legacy_etag})"},{"line_number":168,"context_line":"        self.assertEqual(\u0027412\u0027, status)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def test_object_GET_if_none_match_legacy_swift3_etag(self):"},{"line_number":171,"context_line":"        legacy_etag \u003d \u0027%s-2\u0027 % self.etag"}],"source_content_type":"text/x-python","patch_set":2,"id":"e6cc8cff_94217167","line":168,"updated":"2026-08-19 11:34:10.000000000","message":"nit: assert ``sw_headers.get(\u0027X-Backend-Etag-Is-At\u0027)`` in all the tests","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c946ff3b9db658ad7c4d3085e6466429cde916a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        status, sw_headers \u003d self._do_test_object_GETorHEAD_conditional("},{"line_number":166,"context_line":"            \u0027GET\u0027, {\u0027If-Match\u0027: \u0027\"not-%s\"\u0027 % legacy_etag},"},{"line_number":167,"context_line":"            {\u0027X-Object-Sysmeta-Swift3-Etag\u0027: legacy_etag})"},{"line_number":168,"context_line":"        self.assertEqual(\u0027412\u0027, status)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def test_object_GET_if_none_match_legacy_swift3_etag(self):"},{"line_number":171,"context_line":"        legacy_etag \u003d \u0027%s-2\u0027 % self.etag"}],"source_content_type":"text/x-python","patch_set":2,"id":"a8f6c502_a74376a0","line":168,"in_reply_to":"e6cc8cff_94217167","updated":"2026-08-20 08:44:00.000000000","message":"Done","commit_id":"297a313c6d0d2a8f3482b4e38945f1068661bf47"}]}
