)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6aab4cbc8d84965feb8b663e2e9696828da58271","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"67655104_a8837834","updated":"2022-01-26 23:12:55.000000000","message":"Looking good. Oh how I\u0027ve missed the wsgi_to_str dance :P\n\nI do wonder if we should move the wsgi_to_str in GET so we only have to do it once?","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e039154e5a9ed23b3f62b6d648a0b428ee18c594","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3c755247_4a9db6a5","updated":"2022-01-26 19:09:20.000000000","message":"recheck","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a372e99bb5f17a6ec71c2c60505808de57fbf4d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d6df57bf_4a8fae7d","updated":"2022-01-31 02:41:01.000000000","message":"Had a chat to Tim, we\u0027re looking at hopefully removing the six requirement when we drop py2. So pinning six isn\u0027t too big a deal. We can do that as a follow up if it causes problems.","commit_id":"5f25e1cc776eaf90c36487016f3b2bec282c86e7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"73f33e56364bf78f3943d3ffddaaff0a7cd15a42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3379407f_757b4b8b","updated":"2022-01-31 00:04:14.000000000","message":"Holding off a +2/+A until we have six\u003d\u003d1.12.0 pinned (maybe) so we can use the ensure_* methods. ","commit_id":"5f25e1cc776eaf90c36487016f3b2bec282c86e7"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1fba9167422e4438be20f8e219d494755b53c2cd","unresolved":true,"context_lines":[{"line_number":519,"context_line":"            if six.PY2:"},{"line_number":520,"context_line":"                query[\u0027marker\u0027] \u003d new_objects[-1][\u0027name\u0027].encode(\u0027utf-8\u0027)"},{"line_number":521,"context_line":"            else:"},{"line_number":522,"context_line":"                query[\u0027marker\u0027] \u003d new_objects[-1][\u0027name\u0027]"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"        last_part \u003d 0"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2e43fd65_a2e22cac","line":522,"updated":"2022-01-27 01:29:18.000000000","message":"Maybe I should\u0027ve used six.ensure_str() here, too...","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6aab4cbc8d84965feb8b663e2e9696828da58271","unresolved":true,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        result_elem \u003d Element(\u0027ListPartsResult\u0027)"},{"line_number":547,"context_line":"        SubElement(result_elem, \u0027Bucket\u0027).text \u003d req.container_name"},{"line_number":548,"context_line":"        name \u003d wsgi_to_str(req.object_name)"},{"line_number":549,"context_line":"        if encoding_type \u003d\u003d \u0027url\u0027:"},{"line_number":550,"context_line":"            name \u003d quote(name)"},{"line_number":551,"context_line":"        SubElement(result_elem, \u0027Key\u0027).text \u003d name"}],"source_content_type":"text/x-python","patch_set":3,"id":"37a69316_4eb00f42","line":548,"updated":"2022-01-26 23:12:55.000000000","message":"Maybe move this to above line 501 so we only have to call wsgi_to_str once in the GET method?","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1fba9167422e4438be20f8e219d494755b53c2cd","unresolved":true,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        result_elem \u003d Element(\u0027ListPartsResult\u0027)"},{"line_number":547,"context_line":"        SubElement(result_elem, \u0027Bucket\u0027).text \u003d req.container_name"},{"line_number":548,"context_line":"        name \u003d wsgi_to_str(req.object_name)"},{"line_number":549,"context_line":"        if encoding_type \u003d\u003d \u0027url\u0027:"},{"line_number":550,"context_line":"            name \u003d quote(name)"},{"line_number":551,"context_line":"        SubElement(result_elem, \u0027Key\u0027).text \u003d name"}],"source_content_type":"text/x-python","patch_set":3,"id":"3cbe7bc4_0c867439","line":548,"in_reply_to":"37a69316_4eb00f42","updated":"2022-01-27 01:29:18.000000000","message":"*shrug* May as well, I suppose.","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f8d557e4db8cbdc6eb1fdc36edb97c1459ff5daf","unresolved":true,"context_lines":[{"line_number":613,"context_line":"                container \u003d req.container_name + MULTIUPLOAD_SUFFIX"},{"line_number":614,"context_line":"                obj \u003d bytes_to_wsgi(o[\u0027name\u0027].encode(\u0027utf-8\u0027))"},{"line_number":615,"context_line":"                req.get_response(self.app, container\u003dcontainer, obj\u003dobj)"},{"line_number":616,"context_line":"            query[\u0027marker\u0027] \u003d six.ensure_str(new_objects[-1][\u0027name\u0027])"},{"line_number":617,"context_line":"            resp \u003d req.get_response(self.app, \u0027GET\u0027, container, \u0027\u0027,"},{"line_number":618,"context_line":"                                    query\u003dquery)"},{"line_number":619,"context_line":"            objects \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"4396f4a6_30752233","line":616,"range":{"start_line":616,"start_character":45,"end_line":616,"end_character":56},"updated":"2022-01-27 23:58:31.000000000","message":"This is just objects. Cut and paste error :)\n\nI\u0027ll push up a fix so we can get this landed.","commit_id":"330d0059f0936ce435d9fb8ca80b269a37f839c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d232c286861eb8022ac91872f2261405c428e7d9","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                container \u003d req.container_name + MULTIUPLOAD_SUFFIX"},{"line_number":614,"context_line":"                obj \u003d bytes_to_wsgi(o[\u0027name\u0027].encode(\u0027utf-8\u0027))"},{"line_number":615,"context_line":"                req.get_response(self.app, container\u003dcontainer, obj\u003dobj)"},{"line_number":616,"context_line":"            query[\u0027marker\u0027] \u003d six.ensure_str(new_objects[-1][\u0027name\u0027])"},{"line_number":617,"context_line":"            resp \u003d req.get_response(self.app, \u0027GET\u0027, container, \u0027\u0027,"},{"line_number":618,"context_line":"                                    query\u003dquery)"},{"line_number":619,"context_line":"            objects \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"53a153be_18ca368b","line":616,"range":{"start_line":616,"start_character":45,"end_line":616,"end_character":56},"in_reply_to":"4396f4a6_30752233","updated":"2022-01-28 00:50:25.000000000","message":"D\u0027oh! Thanks.","commit_id":"330d0059f0936ce435d9fb8ca80b269a37f839c0"}],"test/functional/s3api/s3_test_client.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6aab4cbc8d84965feb8b663e2e9696828da58271","unresolved":true,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"                        for obj in bucket.list_versions():"},{"line_number":101,"context_line":"                            if six.PY2:"},{"line_number":102,"context_line":"                                if not isinstance(obj.name, bytes):"},{"line_number":103,"context_line":"                                    obj.name \u003d obj.name.encode(\u0027utf-8\u0027)"},{"line_number":104,"context_line":"                                if obj.version_id is not None and \\"},{"line_number":105,"context_line":"                                        not isinstance(obj.version_id, bytes):"}],"source_content_type":"text/x-python","patch_set":3,"id":"591f93b1_d45c2ac4","line":102,"range":{"start_line":102,"start_character":60,"end_line":102,"end_character":65},"updated":"2022-01-26 23:12:55.000000000","message":"Would six.binary_type seeing as we\u0027re using six above.\n\nUPDATE: oh seems py2 sees the type as str but an isinstance(name, bytes) is true because str \u003d\u003d binary or whatever.. I guess this is ok.","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"}],"test/functional/s3api/test_multi_upload.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6aab4cbc8d84965feb8b663e2e9696828da58271","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            elem \u003d fromstring(body, \u0027InitiateMultipartUploadResult\u0027)"},{"line_number":135,"context_line":"            self.assertEqual(elem.find(\u0027Bucket\u0027).text, bucket)"},{"line_number":136,"context_line":"            key \u003d elem.find(\u0027Key\u0027).text"},{"line_number":137,"context_line":"            self.assertEqual(six.ensure_str(expected_key), key)"},{"line_number":138,"context_line":"            upload_id \u003d elem.find(\u0027UploadId\u0027).text"},{"line_number":139,"context_line":"            self.assertIsNotNone(upload_id)"},{"line_number":140,"context_line":"            self.assertNotIn((key, upload_id), uploads)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7bff03aa_fa5bb482","line":137,"updated":"2022-01-26 23:12:55.000000000","message":"Oh cool ensure_str, hadn\u0027t senen that before, nice.\n\nLife will get much simpler once we go py3 only!","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"73f33e56364bf78f3943d3ffddaaff0a7cd15a42","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            elem \u003d fromstring(body, \u0027InitiateMultipartUploadResult\u0027)"},{"line_number":135,"context_line":"            self.assertEqual(elem.find(\u0027Bucket\u0027).text, bucket)"},{"line_number":136,"context_line":"            key \u003d elem.find(\u0027Key\u0027).text"},{"line_number":137,"context_line":"            self.assertEqual(six.ensure_str(expected_key), key)"},{"line_number":138,"context_line":"            upload_id \u003d elem.find(\u0027UploadId\u0027).text"},{"line_number":139,"context_line":"            self.assertIsNotNone(upload_id)"},{"line_number":140,"context_line":"            self.assertNotIn((key, upload_id), uploads)"}],"source_content_type":"text/x-python","patch_set":3,"id":"79a72c3b_e896c00a","line":137,"in_reply_to":"2697d486_86518b6b","updated":"2022-01-31 00:04:14.000000000","message":"Shall we increase our minimum version then?\n\nEither in another change that this can be a follow up from or in this change.","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1fba9167422e4438be20f8e219d494755b53c2cd","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            elem \u003d fromstring(body, \u0027InitiateMultipartUploadResult\u0027)"},{"line_number":135,"context_line":"            self.assertEqual(elem.find(\u0027Bucket\u0027).text, bucket)"},{"line_number":136,"context_line":"            key \u003d elem.find(\u0027Key\u0027).text"},{"line_number":137,"context_line":"            self.assertEqual(six.ensure_str(expected_key), key)"},{"line_number":138,"context_line":"            upload_id \u003d elem.find(\u0027UploadId\u0027).text"},{"line_number":139,"context_line":"            self.assertIsNotNone(upload_id)"},{"line_number":140,"context_line":"            self.assertNotIn((key, upload_id), uploads)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bcad1b47_be1fda1d","line":137,"in_reply_to":"7bff03aa_fa5bb482","updated":"2022-01-27 01:29:18.000000000","message":"On that note... I finally got around to sending http://lists.openstack.org/pipermail/openstack-discuss/2022-January/026925.html","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"84ad5907326f792b90622505fbb0aaf86cb8fa5b","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            elem \u003d fromstring(body, \u0027InitiateMultipartUploadResult\u0027)"},{"line_number":135,"context_line":"            self.assertEqual(elem.find(\u0027Bucket\u0027).text, bucket)"},{"line_number":136,"context_line":"            key \u003d elem.find(\u0027Key\u0027).text"},{"line_number":137,"context_line":"            self.assertEqual(six.ensure_str(expected_key), key)"},{"line_number":138,"context_line":"            upload_id \u003d elem.find(\u0027UploadId\u0027).text"},{"line_number":139,"context_line":"            self.assertIsNotNone(upload_id)"},{"line_number":140,"context_line":"            self.assertNotIn((key, upload_id), uploads)"}],"source_content_type":"text/x-python","patch_set":3,"id":"2697d486_86518b6b","line":137,"in_reply_to":"8698d40b_221c90b2","updated":"2022-01-28 05:37:59.000000000","message":"Oh. Looks like the ensure_* functions came in six\u003d\u003d1.12.0 (https://github.com/benjaminp/six/commit/db3d0d6), but our minimum version is like 1.10.0 :-(","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f8d557e4db8cbdc6eb1fdc36edb97c1459ff5daf","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            elem \u003d fromstring(body, \u0027InitiateMultipartUploadResult\u0027)"},{"line_number":135,"context_line":"            self.assertEqual(elem.find(\u0027Bucket\u0027).text, bucket)"},{"line_number":136,"context_line":"            key \u003d elem.find(\u0027Key\u0027).text"},{"line_number":137,"context_line":"            self.assertEqual(six.ensure_str(expected_key), key)"},{"line_number":138,"context_line":"            upload_id \u003d elem.find(\u0027UploadId\u0027).text"},{"line_number":139,"context_line":"            self.assertIsNotNone(upload_id)"},{"line_number":140,"context_line":"            self.assertNotIn((key, upload_id), uploads)"}],"source_content_type":"text/x-python","patch_set":3,"id":"8698d40b_221c90b2","line":137,"in_reply_to":"bcad1b47_be1fda1d","updated":"2022-01-27 23:58:31.000000000","message":"Nice!","commit_id":"935986fc785f547c33cc0a6e3508f8fce1821f76"}]}
