)]}'
{"test/functional/swift_test_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                               [\u0027object_count\u0027, \u0027x-container-object-count\u0027],"},{"line_number":629,"context_line":"                               [\u0027last_modified\u0027, \u0027last-modified\u0027]]"},{"line_number":630,"context_line":"            optional_fields \u003d ["},{"line_number":631,"context_line":"                # N.B. swift doesn\u0027t return both x-versions-loation"},{"line_number":632,"context_line":"                # and x-history-location at a response so that this is safe"},{"line_number":633,"context_line":"                # using same variable \"versions\" for both and it means"},{"line_number":634,"context_line":"                # versioning is enabled."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_71ae8586","line":631,"updated":"2016-09-23 17:21:55.000000000","message":"nit: s/loation/location","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                               [\u0027object_count\u0027, \u0027x-container-object-count\u0027],"},{"line_number":629,"context_line":"                               [\u0027last_modified\u0027, \u0027last-modified\u0027]]"},{"line_number":630,"context_line":"            optional_fields \u003d ["},{"line_number":631,"context_line":"                # N.B. swift doesn\u0027t return both x-versions-loation"},{"line_number":632,"context_line":"                # and x-history-location at a response so that this is safe"},{"line_number":633,"context_line":"                # using same variable \"versions\" for both and it means"},{"line_number":634,"context_line":"                # versioning is enabled."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_65c13154","line":631,"in_reply_to":"5a8bc5a2_71ae8586","updated":"2016-09-26 02:44:53.000000000","message":"Done","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"}],"test/functional/tests.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":3740,"context_line":"    @classmethod"},{"line_number":3741,"context_line":"    def setUp(cls):"},{"line_number":3742,"context_line":"        super(TestObjectVersioningHistoryModeEnv, cls).setUp()"},{"line_number":3743,"context_line":"        if \u0027versioned_writes\u0027 not in cluster_info or \u0027history\u0027 not in \\"},{"line_number":3744,"context_line":"                cluster_info[\u0027versioned_writes\u0027][\u0027allowed_versions_mode\u0027]:"},{"line_number":3745,"context_line":"            cls.versioning_enabled \u003d False"},{"line_number":3746,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_46c0c250","line":3743,"updated":"2016-09-01 18:14:51.000000000","message":"Maybe better as\n\n if \u0027history\u0027 not in cluster_info.get(\u0027versioned_writes\u0027, {}).get(\u0027allowed_versions_mode\u0027, []):\n\n? At the very least, we may want the .get(\u0027allowed_versions_mode\u0027, []) part to avoid a KeyError if we run current func tests against an older (or unknown) version of swift.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":3740,"context_line":"    @classmethod"},{"line_number":3741,"context_line":"    def setUp(cls):"},{"line_number":3742,"context_line":"        super(TestObjectVersioningHistoryModeEnv, cls).setUp()"},{"line_number":3743,"context_line":"        if \u0027versioned_writes\u0027 not in cluster_info or \u0027history\u0027 not in \\"},{"line_number":3744,"context_line":"                cluster_info[\u0027versioned_writes\u0027][\u0027allowed_versions_mode\u0027]:"},{"line_number":3745,"context_line":"            cls.versioning_enabled \u003d False"},{"line_number":3746,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_f3200ffa","line":3743,"in_reply_to":"fa7ab95a_46c0c250","updated":"2016-09-05 11:33:30.000000000","message":"Done","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"            cls.versioning_enabled \u003d False"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":""},{"line_number":3748,"context_line":"class TestObjectVersioningStackModeEnv(TestObjectVersioningEnv):"},{"line_number":3749,"context_line":"    mode_header \u003d {\u0027X-Versions-Mode\u0027: \u0027stack\u0027}"},{"line_number":3750,"context_line":""},{"line_number":3751,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_468e022f","line":3748,"updated":"2016-09-01 18:14:51.000000000","message":"Should this inherit from TestObjectVersioningHistoryModeEnv (or vice-versa) so we don\u0027t need to define essentially the same setUp twice?","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"            cls.versioning_enabled \u003d False"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":""},{"line_number":3748,"context_line":"class TestObjectVersioningStackModeEnv(TestObjectVersioningEnv):"},{"line_number":3749,"context_line":"    mode_header \u003d {\u0027X-Versions-Mode\u0027: \u0027stack\u0027}"},{"line_number":3750,"context_line":""},{"line_number":3751,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_0e1e2aba","line":3748,"in_reply_to":"fa7ab95a_468e022f","updated":"2016-09-05 11:33:30.000000000","message":"Hmm... not sure if we should do so, right now (not strongly opposite though).\n\nIn my feeling, we have the default env as \"TestObjectVersioningEnv\" and make 2 other children for each purpose and each has just calling setUp on super class and checks there own environment so that seems straight forward for readers.\n\nExactly, we could make it less code via inheriting from one of them, though...","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":4139,"context_line":"        prev_version.initialize()"},{"line_number":4140,"context_line":"        self.assertEqual(\"bbbbb\", prev_version.read())"},{"line_number":4141,"context_line":"        self.assertEqual(prev_version.content_type, \u0027text/jibberish02\u0027)"},{"line_number":4142,"context_line":"        self.assertIn(\u0027foo\u0027, prev_version.metadata)"},{"line_number":4143,"context_line":"        self.assertIn(\u0027fu\u0027, prev_version.metadata)"},{"line_number":4144,"context_line":""},{"line_number":4145,"context_line":"        # as we delete things, the old contents return"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_e11aa06e","line":4142,"updated":"2016-09-01 18:14:51.000000000","message":"Wait, I thought we only POSTed X-Object-Meta-Fu -- shouldn\u0027t that have blown away the earlier X-Object-Meta-Foo?","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":4139,"context_line":"        prev_version.initialize()"},{"line_number":4140,"context_line":"        self.assertEqual(\"bbbbb\", prev_version.read())"},{"line_number":4141,"context_line":"        self.assertEqual(prev_version.content_type, \u0027text/jibberish02\u0027)"},{"line_number":4142,"context_line":"        self.assertIn(\u0027foo\u0027, prev_version.metadata)"},{"line_number":4143,"context_line":"        self.assertIn(\u0027fu\u0027, prev_version.metadata)"},{"line_number":4144,"context_line":""},{"line_number":4145,"context_line":"        # as we delete things, the old contents return"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_49a02cf5","line":4142,"in_reply_to":"fa7ab95a_e11aa06e","updated":"2016-09-05 11:33:30.000000000","message":"Good call. If we call POST, the existing object metadata should be deleted anyway. Let\u0027s file it as a bug. To tell the truth, same assertion exits (and pass as success) in the original TestObjectVersioning class. :/","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":4142,"context_line":"        self.assertIn(\u0027foo\u0027, prev_version.metadata)"},{"line_number":4143,"context_line":"        self.assertIn(\u0027fu\u0027, prev_version.metadata)"},{"line_number":4144,"context_line":""},{"line_number":4145,"context_line":"        # as we delete things, the old contents return"},{"line_number":4146,"context_line":"        self.assertEqual(\"ccccc\", versioned_obj.read())"},{"line_number":4147,"context_line":""},{"line_number":4148,"context_line":"        # test copy from a different container"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_461e0271","line":4145,"updated":"2016-09-01 18:14:51.000000000","message":"This comment is inaccurate.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":4142,"context_line":"        self.assertIn(\u0027foo\u0027, prev_version.metadata)"},{"line_number":4143,"context_line":"        self.assertIn(\u0027fu\u0027, prev_version.metadata)"},{"line_number":4144,"context_line":""},{"line_number":4145,"context_line":"        # as we delete things, the old contents return"},{"line_number":4146,"context_line":"        self.assertEqual(\"ccccc\", versioned_obj.read())"},{"line_number":4147,"context_line":""},{"line_number":4148,"context_line":"        # test copy from a different container"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_6ed176cd","line":4145,"in_reply_to":"fa7ab95a_461e0271","updated":"2016-09-05 11:33:30.000000000","message":"Yes! that was just a copy/paste from stack mode. Nice catch.  Will fix.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":4165,"context_line":"        self.assertEqual(\"ccccc\", prev_version.read())"},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"        # test delete"},{"line_number":4168,"context_line":"        # at first, delete will sucess with 204"},{"line_number":4169,"context_line":"        versioned_obj.delete()"},{"line_number":4170,"context_line":"        # after that, any time the delete doesn\u0027t restore the old version"},{"line_number":4171,"context_line":"        # and we will get 404 NotFound"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_0c7c1bb4","line":4168,"range":{"start_line":4168,"start_character":32,"end_line":4168,"end_character":38},"updated":"2016-09-01 18:14:51.000000000","message":"nit: s/sucess/succeed/","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":4175,"context_line":"            self.assertEqual(404, cm.exception.status)"},{"line_number":4176,"context_line":"        # finally, we have 4 versioned items and 4 delete markers total in"},{"line_number":4177,"context_line":"        # the versions container"},{"line_number":4178,"context_line":"        self.assertEqual(8, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4179,"context_line":""},{"line_number":4180,"context_line":"        # update versioned_obj"},{"line_number":4181,"context_line":"        versioned_obj.write(\"eeee\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/thanksgiving\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_e71ab06e","line":4178,"updated":"2016-09-01 18:14:51.000000000","message":"We should probably at least check the content-types to verify the statement in the comment above.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":4175,"context_line":"            self.assertEqual(404, cm.exception.status)"},{"line_number":4176,"context_line":"        # finally, we have 4 versioned items and 4 delete markers total in"},{"line_number":4177,"context_line":"        # the versions container"},{"line_number":4178,"context_line":"        self.assertEqual(8, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4179,"context_line":""},{"line_number":4180,"context_line":"        # update versioned_obj"},{"line_number":4181,"context_line":"        versioned_obj.write(\"eeee\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/thanksgiving\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_6d47bbbb","line":4178,"in_reply_to":"fa7ab95a_e71ab06e","updated":"2016-09-05 11:33:30.000000000","message":"Done","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"812361d6c436f1c7238aef014b8ab89224314c31","unresolved":false,"context_lines":[{"line_number":4225,"context_line":"        # Verify with token from first account"},{"line_number":4226,"context_line":"        self.assertEqual(\"bbbbb\", versioned_obj.read())"},{"line_number":4227,"context_line":""},{"line_number":4228,"context_line":"        versioned_obj.delete()"},{"line_number":4229,"context_line":"        self.assertRaises(ResponseError, versioned_obj.read)"},{"line_number":4230,"context_line":""},{"line_number":4231,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_26ef3e88","line":4228,"updated":"2016-09-01 18:14:51.000000000","message":"I feel like it would be more in the spirit of the test this was based upon to instead\n\n- verify that there is exactly one object in versions_container, and\n- verify that the one object has content \u0027aaaaa\u0027.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3a106b66507a46fbdd408a45dcaa3f45235f1349","unresolved":false,"context_lines":[{"line_number":4225,"context_line":"        # Verify with token from first account"},{"line_number":4226,"context_line":"        self.assertEqual(\"bbbbb\", versioned_obj.read())"},{"line_number":4227,"context_line":""},{"line_number":4228,"context_line":"        versioned_obj.delete()"},{"line_number":4229,"context_line":"        self.assertRaises(ResponseError, versioned_obj.read)"},{"line_number":4230,"context_line":""},{"line_number":4231,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_ad9aa312","line":4228,"in_reply_to":"fa7ab95a_26ef3e88","updated":"2016-09-05 11:33:30.000000000","message":"In fact, there are 3 objects though, it could be better so that I will fix.","commit_id":"faf1cefd44a333226e0dfd25ad9fd2944537ffba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"024687faa51233a8fbdb7fcae5c16b0a15c985cb","unresolved":false,"context_lines":[{"line_number":4170,"context_line":""},{"line_number":4171,"context_line":"        # test delete"},{"line_number":4172,"context_line":"        # at first, delete will succeed with 204"},{"line_number":4173,"context_line":"        versioned_obj.delete()"},{"line_number":4174,"context_line":"        # after that, any time the delete doesn\u0027t restore the old version"},{"line_number":4175,"context_line":"        # and we will get 404 NotFound"},{"line_number":4176,"context_line":"        for x in range(3):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_b83e0d26","line":4173,"updated":"2016-09-06 23:07:20.000000000","message":"We should append to expected_content_types here. Otherwise, it will only have 7 items instead of 8.\n\nMaybe it\u0027s worth changing the assertion below to something like\n\n self.assertEqual(expected_content_types, [\n     o[\u0027content_type\u0027] for o in versions_container.files(\n         parms\u003d{\u0027format\u0027: \u0027json\u0027})])\n\nto catch this?","commit_id":"2d93cef1d7a40365afae34acfe843fae5b52a976"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":3937,"context_line":"            raise ResponseError(cls.conn.response)"},{"line_number":3938,"context_line":""},{"line_number":3939,"context_line":"        container_info \u003d cls.container.info()"},{"line_number":3940,"context_line":"        # if versioning is off, then X-Versions-Location won\u0027t persist"},{"line_number":3941,"context_line":"        cls.versioning_enabled \u003d \u0027versions\u0027 in container_info"},{"line_number":3942,"context_line":""},{"line_number":3943,"context_line":"        # setup another account to test ACLs"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_597e0faf","line":3940,"updated":"2016-09-23 17:21:55.000000000","message":"nit s/X-Versions-Location/location_header_key/ or some other way of generalising the comment for both cases\n\nsame thing in other comments through test classes","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":3937,"context_line":"            raise ResponseError(cls.conn.response)"},{"line_number":3938,"context_line":""},{"line_number":3939,"context_line":"        container_info \u003d cls.container.info()"},{"line_number":3940,"context_line":"        # if versioning is off, then X-Versions-Location won\u0027t persist"},{"line_number":3941,"context_line":"        cls.versioning_enabled \u003d \u0027versions\u0027 in container_info"},{"line_number":3942,"context_line":""},{"line_number":3943,"context_line":"        # setup another account to test ACLs"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_25c4895d","line":3940,"in_reply_to":"5a8bc5a2_597e0faf","updated":"2016-09-26 02:44:53.000000000","message":"Done\n\nI changed it as cls.location_header_key to be more explicit.","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4371,"context_line":"                                self.env.versioning_enabled,))"},{"line_number":4372,"context_line":""},{"line_number":4373,"context_line":""},{"line_number":4374,"context_line":"class TestObjectHistoryModeVersioning(TestObjectVersioning):"},{"line_number":4375,"context_line":"    env \u003d TestObjectVersioningHistoryModeEnv"},{"line_number":4376,"context_line":"    set_up \u003d False"},{"line_number":4377,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_13e9c0e6","line":4374,"updated":"2016-09-23 17:21:55.000000000","message":"nit: could we name this TestObjectVersioningHistoryMode to match the Env class (and have them sort nicely in tests and IDE).","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4371,"context_line":"                                self.env.versioning_enabled,))"},{"line_number":4372,"context_line":""},{"line_number":4373,"context_line":""},{"line_number":4374,"context_line":"class TestObjectHistoryModeVersioning(TestObjectVersioning):"},{"line_number":4375,"context_line":"    env \u003d TestObjectVersioningHistoryModeEnv"},{"line_number":4376,"context_line":"    set_up \u003d False"},{"line_number":4377,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_458a751c","line":4374,"in_reply_to":"5a8bc5a2_13e9c0e6","updated":"2016-09-26 02:44:53.000000000","message":"Done","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4376,"context_line":"    set_up \u003d False"},{"line_number":4377,"context_line":""},{"line_number":4378,"context_line":"    # those override tests includes assertions for delete versioned objects"},{"line_number":4379,"context_line":"    # behaivors different from Stack mode"},{"line_number":4380,"context_line":""},{"line_number":4381,"context_line":"    # The difference from the parent is since below delete"},{"line_number":4382,"context_line":"    def test_overwriting(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_ffdc1be6","line":4379,"updated":"2016-09-23 17:21:55.000000000","message":"nit: not sure about using \"Stack mode\" here, will it be understood?\n\ns/behaivors/behaviors/","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4376,"context_line":"    set_up \u003d False"},{"line_number":4377,"context_line":""},{"line_number":4378,"context_line":"    # those override tests includes assertions for delete versioned objects"},{"line_number":4379,"context_line":"    # behaivors different from Stack mode"},{"line_number":4380,"context_line":""},{"line_number":4381,"context_line":"    # The difference from the parent is since below delete"},{"line_number":4382,"context_line":"    def test_overwriting(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_2572c949","line":4379,"in_reply_to":"5a8bc5a2_ffdc1be6","updated":"2016-09-26 02:44:53.000000000","message":"fair enough, that\u0027s been remaining since the \u0027stack\u0027 mode obviously exists, will change.","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4483,"context_line":"            expected_content_types.append("},{"line_number":4484,"context_line":"                \u0027application/x-deleted;swift_versions_deleted\u003d1\u0027)"},{"line_number":4485,"context_line":"        # finally, we have 4 versioned items and 4 delete markers total in"},{"line_number":4486,"context_line":"        # the versions container"},{"line_number":4487,"context_line":"        self.assertEqual(8, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4488,"context_line":"        self.assertEqual(expected_content_types, ["},{"line_number":4489,"context_line":"            o[\u0027content_type\u0027] for o in versions_container.files("}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_13a540a1","line":4486,"updated":"2016-09-23 17:21:55.000000000","message":"interesting, so a delete marker is written even when nothing was deleted?","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4483,"context_line":"            expected_content_types.append("},{"line_number":4484,"context_line":"                \u0027application/x-deleted;swift_versions_deleted\u003d1\u0027)"},{"line_number":4485,"context_line":"        # finally, we have 4 versioned items and 4 delete markers total in"},{"line_number":4486,"context_line":"        # the versions container"},{"line_number":4487,"context_line":"        self.assertEqual(8, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4488,"context_line":"        self.assertEqual(expected_content_types, ["},{"line_number":4489,"context_line":"            o[\u0027content_type\u0027] for o in versions_container.files("}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_45b8b5c8","line":4486,"in_reply_to":"5a8bc5a2_13a540a1","updated":"2016-09-26 02:44:53.000000000","message":"Exactly, I also was interested in the thing while I was writing this test but it is expected, in fact.","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4492,"context_line":"        # update versioned_obj"},{"line_number":4493,"context_line":"        versioned_obj.write(\"eeee\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/thanksgiving\u0027,"},{"line_number":4494,"context_line":"                            \u0027X-Object-Meta-Bar\u0027: \u0027foo\u0027})"},{"line_number":4495,"context_line":"        # verify that all the original object headers have been copied back"},{"line_number":4496,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4497,"context_line":"        self.assertEqual(\u0027text/thanksgiving\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4498,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_b3f2cc6d","line":4495,"updated":"2016-09-23 17:21:55.000000000","message":"nothing gets copied back, correct? this is verifying that the PUT succeeded?","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4492,"context_line":"        # update versioned_obj"},{"line_number":4493,"context_line":"        versioned_obj.write(\"eeee\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/thanksgiving\u0027,"},{"line_number":4494,"context_line":"                            \u0027X-Object-Meta-Bar\u0027: \u0027foo\u0027})"},{"line_number":4495,"context_line":"        # verify that all the original object headers have been copied back"},{"line_number":4496,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4497,"context_line":"        self.assertEqual(\u0027text/thanksgiving\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4498,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_a5b339e8","line":4495,"in_reply_to":"5a8bc5a2_b3f2cc6d","updated":"2016-09-26 02:44:53.000000000","message":"Ah, yes, nice cacth! maybe mymistake when copy the test code from the original TestObjectVersioning class.\n\nDone","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"        # update versioned_obj"},{"line_number":4503,"context_line":"        versioned_obj.write(\"ffff\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/teriyaki\u0027,"},{"line_number":4504,"context_line":"                            \u0027X-Object-Meta-Food\u0027: \u0027chickin\u0027})"},{"line_number":4505,"context_line":"        # verify that all the original object headers have been copied back"},{"line_number":4506,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4507,"context_line":"        self.assertEqual(\u0027text/teriyaki\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4508,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_93bdd06a","line":4505,"updated":"2016-09-23 17:21:55.000000000","message":"ditto, nothing is copied","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"        # update versioned_obj"},{"line_number":4503,"context_line":"        versioned_obj.write(\"ffff\", hdrs\u003d{\u0027Content-Type\u0027: \u0027text/teriyaki\u0027,"},{"line_number":4504,"context_line":"                            \u0027X-Object-Meta-Food\u0027: \u0027chickin\u0027})"},{"line_number":4505,"context_line":"        # verify that all the original object headers have been copied back"},{"line_number":4506,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4507,"context_line":"        self.assertEqual(\u0027text/teriyaki\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4508,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_45dfd50c","line":4505,"in_reply_to":"5a8bc5a2_93bdd06a","updated":"2016-09-26 02:44:53.000000000","message":"Done","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4506,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4507,"context_line":"        self.assertEqual(\u0027text/teriyaki\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4508,"context_line":""},{"line_number":4509,"context_line":"        # new obj will be inserted after delete-marker there"},{"line_number":4510,"context_line":"        self.assertEqual(9, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4511,"context_line":""},{"line_number":4512,"context_line":"        versioned_obj.delete()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_d36e7800","line":4509,"updated":"2016-09-23 17:21:55.000000000","message":"ok, so this checks that a version is written after delete markers are present","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4506,"context_line":"        obj_info \u003d versioned_obj.info()"},{"line_number":4507,"context_line":"        self.assertEqual(\u0027text/teriyaki\u0027, obj_info[\u0027content_type\u0027])"},{"line_number":4508,"context_line":""},{"line_number":4509,"context_line":"        # new obj will be inserted after delete-marker there"},{"line_number":4510,"context_line":"        self.assertEqual(9, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4511,"context_line":""},{"line_number":4512,"context_line":"        versioned_obj.delete()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_85e55ddd","line":4509,"in_reply_to":"5a8bc5a2_d36e7800","updated":"2016-09-26 02:44:53.000000000","message":"Yes :-)","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4510,"context_line":"        self.assertEqual(9, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4511,"context_line":""},{"line_number":4512,"context_line":"        versioned_obj.delete()"},{"line_number":4513,"context_line":"        self.assertRaises(ResponseError, versioned_obj.read)"},{"line_number":4514,"context_line":""},{"line_number":4515,"context_line":"    # the difference from the parent is since below delete"},{"line_number":4516,"context_line":"    def test_versioning_check_acl(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_33095c32","line":4513,"updated":"2016-09-23 17:21:55.000000000","message":"probably worth checking this is a 404 as before (line 4482) and we now expect there to be 11 items in the versions container","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4510,"context_line":"        self.assertEqual(9, versions_container.info()[\u0027object_count\u0027])"},{"line_number":4511,"context_line":""},{"line_number":4512,"context_line":"        versioned_obj.delete()"},{"line_number":4513,"context_line":"        self.assertRaises(ResponseError, versioned_obj.read)"},{"line_number":4514,"context_line":""},{"line_number":4515,"context_line":"    # the difference from the parent is since below delete"},{"line_number":4516,"context_line":"    def test_versioning_check_acl(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_e5f70189","line":4513,"in_reply_to":"5a8bc5a2_33095c32","updated":"2016-09-26 02:44:53.000000000","message":"Done","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4532,"context_line":"        try:"},{"line_number":4533,"context_line":"            self.assertRaises(ResponseError, versioned_obj.delete)"},{"line_number":4534,"context_line":"        finally:"},{"line_number":4535,"context_line":"            self.env.account.conn.storage_token \u003d org_token"},{"line_number":4536,"context_line":""},{"line_number":4537,"context_line":"        # Verify with token from first account"},{"line_number":4538,"context_line":"        self.assertEqual(\"bbbbb\", versioned_obj.read())"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_e27d5b1d","line":4535,"updated":"2016-09-23 17:21:55.000000000","message":"here (and in parent class) I was wondering if it would be good to check that as well as getting an error response, that nothing was written to the versions container.","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4532,"context_line":"        try:"},{"line_number":4533,"context_line":"            self.assertRaises(ResponseError, versioned_obj.delete)"},{"line_number":4534,"context_line":"        finally:"},{"line_number":4535,"context_line":"            self.env.account.conn.storage_token \u003d org_token"},{"line_number":4536,"context_line":""},{"line_number":4537,"context_line":"        # Verify with token from first account"},{"line_number":4538,"context_line":"        self.assertEqual(\"bbbbb\", versioned_obj.read())"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_c52845e5","line":4535,"in_reply_to":"5a8bc5a2_e27d5b1d","updated":"2016-09-26 02:44:53.000000000","message":"Good point, i like that strict check but it seems common improvement and to tell the truth, I have another task (or a bug?) on the common improvment from Tim [1] so that, I prefer to address both in the follow up.\n\n1: https://review.openstack.org/#/c/360933/1/test/functional/tests.py@4142","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"920dc1e046f2530394f9c0e67f0e1e8200188241","unresolved":false,"context_lines":[{"line_number":4546,"context_line":"        files \u003d versions_container.files()"},{"line_number":4547,"context_line":"        for actual, expected in zip(files, [\u0027aaaaa\u0027, \u0027bbbbb\u0027, \u0027\u0027]):"},{"line_number":4548,"context_line":"            prev_version \u003d versions_container.file(actual)"},{"line_number":4549,"context_line":"            prev_version.initialize()"},{"line_number":4550,"context_line":"            self.assertEqual(expected, prev_version.read())"},{"line_number":4551,"context_line":""},{"line_number":4552,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_22cae36d","line":4549,"updated":"2016-09-23 17:21:55.000000000","message":"does this add much vs. the GET on next line?","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c84c663bf0cc6a6544174e12e55eec8b9350629f","unresolved":false,"context_lines":[{"line_number":4546,"context_line":"        files \u003d versions_container.files()"},{"line_number":4547,"context_line":"        for actual, expected in zip(files, [\u0027aaaaa\u0027, \u0027bbbbb\u0027, \u0027\u0027]):"},{"line_number":4548,"context_line":"            prev_version \u003d versions_container.file(actual)"},{"line_number":4549,"context_line":"            prev_version.initialize()"},{"line_number":4550,"context_line":"            self.assertEqual(expected, prev_version.read())"},{"line_number":4551,"context_line":""},{"line_number":4552,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_e5daa1e7","line":4549,"in_reply_to":"5a8bc5a2_22cae36d","updated":"2016-09-26 02:44:53.000000000","message":"ah, yeah, that\u0027s redundant. Will remove.","commit_id":"28c2ddfaf8909405e3b26925a4824205c229016a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3cd85b38526bdb9787c6f042281a4ade2617e31d","unresolved":false,"context_lines":[{"line_number":4263,"context_line":"        self.assertTrue(container.update_metadata(hdrs\u003d{"},{"line_number":4264,"context_line":"            \u0027X-Remove-\u0027 + self.env.location_header_key[len(\u0027X-\u0027):]:"},{"line_number":4265,"context_line":"            versions_container,"},{"line_number":4266,"context_line":"            self.env.location_header_key: versions_container}))"},{"line_number":4267,"context_line":""},{"line_number":4268,"context_line":"        # write object twice to container and check version"},{"line_number":4269,"context_line":"        obj_name \u003d Utils.create_name()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a8bc5a2_b7fee1ab","line":4266,"updated":"2016-09-26 18:00:30.000000000","message":"It might be worth mixing the headers a bit, like\n\n X-Remove-Versions-Location: x\n X-History-Location: versions_container\n\nbut that could be left for a later patch.","commit_id":"0c8c764547c78df0b00354bb06c5fb27d381647f"}]}
