)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"44aa71c90384449cae5a3ffc94f8e3a6cc6f0036","unresolved":false,"context_lines":[{"line_number":10,"context_line":"For example, a tree consisting of a single branch is stored like this:"},{"line_number":11,"context_line":"(id, parent, child, depth)"},{"line_number":12,"context_line":"(1, A, B, 1)"},{"line_number":13,"context_line":"(1, B, C, 1)"},{"line_number":14,"context_line":"(3, A, C, 2)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Implements bp closure-table"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"7af24918_3a512637","line":13,"updated":"2016-03-03 04:11:42.000000000","message":"s/(1, B, C, 1)/(2, B, C, 1)","commit_id":"1e416d14591b128c0c469cb34d59c00adba75241"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"04d7b83c671dde76122dc54f780fb2268fa29076","unresolved":false,"context_lines":[{"line_number":10,"context_line":"For example, a tree consisting of a single branch is stored like this:"},{"line_number":11,"context_line":"(id, parent, child, depth)"},{"line_number":12,"context_line":"(1, A, B, 1)"},{"line_number":13,"context_line":"(1, B, C, 1)"},{"line_number":14,"context_line":"(3, A, C, 2)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Implements bp closure-table"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"7af24918_ad8e822b","line":13,"in_reply_to":"7af24918_3a512637","updated":"2016-03-03 13:53:51.000000000","message":"Done","commit_id":"1e416d14591b128c0c469cb34d59c00adba75241"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"44aa71c90384449cae5a3ffc94f8e3a6cc6f0036","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            subtree \u003d [ref.to_dict() for ref in project.children]"},{"line_number":138,"context_line":"            # Check for circular references"},{"line_number":139,"context_line":"            ids \u003d [i[\u0027id\u0027] for i in subtree]"},{"line_number":140,"context_line":"            if len(ids) !\u003d len(set(ids)):"},{"line_number":141,"context_line":"                return"},{"line_number":142,"context_line":"            return subtree"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7af24918_fcb21b93","line":140,"updated":"2016-03-03 04:11:42.000000000","message":"add a LOG","commit_id":"1e416d14591b128c0c469cb34d59c00adba75241"},{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"44aa71c90384449cae5a3ffc94f8e3a6cc6f0036","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        with sql.session_for_write() as session:"},{"line_number":207,"context_line":"            if new_links is None:"},{"line_number":208,"context_line":"                return"},{"line_number":209,"context_line":"            elif new_links:"},{"line_number":210,"context_line":"                session.add_all(map(ProjectHierarchy.from_dict, new_links))"},{"line_number":211,"context_line":"            session.add(project_ref)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7af24918_bc58938b","line":209,"updated":"2016-03-03 04:11:42.000000000","message":"else:","commit_id":"1e416d14591b128c0c469cb34d59c00adba75241"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"04d7b83c671dde76122dc54f780fb2268fa29076","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        with sql.session_for_write() as session:"},{"line_number":207,"context_line":"            if new_links is None:"},{"line_number":208,"context_line":"                return"},{"line_number":209,"context_line":"            elif new_links:"},{"line_number":210,"context_line":"                session.add_all(map(ProjectHierarchy.from_dict, new_links))"},{"line_number":211,"context_line":"            session.add(project_ref)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7af24918_cd894e28","line":209,"in_reply_to":"7af24918_bc58938b","updated":"2016-03-03 13:53:51.000000000","message":"No, I don\u0027t want to call add_all for empty new_links :)","commit_id":"1e416d14591b128c0c469cb34d59c00adba75241"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"51461bc0ad092751b8bb1d0e04f881b63281cc57","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class ProjectHierarchy(sql.ModelBase, sql.DictBase):"},{"line_number":289,"context_line":"    __tablename__ \u003d \u0027project_hierarchy\u0027"},{"line_number":290,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027child_id\u0027, \u0027depth\u0027]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":293,"context_line":"    parent_id \u003d sql.Column("}],"source_content_type":"text/x-python","patch_set":28,"id":"1aa78d24_3bfebe05","line":290,"range":{"start_line":290,"start_character":18,"end_line":290,"end_character":24},"updated":"2016-07-08 14:32:24.000000000","message":"why is an ID needed ? see the example of role assignments, they don\u0027t have an ID. Just make (\u0027parent_id\u0027, \u0027child_id\u0027) unique","commit_id":"c0e6baeb48fc929920350f8ba71de5542420e9a7"}]}
