)]}'
{"swift/common/middleware/s3api/controllers/multi_delete.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e4e38d1b21b910539ecb3cf5fdb6f178c01197d3","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            req \u003d copy.copy(req)"},{"line_number":113,"context_line":"            req.object_name \u003d key"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_d18c1583","line":112,"updated":"2018-11-15 20:20:57.000000000","message":"Can\u0027t do deepcopy() because you can\u0027t pickle cStringIOs (apparently) -- hopefully a shallow copy is good enough?","commit_id":"ee6d983b60722ec7a66bca2aec93d56922c8abab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7239edbb5fcf1e76c4d94c7da6389fa04af68d22","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            req.object_name \u003d key"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            try:"},{"line_number":116,"context_line":"                query \u003d req.gen_multipart_manifest_delete_query(self.app)"},{"line_number":117,"context_line":"                req.get_response(self.app, method\u003d\u0027DELETE\u0027, query\u003dquery)"},{"line_number":118,"context_line":"            except NoSuchKey:"},{"line_number":119,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_712661cf","line":116,"updated":"2018-11-15 21:12:11.000000000","message":"I take it back, dropping this and always passing query\u003dNone actually seems to *increase* response time when most/all objects don\u0027t exist, probably because we start needing to actually write down tombstones.","commit_id":"ee6d983b60722ec7a66bca2aec93d56922c8abab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27d629436041ec868b850a8172448fcdde159ef5","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            return HTTPOk(body\u003dbody)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        def do_delete(req, key, version):"},{"line_number":108,"context_line":"            if version is not None:"},{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_779346b1","line":108,"updated":"2018-12-06 21:15:42.000000000","message":"This isn\u0027t tested, or handled - and and seems to blow up the entire request?","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ee730be35fdde37928d17879feff7e024743740","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            return HTTPOk(body\u003dbody)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        def do_delete(req, key, version):"},{"line_number":108,"context_line":"            if version is not None:"},{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f2c0c12e","line":108,"in_reply_to":"3f79a3b5_0fe75a46","updated":"2018-12-06 23:21:54.000000000","message":"Added a test.","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"47c9e4a914b0f408b4cdf4878e2ebd4ffbfd170b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            return HTTPOk(body\u003dbody)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        def do_delete(req, key, version):"},{"line_number":108,"context_line":"            if version is not None:"},{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0fe75a46","line":108,"in_reply_to":"3f79a3b5_779346b1","updated":"2018-12-06 21:38:20.000000000","message":"Yup, just like before.","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27d629436041ec868b850a8172448fcdde159ef5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            req \u003d copy.copy(req)"},{"line_number":113,"context_line":"            req.object_name \u003d key"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b7579ef6","line":112,"updated":"2018-12-06 21:15:42.000000000","message":"S3Request inherits form swob which seems to take some care when creating copy\u0027s (e.g. the id of req.enviorn is the same before and after this line)\n\nThe intent here seems reasonable, I worry there\u0027d a subtle side-effect that could expose a bug in a race...","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ee730be35fdde37928d17879feff7e024743740","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            req \u003d copy.copy(req)"},{"line_number":113,"context_line":"            req.object_name \u003d key"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_52fe556d","line":112,"in_reply_to":"3f79a3b5_8fb36a36","updated":"2018-12-06 23:21:54.000000000","message":"copy\u0027d the environ, too... still not entirely happy with it... but I don\u0027t know that I want to dig into the *right* way to go about it. I\u0027ve got this feeling like it\u0027s gonna be a long rabbit hole.","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"47c9e4a914b0f408b4cdf4878e2ebd4ffbfd170b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                # TODO: delete the specific version of the object"},{"line_number":110,"context_line":"                raise S3NotImplemented()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            req \u003d copy.copy(req)"},{"line_number":113,"context_line":"            req.object_name \u003d key"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_8fb36a36","line":112,"in_reply_to":"3f79a3b5_b7579ef6","updated":"2018-12-06 21:38:20.000000000","message":"Yeah, I kinda really want to call make_subrequest... but then I think I\u0027d lose some of the s3 auth goodness...\n\nThe two environs actually being the same seems like a legit bug though -- that\u0027s gotta lead to a race condition where we might issue subrequests for the same object when we were supposed to do different ones :-/","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"36539ffb0b7aff846c105c9e656f3038a60f5281","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            except NoSuchKey:"},{"line_number":119,"context_line":"                pass"},{"line_number":120,"context_line":"            except ErrorResponse as e:"},{"line_number":121,"context_line":"                return {"},{"line_number":122,"context_line":"                    \u0027key\u0027: key,"},{"line_number":123,"context_line":"                    \u0027error\u0027: {"},{"line_number":124,"context_line":"                        \u0027code\u0027: e.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_14b59b7d","line":121,"updated":"2018-11-15 22:49:11.000000000","message":"May be better as something like\n\n except ...:\n     return key, {\u0027code\u0027: ..., \u0027message\u0027: ...}\n return key, None\n\nand pull out key, error tuples in the loop.","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ee730be35fdde37928d17879feff7e024743740","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            except NoSuchKey:"},{"line_number":119,"context_line":"                pass"},{"line_number":120,"context_line":"            except ErrorResponse as e:"},{"line_number":121,"context_line":"                return {"},{"line_number":122,"context_line":"                    \u0027key\u0027: key,"},{"line_number":123,"context_line":"                    \u0027error\u0027: {"},{"line_number":124,"context_line":"                        \u0027code\u0027: e.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_72035176","line":121,"in_reply_to":"3f79a3b5_14b59b7d","updated":"2018-12-06 23:21:54.000000000","message":"Done","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27d629436041ec868b850a8172448fcdde159ef5","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    SubElement(error, \u0027Key\u0027).text \u003d result[\u0027key\u0027]"},{"line_number":138,"context_line":"                    SubElement(error, \u0027Code\u0027).text \u003d result[\u0027error\u0027][\u0027code\u0027]"},{"line_number":139,"context_line":"                    SubElement(error, \u0027Message\u0027).text \u003d \\"},{"line_number":140,"context_line":"                        result[\u0027error\u0027][\u0027message\u0027]"},{"line_number":141,"context_line":"                elif not self.quiet:"},{"line_number":142,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":143,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d result[\u0027key\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_37994ecd","line":140,"updated":"2018-12-06 21:15:42.000000000","message":"this block is un-tested too","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ee730be35fdde37928d17879feff7e024743740","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    SubElement(error, \u0027Key\u0027).text \u003d result[\u0027key\u0027]"},{"line_number":138,"context_line":"                    SubElement(error, \u0027Code\u0027).text \u003d result[\u0027error\u0027][\u0027code\u0027]"},{"line_number":139,"context_line":"                    SubElement(error, \u0027Message\u0027).text \u003d \\"},{"line_number":140,"context_line":"                        result[\u0027error\u0027][\u0027message\u0027]"},{"line_number":141,"context_line":"                elif not self.quiet:"},{"line_number":142,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":143,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d result[\u0027key\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_725fd173","line":140,"in_reply_to":"3f79a3b5_37994ecd","updated":"2018-12-06 23:21:54.000000000","message":"Done","commit_id":"7f1a3198d9f0acce28e0abfad073150d032881ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0a60f25c351a2c7eafe28706bd941ce3d285fbb6","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        def do_delete(base_req, key, version):"},{"line_number":112,"context_line":"            req \u003d copy.copy(base_req)"},{"line_number":113,"context_line":"            req.environ \u003d copy.copy(base_req.environ)"},{"line_number":114,"context_line":"            req.object_name \u003d key"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_65606d0d","line":113,"updated":"2018-12-07 01:00:54.000000000","message":"I think this is probably... fine","commit_id":"00be3f595edd7aad57a6e0968b4cdf78eb4cda23"}]}
