)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f1be8eafdccf92ba642780255d33ba7cbf0b96ba","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"due to blueprint config-plugin-by-name[1], convenient plugin name alias"},{"line_number":10,"context_line":"can be use in config file, but the db migration doesn\u0027t understand the"},{"line_number":11,"context_line":"name alias."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[1] https://blueprints.launchpad.net/neutron/+spec/config-plugin-by-name"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1ae5cdf2_cafc0975","line":11,"updated":"2014-06-13 08:50:08.000000000","message":"This is a good description of the bug, but not this patch. Can you add a sentence or two to describe what this patch does to address the problem?","commit_id":"5b4aeebc00e29948e418078fd8e66ee7cf9430e4"}],"neutron/db/migration/alembic_migrations/env.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"e7e521d0f9eb0636007c84399db7dd0dc8d5d65d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"fileConfig(config.config_file_name)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_plugin_class_name(namespace, plugin_provider):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        # Try to resolve plugin by name"},{"line_number":43,"context_line":"        mgr \u003d driver.DriverManager(namespace, plugin_provider)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBKM%3D","line":40,"updated":"2014-03-31 14:16:48.000000000","message":"I\u0027d better call it _import_and_get_plugin_class_name , as it does both things.\n\nOtherwise it\u0027s a little bit confusing (I was looking for the import_class in the old version)","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"f05d973a113e3ea8828dee41e888899b6f9c0022","unresolved":false,"context_lines":[{"line_number":37,"context_line":"fileConfig(config.config_file_name)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_plugin_class_name(namespace, plugin_provider):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        # Try to resolve plugin by name"},{"line_number":43,"context_line":"        mgr \u003d driver.DriverManager(namespace, plugin_provider)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBBA%3D","line":40,"in_reply_to":"AAAAWH%2F%2BBKM%3D","updated":"2014-03-31 14:33:03.000000000","message":"imports are used to check the class existence, it is not necessary. I\u0027ll add some comment for that","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"7da87456cb628fbd9d294ea878ccfad91f4b0a51","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_plugin_class_name(namespace, plugin_provider):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        # Try to resolve plugin by name"},{"line_number":43,"context_line":"        mgr \u003d driver.DriverManager(namespace, plugin_provider)"},{"line_number":44,"context_line":"        plugin_class \u003d mgr.driver"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBHY%3D","line":41,"updated":"2014-03-31 14:19:51.000000000","message":"Another nit, you could move this function just before run_migrations_offline, this way the vars stay all at top.","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"f05d973a113e3ea8828dee41e888899b6f9c0022","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_plugin_class_name(namespace, plugin_provider):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        # Try to resolve plugin by name"},{"line_number":43,"context_line":"        mgr \u003d driver.DriverManager(namespace, plugin_provider)"},{"line_number":44,"context_line":"        plugin_class \u003d mgr.driver"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBD8%3D","line":41,"in_reply_to":"AAAAWH%2F%2BBHY%3D","updated":"2014-03-31 14:33:03.000000000","message":"this function is used during vars init","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"437423cc76024955ee793046dd6542203c548c97","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        plugin_class \u003d mgr.driver"},{"line_number":45,"context_line":"    except RuntimeError:"},{"line_number":46,"context_line":"        # fallback to class name"},{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            plugin_class \u003d importutils.import_class(plugin_provider)"},{"line_number":49,"context_line":"        except ImportError:"},{"line_number":50,"context_line":"            raise ImportError(_(\"Plugin not found.\"))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BA78%3D","line":47,"updated":"2014-03-31 14:41:25.000000000","message":"Is it needed? If it is, please add plugin_provider to L50.","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b7001c5aa809374721b7710912cd98355526a2a8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    except RuntimeError:"},{"line_number":46,"context_line":"        # fallback to class name"},{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            plugin_class \u003d importutils.import_class(plugin_provider)"},{"line_number":49,"context_line":"        except ImportError:"},{"line_number":50,"context_line":"            raise ImportError(_(\"Plugin not found.\"))"},{"line_number":51,"context_line":"    return \"%s.%s\" % (plugin_class.__module__, plugin_class.__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBGw%3D","line":48,"updated":"2014-03-31 14:20:43.000000000","message":"I think the class cannot be imported because later plugins for migrations are strings and not classes.","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"76727970f95bb08f04fe6701672d40eb2fd11ab5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    except RuntimeError:"},{"line_number":46,"context_line":"        # fallback to class name"},{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            plugin_class \u003d importutils.import_class(plugin_provider)"},{"line_number":49,"context_line":"        except ImportError:"},{"line_number":50,"context_line":"            raise ImportError(_(\"Plugin not found.\"))"},{"line_number":51,"context_line":"    return \"%s.%s\" % (plugin_class.__module__, plugin_class.__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BA%2B0%3D","line":48,"in_reply_to":"AAAAWH%2F%2BBEk%3D","updated":"2014-03-31 14:37:03.000000000","message":"Oh, sorry. I missed the line 51. I was previously looking on the related patch that gives ability to use entry points and I mixed it together thinking this function returns plugin_class.","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"f05d973a113e3ea8828dee41e888899b6f9c0022","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    except RuntimeError:"},{"line_number":46,"context_line":"        # fallback to class name"},{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            plugin_class \u003d importutils.import_class(plugin_provider)"},{"line_number":49,"context_line":"        except ImportError:"},{"line_number":50,"context_line":"            raise ImportError(_(\"Plugin not found.\"))"},{"line_number":51,"context_line":"    return \"%s.%s\" % (plugin_class.__module__, plugin_class.__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BBEk%3D","line":48,"in_reply_to":"AAAAWH%2F%2BBGw%3D","updated":"2014-03-31 14:33:03.000000000","message":"This is what this patch do.\n\nThe origin code failed to import plugin classes which are strings, so the patch try stevedore first, then to keep compatibility also try  import.","commit_id":"34ac4ae3e7018e1239f139def478d685a9a4f9be"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e51e88ec7be524f21b422a802d7087ce6d7473bb","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    script output."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    raise RuntimeError(neutron_config.database.connection)"},{"line_number":54,"context_line":"    context.configure(url\u003dneutron_config.database.connection)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    with context.begin_transaction():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9%2Fxs%3D","line":53,"updated":"2014-03-31 17:06:08.000000000","message":"Seems to need to delete this.\noffline migration needs to be supported.","commit_id":"629f15854562de7cf7dd5ce8df6d16821b3b6abc"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"b865c06d7d94e98ff720d32291548548b760bdd7","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    script output."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    raise RuntimeError(neutron_config.database.connection)"},{"line_number":54,"context_line":"    context.configure(url\u003dneutron_config.database.connection)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    with context.begin_transaction():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F99cg%3D","line":53,"in_reply_to":"AAAAWH%2F9%2Fxs%3D","updated":"2014-03-31 22:38:29.000000000","message":"Sorry, forget to remove debug code","commit_id":"629f15854562de7cf7dd5ce8df6d16821b3b6abc"}],"neutron/db/migration/alembic_migrations/utils.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"d3fb6a5a2df8600fb44c5deafde8f4eee112d71c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 NetEase Inc"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F91kE%3D","line":1,"updated":"2014-04-01 19:02:22.000000000","message":"Why are we creating this file?  Not sure why these functions were split out from env.py","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"ff46589fdd34f6e2e3ed84b5fcbb7b76af2acde5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 NetEase Inc"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9yD8%3D","line":1,"in_reply_to":"AAAAWH%2F91kE%3D","updated":"2014-04-02 08:03:17.000000000","message":"I have problems writing testcases to test functions in env.py, because env.py depends alembic and can not be imported directly.","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8d477740a97b6e9f0a4aae896c34228b9ed8093a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            raise RuntimeError(_(\"Plugin not found: %s.\") % plugin_provider)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_active_plugins(neutron_config):"},{"line_number":39,"context_line":"    active_plugins \u003d ["},{"line_number":40,"context_line":"        get_plugin_class_name(\u0027neutron.core_plugins\u0027,"},{"line_number":41,"context_line":"                              neutron_config.core_plugin)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F959I%3D","line":38,"updated":"2014-04-01 09:50:52.000000000","message":"get_and_import_active_plugins(neutron_config) ?","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"ff46589fdd34f6e2e3ed84b5fcbb7b76af2acde5","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            raise RuntimeError(_(\"Plugin not found: %s.\") % plugin_provider)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_active_plugins(neutron_config):"},{"line_number":39,"context_line":"    active_plugins \u003d ["},{"line_number":40,"context_line":"        get_plugin_class_name(\u0027neutron.core_plugins\u0027,"},{"line_number":41,"context_line":"                              neutron_config.core_plugin)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9yDU%3D","line":38,"in_reply_to":"AAAAWH%2F959I%3D","updated":"2014-04-02 08:03:17.000000000","message":"the import is side-effect of checking the class existence, so I don\u0027t think the function name should be changed here","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"87fbe11935523fd5b2f8ebc866d2c52a281b9fb8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    active_plugins +\u003d ["},{"line_number":44,"context_line":"        get_plugin_class_name(\u0027neutron.service_plugins\u0027, plugin)"},{"line_number":45,"context_line":"        for plugin in neutron_config.service_plugins"},{"line_number":46,"context_line":"    ]"},{"line_number":47,"context_line":"    return active_plugins"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F96Yo%3D","line":46,"updated":"2014-04-01 08:51:40.000000000","message":"Suggestion:\n\n active_plugins \u003d [get_plugin_class_name(\u0027neutron.service_plugins\u0027, plugin) for plugin in neutron_config.service_plugins]\n active_plugins.append(get_plugin_class_name(\u0027neutron.core_plugins\u0027, neutron_config.core_plugin)\n\nIt is more effective than extending list containing one item with other list.","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8d477740a97b6e9f0a4aae896c34228b9ed8093a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    active_plugins +\u003d ["},{"line_number":44,"context_line":"        get_plugin_class_name(\u0027neutron.service_plugins\u0027, plugin)"},{"line_number":45,"context_line":"        for plugin in neutron_config.service_plugins"},{"line_number":46,"context_line":"    ]"},{"line_number":47,"context_line":"    return active_plugins"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F959Q%3D","line":46,"in_reply_to":"AAAAWH%2F96Yo%3D","updated":"2014-04-01 09:50:52.000000000","message":"Jakub: I\u0027m not sure if import order (core -\u003e plugins) matters.","commit_id":"f2c953c24cc92b759e3dfe18e95f2a353cf8cd96"}]}
