)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"db477f3d578e69b1cd07d80c59efa80d75ab43c4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mahati Chamarthy \u003cmahati.chamarthy@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-09 00:46:15 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OPTIONS verb implemented for object server."},{"line_number":8,"context_line":"Many times new deployers get mysterious errors after first setting up their"},{"line_number":9,"context_line":"Swift clusters. Most of the time, the errors are because the values in the ring"},{"line_number":10,"context_line":"are incorrect (e.g. a bad port number). OPTIONS will be used in a ring checker"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_ab60e5a5","line":7,"updated":"2014-12-10 23:51:42.000000000","message":"you\u0027ve already mentioned it, but you need an extra blank line here.","commit_id":"31aa3121c34e404dad5603913d06b623862ab43c"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"646fc4cce329160d40b0e7f2afa2e29da67ca3c1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement OPTIONS verb for storage nodes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Note: This is still WIP. Pushing it to get some inputs."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Many times new deployers get mysterious errors after first setting up their"},{"line_number":12,"context_line":"Swift clusters. Most of the time, the errors are because the values in the ring"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1a930d6b_803aa434","line":9,"updated":"2015-01-21 00:34:29.000000000","message":"remove WIP comments","commit_id":"cd1e8eeb2983756fd09200279c1393caf9c3c0ff"}],"swift/common/base_storage_server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"9d17e0f73fb4620077181f4875c661a1dd2727b8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @property"},{"line_number":30,"context_line":"    def allowed_methods(self):"},{"line_number":31,"context_line":"        if self._allowed_methods is None:"},{"line_number":32,"context_line":"            self._allowed_methods \u003d set()"},{"line_number":33,"context_line":"            all_methods \u003d inspect.getmembers(self, predicate\u003dinspect.ismethod)"},{"line_number":34,"context_line":"            for name, m in all_methods:"},{"line_number":35,"context_line":"                if getattr(m, \u0027publicly_accessible\u0027, False):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_e7c03d2d","line":32,"updated":"2014-12-20 01:40:37.000000000","message":"You may want to make this a sorted list instead of a set. That way the verbs always come back in the same order in the Allow header.","commit_id":"78210e9fe89161b58d611062121c473e22a69839"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b08d73f1b0ac4fcb9272f96ca07abaa42d19e049","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            for name, m in all_methods:"},{"line_number":35,"context_line":"                if getattr(m, \u0027publicly_accessible\u0027, False):"},{"line_number":36,"context_line":"                    self._allowed_methods.append(name)"},{"line_number":37,"context_line":"        return sorted(self._allowed_methods)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @public"},{"line_number":40,"context_line":"    @timing_stats()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_ae083029","line":37,"updated":"2014-12-31 00:25:56.000000000","message":"One tiny improvement: in the if block, sort the methods:\n\n    self._allowed_methods.sort()\n\nThat way, you don\u0027t need the call to sorted() every time.\n\nIt\u0027s a tiny optimization, but it jumped out at me.","commit_id":"a826cba254eee2b2eb7de70052eb73be72a5d96e"},{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"25843c1d7f0a9a2facf807d5f4c349e54d435afd","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            for name, m in all_methods:"},{"line_number":35,"context_line":"                if getattr(m, \u0027publicly_accessible\u0027, False):"},{"line_number":36,"context_line":"                    self._allowed_methods.append(name)"},{"line_number":37,"context_line":"                    self._allowed_methods.sort"},{"line_number":38,"context_line":"        return self._allowed_methods"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @public"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_59b2c649","line":37,"updated":"2015-01-07 09:04:58.000000000","message":"You are sorting after every append to list. How about sorting outside the for loop ? Also, you\u0027ll need the parenthesis after sort - self._allowed_methods.sort()","commit_id":"eebedb52058802493bb496a7495436794696fd25"},{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"28a4559c5816399e5d98b37a20ac30ab8dcfa368","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def allowed_methods(self):"},{"line_number":35,"context_line":"        if (self._allowed_methods is None and"},{"line_number":36,"context_line":"                self.replication_server is not None and"},{"line_number":37,"context_line":"                self.replication_server is True):"},{"line_number":38,"context_line":"            self._allowed_methods \u003d list()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_6ae57e3d","line":35,"updated":"2015-01-20 05:21:40.000000000","message":"You can improve code in this method for better readability. It\u0027s a little confusing right now.","commit_id":"1a2392f8a73bd22c7738f5038d94cc3bc9389493"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"b0228e7427b27ee52c8aeff660a8ea612f64f3b4","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    if (getattr(m, \u0027publicly_accessible\u0027, False) and not"},{"line_number":47,"context_line":"                            getattr(m, \u0027replication\u0027, False)):"},{"line_number":48,"context_line":"                        self._allowed_methods.append(name)"},{"line_number":49,"context_line":"            elif self.replication_server is None:"},{"line_number":50,"context_line":"                for name, m in all_methods:"},{"line_number":51,"context_line":"                    if getattr(m, \u0027publicly_accessible\u0027, False):"},{"line_number":52,"context_line":"                        self._allowed_methods.append(name)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_80b544cf","line":49,"updated":"2015-01-21 00:32:13.000000000","message":"I like the explicitness of \"is True\", \"is False\", \"is None\".","commit_id":"cd1e8eeb2983756fd09200279c1393caf9c3c0ff"}],"swift/container/server.py":[{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"754b744db6f1ba6f2c9f904a80f15b510f77dfc1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.mount_check \u003d config_true_value(conf.get(\u0027mount_check\u0027, \u0027true\u0027))"},{"line_number":86,"context_line":"        self.node_timeout \u003d int(conf.get(\u0027node_timeout\u0027, 3))"},{"line_number":87,"context_line":"        self.conn_timeout \u003d float(conf.get(\u0027conn_timeout\u0027, 0.5))"},{"line_number":88,"context_line":"        replication_server \u003d conf.get(\u0027replication_server\u0027, None)"},{"line_number":89,"context_line":"        if replication_server is not None:"},{"line_number":90,"context_line":"            replication_server \u003d config_true_value(replication_server)"},{"line_number":91,"context_line":"        self.replication_server \u003d replication_server"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_9da5a106","side":"PARENT","line":88,"updated":"2015-01-21 09:04:30.000000000","message":"From the doc here http://docs.openstack.org/developer/swift/replication_network.html. it seems that this option is applicable to all (acc,cont,obj) servers. The changes to this file, I do see them here in container/server.py code but not in account/server.py or obj/server.py. Am I missing something ? Is this intended ?\n\nSame comment for test_call_incorrect_replication_method() in unit tests which is present for container server but not other two servers.","commit_id":"cc2f0f4ed6f12554b7d8e8cb61e14f2b103445a0"}],"test/unit/account/test_server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"9d17e0f73fb4620077181f4875c661a1dd2727b8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEquals(200, resp.status_int)"},{"line_number":65,"context_line":"        for verb in \u0027OPTIONS GET POST PUT DELETE HEAD REPLICATE\u0027.split():"},{"line_number":66,"context_line":"            self.assertTrue("},{"line_number":67,"context_line":"                verb in resp.headers[\u0027Allow\u0027])"},{"line_number":68,"context_line":"        self.assertEquals(len(resp.headers[\u0027Allow\u0027].split(\u0027, \u0027)), 7)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_DELETE_not_found(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_e7ee7db4","line":67,"updated":"2014-12-20 01:40:37.000000000","message":"I think you\u0027ll want to split the value of the Allow header and then do the membership test. On my machine, I did this to the code:\n\nhttp://paste.openstack.org/show/quL7d1zE4hwVDMxZqN6S/\n\nand this test still passed. It\u0027s because this code is doing a substring match, so \"GET\" in \"GETbogon, PUTbogon, ...\" is true, but the header\u0027s value is wrong.","commit_id":"78210e9fe89161b58d611062121c473e22a69839"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"b0228e7427b27ee52c8aeff660a8ea612f64f3b4","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"        resp \u003d server_handler.OPTIONS(req)"},{"line_number":1132,"context_line":"        self.assertEquals(200, resp.status_int)"},{"line_number":1133,"context_line":"        for verb in \u0027OPTIONS GET POST PUT DELETE HEAD REPLICATE \\"},{"line_number":1134,"context_line":"        REPLICATION\u0027.split():"},{"line_number":1135,"context_line":"            self.assertTrue("},{"line_number":1136,"context_line":"                verb in resp.headers[\u0027Allow\u0027].split(\u0027, \u0027))"},{"line_number":1137,"context_line":"        self.assertEquals(len(resp.headers[\u0027Allow\u0027].split(\u0027, \u0027)), 8)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_c09f4c4f","line":1134,"updated":"2015-01-21 00:32:13.000000000","message":"nit: this should be indented twice to make more clear.","commit_id":"cd1e8eeb2983756fd09200279c1393caf9c3c0ff"}]}
