)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df0d34a323f3255470246629089f15ee2c29a9f7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     tanlin \u003clin.tan@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-01-02 17:27:08 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Modify SecurityGroupRule Object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Update SecurityGroupRule fields"},{"line_number":10,"context_line":"2. Add several functions"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAT3%2F%2FrZ4%3D","line":7,"updated":"2014-01-03 16:40:04.000000000","message":"Same comment on this patch. This may need to be two patches, but the above is not a suitable summary.","commit_id":"0763f8490e66131928dfc86508a15bf8bd420560"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"1afc5149632a3d7d3d9296471d78ab6bd942c6ee","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     tanlin \u003clin.tan@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-01-02 17:27:08 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Modify SecurityGroupRule Object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Update SecurityGroupRule fields"},{"line_number":10,"context_line":"2. Add several functions"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAUH%2F%2F9uE%3D","line":7,"in_reply_to":"AAAAT3%2F%2FrZ4%3D","updated":"2014-01-06 06:51:27.000000000","message":"Done","commit_id":"0763f8490e66131928dfc86508a15bf8bd420560"}],"nova/objects/security_group.py":[{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"4119604e2387d7d1e5bcb40955cd71a18d347b79","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class SecurityGroup(base.NovaPersistentObject, base.NovaObject):"},{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # Version 1.1: String attributes updated to support unicode"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    fields \u003d {"},{"line_number":26,"context_line":"        \u0027id\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9SCw%3D","line":23,"updated":"2013-12-13 03:34:08.000000000","message":"regarding you added API, you should bump the version","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"4f4cc97154939ce5b96fb1cbdc2208fffc7fed90","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    # Version 1.1: String attributes updated to support unicode"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    fields \u003d {"},{"line_number":26,"context_line":"        \u0027id\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":28,"context_line":"        \u0027description\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9XWs%3D","line":25,"updated":"2013-12-12 08:15:10.000000000","message":"In Nova, SecurityGroup\u0027s id is integer. But in Neutron, its id is uuid. The transition can not be done easily. Do you have any ideas about this?","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"4119604e2387d7d1e5bcb40955cd71a18d347b79","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    # Version 1.1: String attributes updated to support unicode"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    fields \u003d {"},{"line_number":26,"context_line":"        \u0027id\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":28,"context_line":"        \u0027description\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9SCs%3D","line":25,"in_reply_to":"AAAATn%2F9XWs%3D","updated":"2013-12-13 03:34:08.000000000","message":"Add another field uuid, does that work?","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"4119604e2387d7d1e5bcb40955cd71a18d347b79","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        return db.security_group_in_use(context, self.id)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @base.remotable"},{"line_number":59,"context_line":"    def create(self, context):"},{"line_number":60,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":61,"context_line":"        db_secgroup \u003d db.security_group_create(context, updates)"},{"line_number":62,"context_line":"        self._from_db_object(context, self, db_secgroup)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9SCU%3D","line":59,"updated":"2013-12-13 03:34:08.000000000","message":"check whether id obj_attr_is_set first?","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"}],"nova/objects/security_group_rule.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cfa64e7ed95f7c328e7e52d53f50231afbacfd6f","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject):"},{"line_number":24,"context_line":"    # Version 1.0: Initial version"},{"line_number":25,"context_line":"    # Version 1.1: Added several functions"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2Fysg%3D","line":25,"updated":"2013-12-31 14:02:22.000000000","message":"this comment is a but cryptic. would it be possible to be a little more specific here","commit_id":"bee04158fca47fde5c7e264059ee133d5de9a20f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cfa64e7ed95f7c328e7e52d53f50231afbacfd6f","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @staticmethod"},{"line_number":59,"context_line":"    def _to_db_object(context, updates):"},{"line_number":60,"context_line":"        if \u0027parent_group\u0027 in updates:"},{"line_number":61,"context_line":"            updates[\u0027parent_group_id\u0027] \u003d updates[\u0027parent_group\u0027].id"},{"line_number":62,"context_line":"            updates.pop(\u0027parent_group\u0027)"},{"line_number":63,"context_line":"        if \u0027grantee_group\u0027 in updates:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2Fyrw%3D","line":60,"updated":"2013-12-31 14:02:22.000000000","message":"consider:\nparent_group \u003d updates.pop(\u0027parent_group\u0027, None)\nif parent_group:\n    updates[\u0027parent_group_id\u0027] \u003d parent_group.id","commit_id":"bee04158fca47fde5c7e264059ee133d5de9a20f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cfa64e7ed95f7c328e7e52d53f50231afbacfd6f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        if \u0027parent_group\u0027 in updates:"},{"line_number":61,"context_line":"            updates[\u0027parent_group_id\u0027] \u003d updates[\u0027parent_group\u0027].id"},{"line_number":62,"context_line":"            updates.pop(\u0027parent_group\u0027)"},{"line_number":63,"context_line":"        if \u0027grantee_group\u0027 in updates:"},{"line_number":64,"context_line":"            updates[\u0027group_id\u0027] \u003d updates[\u0027grantee_group\u0027].id"},{"line_number":65,"context_line":"            updates.pop(\u0027grantee_group\u0027)"},{"line_number":66,"context_line":"        return updates"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2Fyrs%3D","line":63,"updated":"2013-12-31 14:02:22.000000000","message":"same as above","commit_id":"bee04158fca47fde5c7e264059ee133d5de9a20f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cfa64e7ed95f7c328e7e52d53f50231afbacfd6f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    @staticmethod"},{"line_number":69,"context_line":"    def _db_add_group(context, db_rule):"},{"line_number":70,"context_line":"        expected_attrs \u003d []"},{"line_number":71,"context_line":"        if db_rule.get(\u0027parent_group_id\u0027, None):"},{"line_number":72,"context_line":"            parent_group_id \u003d db_rule[\u0027parent_group_id\u0027]"},{"line_number":73,"context_line":"            parent_group \u003d security_group.SecurityGroup.get("},{"line_number":74,"context_line":"            context, parent_group_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2FyrU%3D","line":71,"updated":"2013-12-31 14:02:22.000000000","message":"parent_group_id \u003d db_rule.get(\u0027parent_group_id\u0027, None)\nif parent_group_id:\n parent_group \u003d security_group.SecurityGroup.get(\n\t\t\t74\t            context, parent_group_id)","commit_id":"bee04158fca47fde5c7e264059ee133d5de9a20f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cfa64e7ed95f7c328e7e52d53f50231afbacfd6f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            parent_group \u003d base.obj_to_primitive(parent_group)"},{"line_number":76,"context_line":"            db_rule[\u0027parent_group\u0027] \u003d parent_group"},{"line_number":77,"context_line":"            expected_attrs.append(\u0027parent_group\u0027)"},{"line_number":78,"context_line":"        if db_rule.get(\u0027group_id\u0027, None):"},{"line_number":79,"context_line":"            group_id \u003d db_rule[\u0027group_id\u0027]"},{"line_number":80,"context_line":"            grantee_group \u003d security_group.SecurityGroup.get("},{"line_number":81,"context_line":"            context, group_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2FyrM%3D","line":78,"updated":"2013-12-31 14:02:22.000000000","message":"ditto","commit_id":"bee04158fca47fde5c7e264059ee133d5de9a20f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df0d34a323f3255470246629089f15ee2c29a9f7","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject):"},{"line_number":24,"context_line":"    # Version 1.0: Initial version"},{"line_number":25,"context_line":"    # Version 1.1: Added _to_db_object(), _db_add_object, create(),"},{"line_number":26,"context_line":"    #              default_create(), default_get_by_id(), destroy(),"},{"line_number":27,"context_line":"    #              default_destroy(), get_by_grantee_group_id(),"},{"line_number":28,"context_line":"    #              get_by_grantee_group(), default_rule_list()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2FrZo%3D","line":25,"updated":"2014-01-03 16:40:04.000000000","message":"Non-remotable methods are not to be mentioned here.","commit_id":"0763f8490e66131928dfc86508a15bf8bd420560"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df0d34a323f3255470246629089f15ee2c29a9f7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return updates"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @staticmethod"},{"line_number":72,"context_line":"    def _db_add_group(context, db_rule):"},{"line_number":73,"context_line":"        expected_attrs \u003d []"},{"line_number":74,"context_line":"        parent_group_id \u003d db_rule.get(\u0027parent_group_id\u0027, None)"},{"line_number":75,"context_line":"        if parent_group_id:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2FrZY%3D","line":72,"updated":"2014-01-03 16:40:04.000000000","message":"This needs a docstring as it\u0027s not entirely obvious what it\u0027s doing.","commit_id":"0763f8490e66131928dfc86508a15bf8bd420560"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"1afc5149632a3d7d3d9296471d78ab6bd942c6ee","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return updates"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @staticmethod"},{"line_number":72,"context_line":"    def _db_add_group(context, db_rule):"},{"line_number":73,"context_line":"        expected_attrs \u003d []"},{"line_number":74,"context_line":"        parent_group_id \u003d db_rule.get(\u0027parent_group_id\u0027, None)"},{"line_number":75,"context_line":"        if parent_group_id:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F9uQ%3D","line":72,"in_reply_to":"AAAAT3%2F%2FrZY%3D","updated":"2014-01-06 06:51:27.000000000","message":"Done","commit_id":"0763f8490e66131928dfc86508a15bf8bd420560"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"87c798f68d45cdc701d150bf287fa6a231b64fdf","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"DB only store the parent_group_id and group_id in SecurityGroupRule."},{"line_number":75,"context_line":"        But SecurityGroupRule object contains SecurityGroup objects instead of"},{"line_number":76,"context_line":"        ids. Adding these two SecurityGroup objects is necessary"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        expected_attrs \u003d []"},{"line_number":79,"context_line":"        parent_group_id \u003d db_rule.get(\u0027parent_group_id\u0027, None)"},{"line_number":80,"context_line":"        if parent_group_id:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97pc%3D","line":77,"updated":"2014-01-31 22:43:27.000000000","message":"This is not true. The rule object includes relationships for the parent and grantee groups. The code you have here could generate up to two additional database hits instead of using the data it already has.","commit_id":"6490b7db18e0975532991129294e7936b80a74d6"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"f415ad7a045f0f35000d7e34d6951cf0b064326d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"DB only store the parent_group_id and group_id in SecurityGroupRule."},{"line_number":75,"context_line":"        But SecurityGroupRule object contains SecurityGroup objects instead of"},{"line_number":76,"context_line":"        ids. Adding these two SecurityGroup objects is necessary"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        expected_attrs \u003d []"},{"line_number":79,"context_line":"        parent_group_id \u003d db_rule.get(\u0027parent_group_id\u0027, None)"},{"line_number":80,"context_line":"        if parent_group_id:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F4vs%3D","line":77,"in_reply_to":"AAAAUH%2F97pc%3D","updated":"2014-02-10 08:26:53.000000000","message":"Done. @Dan Smith \nYes, you are right.\nIt\u0027s not necessary.","commit_id":"6490b7db18e0975532991129294e7936b80a74d6"}],"nova/tests/objects/test_security_group.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5b242b1b76c23267ab0928144ccfb973dc56aa69","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def test_create(self):"},{"line_number":63,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_create\u0027)"},{"line_number":64,"context_line":"        db.security_group_create(self.context,"},{"line_number":65,"context_line":"                                 {\u0027id\u0027: 1}).AndReturn(fake_secgroup)"},{"line_number":66,"context_line":"        self.mox.ReplayAll()"},{"line_number":67,"context_line":"        secgroup \u003d security_group.SecurityGroup()"},{"line_number":68,"context_line":"        secgroup.id \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9g6I%3D","line":65,"updated":"2013-12-10 18:15:52.000000000","message":"It does not make sense to create a security group and specify the id. In fact, the create() method should check for the presence of id and pop it out like the others.","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"4119604e2387d7d1e5bcb40955cd71a18d347b79","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def test_create(self):"},{"line_number":63,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_create\u0027)"},{"line_number":64,"context_line":"        db.security_group_create(self.context,"},{"line_number":65,"context_line":"                                 {\u0027id\u0027: 1}).AndReturn(fake_secgroup)"},{"line_number":66,"context_line":"        self.mox.ReplayAll()"},{"line_number":67,"context_line":"        secgroup \u003d security_group.SecurityGroup()"},{"line_number":68,"context_line":"        secgroup.id \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9SCo%3D","line":65,"in_reply_to":"AAAATn%2F9g6I%3D","updated":"2013-12-13 03:34:08.000000000","message":"Agree.","commit_id":"bdb7c68de404da5322786a9b1b2fa4d03ad691d5"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"0aac1faedb28562fe2cbc764f6ab598c3fcabc84","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertRemotes()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_create(self):"},{"line_number":63,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_create\u0027)"},{"line_number":64,"context_line":"        db.security_group_create(self.context, {\u0027project_id\u0027:"},{"line_number":65,"context_line":"                                 \u0027fake-project\u0027}).AndReturn(fake_secgroup)"},{"line_number":66,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8odQ%3D","line":63,"updated":"2013-12-24 01:04:45.000000000","message":"Mox is no longer used. New test cases should be implemented using Mock","commit_id":"5a121d2f1b11b301043ad2321eac84e3e550d859"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"0aac1faedb28562fe2cbc764f6ab598c3fcabc84","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.assertRemotes()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_destroy(self):"},{"line_number":99,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_destroy\u0027)"},{"line_number":100,"context_line":"        db.security_group_destroy(self.context, 1)"},{"line_number":101,"context_line":"        self.mox.ReplayAll()"},{"line_number":102,"context_line":"        secgroup \u003d security_group.SecurityGroup()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8oco%3D","line":99,"updated":"2013-12-24 01:04:45.000000000","message":"ditto","commit_id":"5a121d2f1b11b301043ad2321eac84e3e550d859"}],"nova/tests/objects/test_security_group_rule.py":[{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"0aac1faedb28562fe2cbc764f6ab598c3fcabc84","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def test_get_by_id(self):"},{"line_number":38,"context_line":"        rule \u003d dict(fake_rule)"},{"line_number":39,"context_line":"        rule[\u0027group_id\u0027] \u003d 123"},{"line_number":40,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_get\u0027)"},{"line_number":41,"context_line":"        secgroup \u003d dict(test_security_group.fake_secgroup, id\u003d123)"},{"line_number":42,"context_line":"        db.security_group_get(self.context, 123, None).AndReturn(secgroup)"},{"line_number":43,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8ocg%3D","line":40,"updated":"2013-12-24 01:04:45.000000000","message":"here use mock.","commit_id":"5a121d2f1b11b301043ad2321eac84e3e550d859"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"0aac1faedb28562fe2cbc764f6ab598c3fcabc84","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            sgrg.assert_called_with(self.context, 1)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_create(self):"},{"line_number":63,"context_line":"        self.mox.StubOutWithMock(db, \u0027security_group_rule_create\u0027)"},{"line_number":64,"context_line":"        db.security_group_rule_create(self.context, {\u0027protocol\u0027:"},{"line_number":65,"context_line":"                                 \u0027tcp\u0027}).AndReturn(fake_rule)"},{"line_number":66,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8occ%3D","line":63,"updated":"2013-12-24 01:04:45.000000000","message":"ditto","commit_id":"5a121d2f1b11b301043ad2321eac84e3e550d859"}]}
