)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b52b628cee00db84f5c898ea221e16e86e3cecac","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"                    hex_checksum \u003d \\"},{"line_number":2093,"context_line":"                        \u0027\u0027.join(\"%02x\" % ord(c) for c in bin_checksum)"},{"line_number":2094,"context_line":"                else:"},{"line_number":2095,"context_line":"                    hex_checksum \u003d \u0027\u0027.join(\"%02x\" % c for c in bin_checksum)"},{"line_number":2096,"context_line":"            else:"},{"line_number":2097,"context_line":"                hex_checksum \u003d MD5_OF_EMPTY_STRING"},{"line_number":2098,"context_line":"            self._md5_of_sent_bytes \u003d hex_checksum"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_f7780a2c","line":2095,"updated":"2019-01-09 21:24:02.000000000","message":"I wonder if we should just use https://docs.python.org/3/library/binascii.html#binascii.hexlify or something...","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"3151e834bc706b5b81141ac6f70d61f80fa83106","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"                    hex_checksum \u003d \\"},{"line_number":2093,"context_line":"                        \u0027\u0027.join(\"%02x\" % ord(c) for c in bin_checksum)"},{"line_number":2094,"context_line":"                else:"},{"line_number":2095,"context_line":"                    hex_checksum \u003d \u0027\u0027.join(\"%02x\" % c for c in bin_checksum)"},{"line_number":2096,"context_line":"            else:"},{"line_number":2097,"context_line":"                hex_checksum \u003d MD5_OF_EMPTY_STRING"},{"line_number":2098,"context_line":"            self._md5_of_sent_bytes \u003d hex_checksum"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_ebd7bf4e","line":2095,"in_reply_to":"dfd5e7cf_f7780a2c","updated":"2019-01-10 06:02:34.000000000","message":"Done","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":2170,"context_line":"                \"Bytes read: %s, does not match metadata: %s\" % ("},{"line_number":2171,"context_line":"                    self._bytes_read, self._obj_size))"},{"line_number":2172,"context_line":"        elif self._md5_of_sent_bytes and \\"},{"line_number":2173,"context_line":"                self._etag !\u003d self._md5_of_sent_bytes:"},{"line_number":2174,"context_line":"            self._quarantine("},{"line_number":2175,"context_line":"                \"ETag %s and file\u0027s md5 %s do not match\" % ("},{"line_number":2176,"context_line":"                    self._etag, self._md5_of_sent_bytes))"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_744507b3","line":2173,"range":{"start_line":2173,"start_character":16,"end_line":2173,"end_character":53},"updated":"2019-01-14 22:34:21.000000000","message":"This is the only comparison made against _md5_of_sent_bytes, yeah? So the fact that it\u0027s now unicode on py2 should be fine.","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"}],"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b52b628cee00db84f5c898ea221e16e86e3cecac","unresolved":false,"context_lines":[{"line_number":110,"context_line":"else:"},{"line_number":111,"context_line":"    # Eventlet of 0.23.0 does encode(\u0027ascii\u0027) and strips our __len__."},{"line_number":112,"context_line":"    # Avoid it by inheriting from bytes."},{"line_number":113,"context_line":"    class EventletPlungerString(bytes):"},{"line_number":114,"context_line":"        def __len__(self):"},{"line_number":115,"context_line":"            return wsgi.MINIMUM_CHUNK_SIZE + 1"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_17990e6d","line":113,"range":{"start_line":113,"start_character":32,"end_line":113,"end_character":37},"updated":"2019-01-09 21:24:02.000000000","message":"Why can\u0027t we just do this for py2 as well?","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":110,"context_line":"else:"},{"line_number":111,"context_line":"    # Eventlet of 0.23.0 does encode(\u0027ascii\u0027) and strips our __len__."},{"line_number":112,"context_line":"    # Avoid it by inheriting from bytes."},{"line_number":113,"context_line":"    class EventletPlungerString(bytes):"},{"line_number":114,"context_line":"        def __len__(self):"},{"line_number":115,"context_line":"            return wsgi.MINIMUM_CHUNK_SIZE + 1"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bfdaf3ff_54c5633b","line":113,"range":{"start_line":113,"start_character":32,"end_line":113,"end_character":37},"in_reply_to":"dfd5e7cf_0b57a304","updated":"2019-01-14 22:34:21.000000000","message":"On py2, `str is bytes` is True -- I can\u0027t think of a way this would reasonably bite us...","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"3151e834bc706b5b81141ac6f70d61f80fa83106","unresolved":false,"context_lines":[{"line_number":110,"context_line":"else:"},{"line_number":111,"context_line":"    # Eventlet of 0.23.0 does encode(\u0027ascii\u0027) and strips our __len__."},{"line_number":112,"context_line":"    # Avoid it by inheriting from bytes."},{"line_number":113,"context_line":"    class EventletPlungerString(bytes):"},{"line_number":114,"context_line":"        def __len__(self):"},{"line_number":115,"context_line":"            return wsgi.MINIMUM_CHUNK_SIZE + 1"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_0b57a304","line":113,"range":{"start_line":113,"start_character":32,"end_line":113,"end_character":37},"in_reply_to":"dfd5e7cf_17990e6d","updated":"2019-01-10 06:02:34.000000000","message":"We might. But I was afraid to damage py2.","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b52b628cee00db84f5c898ea221e16e86e3cecac","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        if contpartition:"},{"line_number":387,"context_line":"            # In py3, zip() continues to work for our purposes... But when"},{"line_number":388,"context_line":"            # we want to log an error, consumed items are not longer present"},{"line_number":389,"context_line":"            # in the zip, maing the logs useless for operators."},{"line_number":390,"context_line":"            updates \u003d list(zip(conthosts, contdevices))"},{"line_number":391,"context_line":"        else:"},{"line_number":392,"context_line":"            updates \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_97ac1e8d","line":389,"range":{"start_line":389,"start_character":26,"end_line":389,"end_character":31},"updated":"2019-01-09 21:24:02.000000000","message":"nit: making","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"3151e834bc706b5b81141ac6f70d61f80fa83106","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        if contpartition:"},{"line_number":387,"context_line":"            # In py3, zip() continues to work for our purposes... But when"},{"line_number":388,"context_line":"            # we want to log an error, consumed items are not longer present"},{"line_number":389,"context_line":"            # in the zip, maing the logs useless for operators."},{"line_number":390,"context_line":"            updates \u003d list(zip(conthosts, contdevices))"},{"line_number":391,"context_line":"        else:"},{"line_number":392,"context_line":"            updates \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_514d5e70","line":389,"range":{"start_line":389,"start_character":26,"end_line":389,"end_character":31},"in_reply_to":"dfd5e7cf_97ac1e8d","updated":"2019-01-10 06:02:34.000000000","message":"Done","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":924,"context_line":"        def getheaders(self):"},{"line_number":925,"context_line":"            etag \u003d self.etag"},{"line_number":926,"context_line":"            if not etag:"},{"line_number":927,"context_line":"                if isinstance(self.body, six.binary_type):"},{"line_number":928,"context_line":"                    etag \u003d \u0027\"\u0027 + md5(self.body).hexdigest() + \u0027\"\u0027"},{"line_number":929,"context_line":"                else:"},{"line_number":930,"context_line":"                    etag \u003d \u0027\"68b329da9893e34099c7d8ad5cb9c940\"\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_b4004f36","line":927,"range":{"start_line":927,"start_character":41,"end_line":927,"end_character":56},"updated":"2019-01-14 22:34:21.000000000","message":"nit: Could just do bytes; it\u0027d be valid for both 2.7 and 3.x.","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b52b628cee00db84f5c898ea221e16e86e3cecac","unresolved":false,"context_lines":[{"line_number":1827,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027})"},{"line_number":1828,"context_line":""},{"line_number":1829,"context_line":"        footers \u003d {\"Etag\": md5(\"green\").hexdigest()}"},{"line_number":1830,"context_line":"        footer_meta \u003d json.dumps(footers).encode(\u0027acsii\u0027)"},{"line_number":1831,"context_line":"        footer_meta_cksum \u003d md5(footer_meta).hexdigest().encode(\u0027ascii\u0027)"},{"line_number":1832,"context_line":""},{"line_number":1833,"context_line":"        req.body \u003d b\"\\r\\n\".join(("}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_f7c6ca49","line":1830,"range":{"start_line":1830,"start_character":50,"end_line":1830,"end_character":55},"updated":"2019-01-09 21:24:02.000000000","message":"bah","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":1827,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027})"},{"line_number":1828,"context_line":""},{"line_number":1829,"context_line":"        footers \u003d {\"Etag\": md5(\"green\").hexdigest()}"},{"line_number":1830,"context_line":"        footer_meta \u003d json.dumps(footers).encode(\u0027acsii\u0027)"},{"line_number":1831,"context_line":"        footer_meta_cksum \u003d md5(footer_meta).hexdigest().encode(\u0027ascii\u0027)"},{"line_number":1832,"context_line":""},{"line_number":1833,"context_line":"        req.body \u003d b\"\\r\\n\".join(("}],"source_content_type":"text/x-python","patch_set":1,"id":"bfdaf3ff_34c3ffef","line":1830,"range":{"start_line":1830,"start_character":50,"end_line":1830,"end_character":55},"in_reply_to":"dfd5e7cf_315a1a2a","updated":"2019-01-14 22:34:21.000000000","message":"That was more about the typo than the encode. Nothing to see here...","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"3151e834bc706b5b81141ac6f70d61f80fa83106","unresolved":false,"context_lines":[{"line_number":1827,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027})"},{"line_number":1828,"context_line":""},{"line_number":1829,"context_line":"        footers \u003d {\"Etag\": md5(\"green\").hexdigest()}"},{"line_number":1830,"context_line":"        footer_meta \u003d json.dumps(footers).encode(\u0027acsii\u0027)"},{"line_number":1831,"context_line":"        footer_meta_cksum \u003d md5(footer_meta).hexdigest().encode(\u0027ascii\u0027)"},{"line_number":1832,"context_line":""},{"line_number":1833,"context_line":"        req.body \u003d b\"\\r\\n\".join(("}],"source_content_type":"text/x-python","patch_set":1,"id":"dfd5e7cf_315a1a2a","line":1830,"range":{"start_line":1830,"start_character":50,"end_line":1830,"end_character":55},"in_reply_to":"dfd5e7cf_f7c6ca49","updated":"2019-01-10 06:02:34.000000000","message":"It goes right into md5(), so that\u0027s why. It\u0027s not like I like scattering these encode(\u0027ascii\u0027) all over.","commit_id":"3e232882e9e57d4b1f8bedb520cf283226764ae8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def test_REQUEST_SPECIAL_CHARS(self):"},{"line_number":202,"context_line":"        obj \u003d \u0027special昆%20/%\u0027"},{"line_number":203,"context_line":"        if six.PY3:"},{"line_number":204,"context_line":"            # The path argument of Request.blank() is a WSGI string, somehow"},{"line_number":205,"context_line":"            obj \u003d obj.encode(\u0027utf-8\u0027).decode(\u0027latin-1\u0027)"},{"line_number":206,"context_line":"        self.check_all_api_methods(obj)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_5407a31d","line":204,"updated":"2019-01-14 22:34:21.000000000","message":"I swear, at some point this will stop feeling surprising ;-)","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":5571,"context_line":"        self.assertEqual(called_async_update_args, [expected])"},{"line_number":5572,"context_line":""},{"line_number":5573,"context_line":"    def test_container_update_as_greenthread_with_timeout(self):"},{"line_number":5574,"context_line":"        # give it one container to update (for only one greenthred)"},{"line_number":5575,"context_line":"        # fake the greenthred so it will raise a timeout"},{"line_number":5576,"context_line":"        # test that the right message is logged and the method returns None"},{"line_number":5577,"context_line":"        called_async_update_args \u003d []"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_cf21c0a1","line":5574,"updated":"2019-01-14 22:34:21.000000000","message":"+10 much better, thank you!","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":6863,"context_line":"                })"},{"line_number":6864,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":6865,"context_line":"            self.assertEqual(resp.status_int, 200)"},{"line_number":6866,"context_line":"            suffix \u003d list(pickle.loads(resp.body).keys())[0]"},{"line_number":6867,"context_line":"            self.assertEqual(suffix, os.path.basename("},{"line_number":6868,"context_line":"                os.path.dirname(objfile._datadir)))"},{"line_number":6869,"context_line":"            # tombstone still exists"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_ef5b642b","line":6866,"range":{"start_line":6866,"start_character":57,"end_line":6866,"end_character":60},"updated":"2019-01-14 22:34:21.000000000","message":"Off-topic: I wonder if we should verify that there\u0027s just the one item...","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":7620,"context_line":"            conn.sock.fd._sock.close()"},{"line_number":7621,"context_line":"        else:"},{"line_number":7622,"context_line":"            conn.sock.fd.close()"},{"line_number":7623,"context_line":"        for i in range(2):"},{"line_number":7624,"context_line":"            sleep(0)"},{"line_number":7625,"context_line":"        self.assertFalse(self.logger.get_lines_for_level(\u0027error\u0027))"},{"line_number":7626,"context_line":"        for line in self.logger.get_lines_for_level(\u0027info\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_a892334a","line":7623,"updated":"2019-01-14 22:34:21.000000000","message":"I suppose we already require multiple sleeps in some places...","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"95f176a81e2a7392b84750d6f75d4e3b7c65b477","unresolved":false,"context_lines":[{"line_number":7722,"context_line":""},{"line_number":7723,"context_line":"        # give the object server a little time to trampoline enough to"},{"line_number":7724,"context_line":"        # recognize request has finished, or socket has closed or whatever"},{"line_number":7725,"context_line":"        sleep(0.1)"},{"line_number":7726,"context_line":""},{"line_number":7727,"context_line":"    def test_multiphase_put_client_disconnect_right_before_commit(self):"},{"line_number":7728,"context_line":"        with self._check_multiphase_put_commit_handling() as context:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_a88d5332","line":7725,"updated":"2019-01-14 22:34:21.000000000","message":"Wait, we already have a (non-zero!) sleep? What\u0027s it getting stuck on that we need *another* sleep(0)? I wonder if we can avoid it by calling\n\n conn.sock.fd._real_close()\n\nlike we do in bufferedhttp...","commit_id":"5b5ed29ab4566b20f6b6eecd6b9143bacd91ea9d"}]}
