)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Now, DLOs will behave like every other type of object under"},{"line_number":19,"context_line":"versioned_writes."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I488e13eead2f33dd272d03f6f898adc52fc7fdad"},{"line_number":22,"context_line":"Related-Change: Ie899290b3312e201979eafefb253d1a60b65b837"},{"line_number":23,"context_line":"Related-Change: Ib5b29a19e1d577026deb50fc9d26064a8da81cd7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a1ced50_f052addc","line":20,"updated":"2017-03-17 14:58:15.000000000","message":"I think this closes https://bugs.launchpad.net/swift/+bug/1626989","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Change-Id: I488e13eead2f33dd272d03f6f898adc52fc7fdad"},{"line_number":22,"context_line":"Related-Change: Ie899290b3312e201979eafefb253d1a60b65b837"},{"line_number":23,"context_line":"Related-Change: Ib5b29a19e1d577026deb50fc9d26064a8da81cd7"},{"line_number":24,"context_line":"Closes-Bug: #1626989"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a1ced50_a0283134","line":24,"updated":"2017-03-23 00:12:39.000000000","message":"You mean this one? :P","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"}],"swift/common/middleware/versioned_writes.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        \"\"\""},{"line_number":473,"context_line":"        if \u0027X-Object-Manifest\u0027 in req.headers:"},{"line_number":474,"context_line":"            # do not version DLO manifest, proceed with original request"},{"line_number":475,"context_line":"            return self.app"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        self._copy_current(req, versions_cont, api_version, account_name,"},{"line_number":478,"context_line":"                           object_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_1b8e8f78","side":"PARENT","line":475,"updated":"2017-03-17 14:58:15.000000000","message":"this seems particularly inappropriate - if the current object is a DLO then it would not be copied to versions location in _copy_current, but this check additionally prevents a normal object getting to the version container if the new object is a manifest :/","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        \"\"\""},{"line_number":473,"context_line":"        if \u0027X-Object-Manifest\u0027 in req.headers:"},{"line_number":474,"context_line":"            # do not version DLO manifest, proceed with original request"},{"line_number":475,"context_line":"            return self.app"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        self._copy_current(req, versions_cont, api_version, account_name,"},{"line_number":478,"context_line":"                           object_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_0076653d","side":"PARENT","line":475,"in_reply_to":"1a1ced50_1b8e8f78","updated":"2017-03-23 00:12:39.000000000","message":"Yup :-(","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"}],"test/functional/test_versioned_writes.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        man_file \u003d container.file(obj_name)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        # write a normal file first"},{"line_number":358,"context_line":"        man_file.write(\u0027old content\u0027)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        # guarantee that the timestamp changes"},{"line_number":361,"context_line":"        time.sleep(.01)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_b613d25b","line":358,"updated":"2017-03-17 14:58:15.000000000","message":"nice","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                       (self.env.container.name, obj_name)})"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        self.assertEqual(4, versions_container.info()[\u0027object_count\u0027])"},{"line_number":368,"context_line":"        self.assertEqual(\"112233\", man_file.read())"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":371,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_9b499f8e","line":368,"updated":"2017-03-17 14:58:15.000000000","message":"bah! am I the only one to spend a few mins wondering how we got from 123 to 112233 and not 246?\n\n versioned_obj.write(i + i)\n\ni is an int right? oh no, its a string\n\n#slapself","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        self.assertEqual(4, versions_container.info()[\u0027object_count\u0027])"},{"line_number":368,"context_line":"        self.assertEqual(\"112233\", man_file.read())"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":371,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"},{"line_number":372,"context_line":"            \u0027reverse\u0027: \u0027yes\u0027})[0])"},{"line_number":373,"context_line":"        self.assertEqual(\u0027old content\u0027, archive_file.read())"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        # overwrite the manifest with a normal file"},{"line_number":376,"context_line":"        man_file.write(\u0027new content\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_76b4faf1","line":373,"range":{"start_line":370,"start_character":0,"end_line":373,"end_character":60},"updated":"2017-03-17 14:58:15.000000000","message":"nit: could this be made into a helper method\n\n  self._assert_most_recent_version(obj_name, content)\n\nversions_container is a property of self.env","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        self.assertEqual(4, versions_container.info()[\u0027object_count\u0027])"},{"line_number":368,"context_line":"        self.assertEqual(\"112233\", man_file.read())"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":371,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"},{"line_number":372,"context_line":"            \u0027reverse\u0027: \u0027yes\u0027})[0])"},{"line_number":373,"context_line":"        self.assertEqual(\u0027old content\u0027, archive_file.read())"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        # overwrite the manifest with a normal file"},{"line_number":376,"context_line":"        man_file.write(\u0027new content\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_fb765804","line":373,"range":{"start_line":370,"start_character":0,"end_line":373,"end_character":60},"in_reply_to":"1a1ced50_76b4faf1","updated":"2017-03-23 00:12:39.000000000","message":"Done","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":381,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"},{"line_number":382,"context_line":"            \u0027reverse\u0027: \u0027yes\u0027})[0])"},{"line_number":383,"context_line":"        self.assertEqual(\u0027112233\u0027, archive_file.read())"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        return obj_name, man_file, versions_container"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_56045e14","line":383,"updated":"2017-03-17 14:58:15.000000000","message":"worth checking it is a manifest? (see TestSloWithVersioning for comparison)","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":381,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"},{"line_number":382,"context_line":"            \u0027reverse\u0027: \u0027yes\u0027})[0])"},{"line_number":383,"context_line":"        self.assertEqual(\u0027112233\u0027, archive_file.read())"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        return obj_name, man_file, versions_container"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_1b725411","line":383,"in_reply_to":"1a1ced50_56045e14","updated":"2017-03-23 00:12:39.000000000","message":"Done","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        # verify that restore works properly"},{"line_number":392,"context_line":"        man_file.delete()"},{"line_number":393,"context_line":"        self.assertEqual(4, versions_container.info()[\u0027object_count\u0027])"},{"line_number":394,"context_line":"        self.assertEqual(\"112233\", man_file.read())"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":397,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_3674429b","line":394,"updated":"2017-03-17 14:58:15.000000000","message":"again, for completeness check it is a manifest?\n\nalso, man_file was a normal file. Now that it is a manifest it would be good to delete again to verify that deleting a manifest will restore the next version. In other words, unwind all the way to starting state.","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        # verify that restore works properly"},{"line_number":392,"context_line":"        man_file.delete()"},{"line_number":393,"context_line":"        self.assertEqual(4, versions_container.info()[\u0027object_count\u0027])"},{"line_number":394,"context_line":"        self.assertEqual(\"112233\", man_file.read())"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        archive_file \u003d versions_container.file(versions_container.files(parms\u003d{"},{"line_number":397,"context_line":"            \u0027prefix\u0027: \u0027%03x%s/\u0027 % (len(obj_name), obj_name),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_7be7c8ab","line":394,"in_reply_to":"1a1ced50_3674429b","updated":"2017-03-23 00:12:39.000000000","message":"Done","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":684,"context_line":"        obj_name, man_file, versions_container \u003d \\"},{"line_number":685,"context_line":"            self._test_versioning_dlo_setup()"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        man_file.delete()"},{"line_number":688,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":689,"context_line":"            man_file.read()"},{"line_number":690,"context_line":"        self.assertEqual(404, cm.exception.status)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_56945e36","line":687,"updated":"2017-03-17 14:58:15.000000000","message":"man_file is a normal object, should we also check deleting a manifest in history mode (just for completeness)","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":689,"context_line":"            man_file.read()"},{"line_number":690,"context_line":"        self.assertEqual(404, cm.exception.status)"},{"line_number":691,"context_line":"        self.assertEqual(7, versions_container.info()[\u0027object_count\u0027])"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        expected \u003d [\u0027\u0027, \u0027new content\u0027, \u0027112233\u0027, \u0027old content\u0027]"},{"line_number":694,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_d6a04e93","line":691,"updated":"2017-03-17 14:58:15.000000000","message":"ok. we had 5 objects, now we added \u0027new content\u0027 and a delete marker","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5489e288616ae4c6623c9073d33ec204bc45fc27","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        if should_be_dlo:"},{"line_number":377,"context_line":"            self.assertIn(\u0027x-object-manifest\u0027, resp_headers)"},{"line_number":378,"context_line":"        else:"},{"line_number":379,"context_line":"            self.assertNotIn(\u0027x-object-manifest\u0027, resp_headers)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def _test_versioning_dlo_setup(self):"},{"line_number":382,"context_line":"        container \u003d self.env.container"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_a725250b","line":379,"updated":"2017-03-29 10:03:31.000000000","message":"nice","commit_id":"3ad877323978dcf4130e9543a2678bb928c1ecb8"}],"test/unit/common/middleware/test_versioned_writes.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        self.assertEqual(len(self.authorized), 2)"},{"line_number":417,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":418,"context_line":"        self.assertRequestEqual(req, self.authorized[1])"},{"line_number":419,"context_line":"        self.assertEqual(3, self.app.call_count)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def test_put_version_is_dlo_manifest_with_container_config_true(self):"},{"line_number":422,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_d674ced0","line":419,"updated":"2017-03-17 14:58:15.000000000","message":"is there anything here (also in other tests) that actually verifies the FakeApp received the GET and PUT for the version copy, rather than (somewhat unexpectedly) getting maybe 3 identical PUTs for the original request?\n\nwe have a little more checking at line 487:\n\n  self.assertEqual([\u0027VW\u0027, \u0027VW\u0027, None], self.app.swift_sources)\n  self.assertEqual({\u0027fake_trans_id\u0027}, set(self.app.txn_ids))","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        self.assertEqual(len(self.authorized), 2)"},{"line_number":417,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":418,"context_line":"        self.assertRequestEqual(req, self.authorized[1])"},{"line_number":419,"context_line":"        self.assertEqual(3, self.app.call_count)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def test_put_version_is_dlo_manifest_with_container_config_true(self):"},{"line_number":422,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_bb614007","line":419,"in_reply_to":"1a1ced50_d674ced0","updated":"2017-03-23 00:12:39.000000000","message":"Done","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        self.assertEqual(len(self.authorized), 2)"},{"line_number":442,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":443,"context_line":"        self.assertRequestEqual(req, self.authorized[1])"},{"line_number":444,"context_line":"        self.assertEqual(3, self.app.call_count)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def test_delete_object_no_versioning_with_container_config_true(self):"},{"line_number":447,"context_line":"        # set False to versions_write obviously and expect no GET versioning"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_81a5b205","line":444,"updated":"2017-03-17 14:58:15.000000000","message":"would be good to check the version PUT retained the x-object-manifest header : i.e. inspect self.app.uploaded which should have a stash of the PUT headers","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        self.assertEqual(len(self.authorized), 2)"},{"line_number":442,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":443,"context_line":"        self.assertRequestEqual(req, self.authorized[1])"},{"line_number":444,"context_line":"        self.assertEqual(3, self.app.call_count)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def test_delete_object_no_versioning_with_container_config_true(self):"},{"line_number":447,"context_line":"        # set False to versions_write obviously and expect no GET versioning"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_db5c3c4d","line":444,"in_reply_to":"1a1ced50_81a5b205","updated":"2017-03-23 00:12:39.000000000","message":"Done","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":9115,"context_line":"        self.assertEqual(headers[:len(exp)], exp)"},{"line_number":9116,"context_line":"        body \u003d fd.read()"},{"line_number":9117,"context_line":"        versions \u003d [x for x in body.split(\u0027\\n\u0027) if x]"},{"line_number":9118,"context_line":"        self.assertEqual(1, len(versions))"},{"line_number":9119,"context_line":""},{"line_number":9120,"context_line":"        # DELETE v1/a/c/obj shouldn\u0027t delete v1/a/c/obj/sub versions"},{"line_number":9121,"context_line":"        sock \u003d connect_tcp((\u0027localhost\u0027, prolis.getsockname()[1]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_01f3829f","line":9118,"updated":"2017-03-17 14:58:15.000000000","message":"is this equal to 1 because versions_to_create is 3? should we write \"versions_to_create - 2\". Hmmm, that does seem wrong i.e. versions_to_create neither equals number of object versions PUT to the versioned container, not the number of object versions saved in the versions container.","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":9115,"context_line":"        self.assertEqual(headers[:len(exp)], exp)"},{"line_number":9116,"context_line":"        body \u003d fd.read()"},{"line_number":9117,"context_line":"        versions \u003d [x for x in body.split(\u0027\\n\u0027) if x]"},{"line_number":9118,"context_line":"        self.assertEqual(1, len(versions))"},{"line_number":9119,"context_line":""},{"line_number":9120,"context_line":"        # DELETE v1/a/c/obj shouldn\u0027t delete v1/a/c/obj/sub versions"},{"line_number":9121,"context_line":"        sock \u003d connect_tcp((\u0027localhost\u0027, prolis.getsockname()[1]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_dfb8a713","line":9118,"in_reply_to":"1a1ced50_01f3829f","updated":"2017-03-23 00:12:39.000000000","message":"Between starting from an empty primary container and having the range() start at 1, yeah, we\u0027ve only get the two versions (one in the primary, one in the archive). I\u0027ll change the range so we have versions_to_create PUTs to the primary container.","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"28720e84559ad65c585ccb100dd9051e06a3da2a","unresolved":false,"context_lines":[{"line_number":9217,"context_line":"        fd.flush()"},{"line_number":9218,"context_line":"        headers \u003d readuntil2crlfs(fd)"},{"line_number":9219,"context_line":"        exp \u003d \u0027HTTP/1.1 2\u0027  # 2xx response"},{"line_number":9220,"context_line":"        self.assertEqual(headers[:len(exp)], exp)"},{"line_number":9221,"context_line":""},{"line_number":9222,"context_line":"    def test_version_manifest_utf8(self):"},{"line_number":9223,"context_line":"        oc \u003d \u00270_oc_non_ascii\\xc2\\xa3\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_c1208a4c","line":9220,"updated":"2017-03-17 14:58:15.000000000","message":"wow! this test is nearly 400 lines","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"44fbc1e9abe6b1b22ac16c8bd75aa233d6f7af34","unresolved":false,"context_lines":[{"line_number":9217,"context_line":"        fd.flush()"},{"line_number":9218,"context_line":"        headers \u003d readuntil2crlfs(fd)"},{"line_number":9219,"context_line":"        exp \u003d \u0027HTTP/1.1 2\u0027  # 2xx response"},{"line_number":9220,"context_line":"        self.assertEqual(headers[:len(exp)], exp)"},{"line_number":9221,"context_line":""},{"line_number":9222,"context_line":"    def test_version_manifest_utf8(self):"},{"line_number":9223,"context_line":"        oc \u003d \u00270_oc_non_ascii\\xc2\\xa3\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_df2ee78a","line":9220,"in_reply_to":"1a1ced50_c1208a4c","updated":"2017-03-23 00:12:39.000000000","message":"Yeah, and so many of these tests feel more like in-process func tests :-/","commit_id":"d4f6d23a8e48ac7824bad8b6c8938a1bff10326c"}]}
