)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"555693bd1472fba1beb50a2f1f4067f0d36051e6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"extension migrations"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allow each of the extenstions to have their own"},{"line_number":10,"context_line":"sql migration repository instead of mixing them into"},{"line_number":11,"context_line":"the common repo."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAQn%2F%2Fsgs%3D","line":9,"updated":"2013-07-24 22:31:12.000000000","message":"change \"extenstions\" to \"extensions\"","commit_id":"ecde589ba35641a97b3b85d63d28ac919e62e373"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"extension migrations"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allow each of the extentions to have their own"},{"line_number":10,"context_line":"sql migration repository instead of mixing them into"},{"line_number":11,"context_line":"the common repo.  db_sync must be called explicitly on the extension."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAQn%2F%2FLWA%3D","line":9,"updated":"2013-08-05 22:43:09.000000000","message":"(nit) change \"extentions\" to \"extensions\"","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"722d072463376d8253449de09e3532bcce5cea34","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"In the past, it was assumed that only migrations for backends backed in"},{"line_number":14,"context_line":"sql would be run.  In practice, however, all of the migrations were run"},{"line_number":15,"context_line":"every time.  The code has been ,odified to reflect this."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Adds parameter --extension to the cli for db_sync and db_version"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"AAAAQn%2F%2FHe4%3D","line":15,"updated":"2013-08-06 22:57:01.000000000","message":"change \",odified\" to \"modified\"","commit_id":"1029ce8307def51289d9dae96f838fcf51fda44b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"722d072463376d8253449de09e3532bcce5cea34","unresolved":false,"context_lines":[{"line_number":31,"context_line":"bin/keystone-manage db_version --extension example"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"blueprint multiple-sql-migrate-repos"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: I6852d75bde6506c535fa3d74537e3c1bbd6578d8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"AAAAQn%2F%2FHfE%3D","line":34,"updated":"2013-08-06 22:57:01.000000000","message":"add a DocImpact tag","commit_id":"1029ce8307def51289d9dae96f838fcf51fda44b"}],"doc/source/developing.rst":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":74,"context_line":"Database Schema Migrations"},{"line_number":75,"context_line":"--------------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Keystone uses the Sql Alchemy migrations tool to migrate the SQL database between"},{"line_number":78,"context_line":"revisions.  For core components, the migrations are kept in a central repository"},{"line_number":79,"context_line":"under keystone/common/sql/migrate_repo."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZ6I%3D","line":77,"updated":"2013-07-31 17:44:21.000000000","message":"change \"the Sql Alchemy migrations tool\" to \"SQLAlchemy-migrate (http://code.google.com/p/sqlalchemy-migrate/)\"\n\nI think this will be easier for developers to find.","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":74,"context_line":"Database Schema Migrations"},{"line_number":75,"context_line":"--------------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Keystone uses the Sql Alchemy migrations tool to migrate the SQL database between"},{"line_number":78,"context_line":"revisions.  For core components, the migrations are kept in a central repository"},{"line_number":79,"context_line":"under keystone/common/sql/migrate_repo."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZwk%3D","line":77,"in_reply_to":"AAAAQn%2F%2FZ6I%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b17a6ecd4b893b417ebed6be012936666b28ddc5","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"An extension should not change the common repository, but should instead have its"},{"line_number":82,"context_line":"own repository.  An extension under keystone/contrib that requires a sql migration"},{"line_number":83,"context_line":"should create a directory name migrate_repo with a subdirectory named versions."},{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FaHo%3D","line":83,"updated":"2013-07-31 16:59:28.000000000","message":"I think you are trying to say that the extension should create a new directory under contrib with this directory name being the name of the extension and this is where the extension package should go.  This part is not clear in the prose. And then you can go onto say that in this package extension directory,  extensions that require a sql migration should create a directory named migrate_repo with a subdirectory named versions.","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"An extension should not change the common repository, but should instead have its"},{"line_number":82,"context_line":"own repository.  An extension under keystone/contrib that requires a sql migration"},{"line_number":83,"context_line":"should create a directory name migrate_repo with a subdirectory named versions."},{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZ6g%3D","line":83,"updated":"2013-07-31 17:44:21.000000000","message":"change \"name\" to \"named\"","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"An extension should not change the common repository, but should instead have its"},{"line_number":82,"context_line":"own repository.  An extension under keystone/contrib that requires a sql migration"},{"line_number":83,"context_line":"should create a directory name migrate_repo with a subdirectory named versions."},{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZwg%3D","line":83,"in_reply_to":"AAAAQn%2F%2FaHo%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b17a6ecd4b893b417ebed6be012936666b28ddc5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"},{"line_number":87,"context_line":"migration tool will look for a configuration file in the migrate_repo named migrate.cfg."},{"line_number":88,"context_line":"This conforms to a Key/value ini file format.  A sample config file is:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"[db_settings]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FaGY%3D","line":87,"updated":"2013-07-31 16:59:28.000000000","message":"What are the important values that must be placed in the configuration file?  Would be good to mention the critical key values that are expected to be in this config file","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"},{"line_number":87,"context_line":"migration tool will look for a configuration file in the migrate_repo named migrate.cfg."},{"line_number":88,"context_line":"This conforms to a Key/value ini file format.  A sample config file is:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"[db_settings]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZ6M%3D","line":87,"updated":"2013-07-31 17:44:21.000000000","message":"suggest change \"The migration tool\" to \"SQLAlchemy-migrate\"","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"},{"line_number":87,"context_line":"migration tool will look for a configuration file in the migrate_repo named migrate.cfg."},{"line_number":88,"context_line":"This conforms to a Key/value ini file format.  A sample config file is:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"[db_settings]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZwY%3D","line":87,"in_reply_to":"AAAAQn%2F%2FZ6M%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"If the extension name is `example` then the directory structure whould be"},{"line_number":85,"context_line":"`keystone/contrib/example/migrate_repo/versions/`.  For the migration to work, both"},{"line_number":86,"context_line":"the migrate_repo and versions subdirectories should have empty __init__.py files.  The"},{"line_number":87,"context_line":"migration tool will look for a configuration file in the migrate_repo named migrate.cfg."},{"line_number":88,"context_line":"This conforms to a Key/value ini file format.  A sample config file is:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"[db_settings]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAQn%2F%2FZwc%3D","line":87,"in_reply_to":"AAAAQn%2F%2FaGY%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"882c0b2f4e5858a3799f699d2bf221f3ef12307d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"--------------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Keystone uses the SQLAlchemy-migrate"},{"line_number":78,"context_line":"(http://code.google.com/p/sqlalchemy-migrate/) to migrate the SQL database"},{"line_number":79,"context_line":"between revisions.  For core components, the migrations are kept in a central"},{"line_number":80,"context_line":"repository under keystone/common/sql/migrate_repo."},{"line_number":81,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAAQn%2F%2FZXQ%3D","line":78,"updated":"2013-07-31 20:13:52.000000000","message":"Not sure if that\u0027s the proper way to specify a link. Perhaps\n\n_`SQLAlchemy-migrate`: http://code.google.com/p/sqlalchemy-migrate/","commit_id":"1c5de6d34f84ebc8fa992d3fdce23ed447eb6af3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"882c0b2f4e5858a3799f699d2bf221f3ef12307d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"Extensions should be created as directories under `keystone/contrib`.  An"},{"line_number":83,"context_line":"extension that requires sql migrations should not change the common repository,"},{"line_number":84,"context_line":"but should instead have its own repository.  This repository should be in the"},{"line_number":85,"context_line":"extension\u0027s directory in `keystone/contrib/\u003cextension\u003emigrate_repo.`  In"},{"line_number":86,"context_line":"addition it needs a subdirectory named `versions`.  For example. if the"},{"line_number":87,"context_line":"extension name is `my_extension` then the directory structure would be"},{"line_number":88,"context_line":"`keystone/contrib/my_extension/migrate_repo/versions/`.  For the migration"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAAQn%2F%2FZXA%3D","line":85,"updated":"2013-07-31 20:13:52.000000000","message":"missing /\n\n`keystone/contrib/\u003cextension\u003e/migrate_repo.`","commit_id":"1c5de6d34f84ebc8fa992d3fdce23ed447eb6af3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"263bee1c6320c5f54f8914a8c8f35c86b99fc6fb","unresolved":false,"context_lines":[{"line_number":89,"context_line":"to work, both the migrate_repo and versions subdirectories should have empty"},{"line_number":90,"context_line":"__init__.py files.  SQLAlchemy-migrate will look for a configuration file in"},{"line_number":91,"context_line":"the migrate_repo named migrate.cfg. This conforms to a Key/value ini file"},{"line_number":92,"context_line":"format.  A sample config file with the minimal set of values is:"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"[db_settings]"},{"line_number":95,"context_line":"repository_id\u003dmy_extension"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAAQn%2F%2FZuE%3D","line":92,"updated":"2013-07-31 18:22:45.000000000","message":"I generated the docs and this doesn\u0027t look right. Change the : here to :: , then I think that the following lines have to be indented a space.","commit_id":"1c5de6d34f84ebc8fa992d3fdce23ed447eb6af3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":74,"context_line":"Database Schema Migrations"},{"line_number":75,"context_line":"--------------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Keystone uses the SQLAlchemy-migrate"},{"line_number":78,"context_line":"_`SQLAlchemy-migrate`:http://code.google.com/p/sqlalchemy-migrate/ to migrate the SQL database"},{"line_number":79,"context_line":"between revisions.  For core components, the migrations are kept in a central"},{"line_number":80,"context_line":"repository under keystone/common/sql/migrate_repo."}],"source_content_type":"text/x-rst","patch_set":17,"id":"AAAAQn%2F%2FLVo%3D","line":77,"updated":"2013-08-05 22:43:09.000000000","message":"(nit) remove \"the\"","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Extensions should be created as directories under `keystone/contrib`.  An"},{"line_number":83,"context_line":"extension that requires sql migrations should not change the common repository,"},{"line_number":84,"context_line":"but should instead have its own repository.  This repository should be in the"},{"line_number":85,"context_line":"extension\u0027s directory in `keystone/contrib/\u003cextension\u003e/migrate_repo.`  In"},{"line_number":86,"context_line":"addition it needs a subdirectory named `versions`.  For example. if the"},{"line_number":87,"context_line":"extension name is `my_extension` then the directory structure would be"}],"source_content_type":"text/x-rst","patch_set":17,"id":"AAAAQn%2F%2FLVI%3D","line":84,"updated":"2013-08-05 22:43:09.000000000","message":"suggest change \"should\" to \"must\"","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"extension that requires sql migrations should not change the common repository,"},{"line_number":84,"context_line":"but should instead have its own repository.  This repository should be in the"},{"line_number":85,"context_line":"extension\u0027s directory in `keystone/contrib/\u003cextension\u003e/migrate_repo.`  In"},{"line_number":86,"context_line":"addition it needs a subdirectory named `versions`.  For example. if the"},{"line_number":87,"context_line":"extension name is `my_extension` then the directory structure would be"},{"line_number":88,"context_line":"`keystone/contrib/my_extension/migrate_repo/versions/`.  For the migration"},{"line_number":89,"context_line":"o work, both the migrate_repo and versions subdirectories should have empty"}],"source_content_type":"text/x-rst","patch_set":17,"id":"AAAAQn%2F%2FLU0%3D","line":86,"updated":"2013-08-05 22:43:09.000000000","message":"change . to , after \"For example\"","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"addition it needs a subdirectory named `versions`.  For example. if the"},{"line_number":87,"context_line":"extension name is `my_extension` then the directory structure would be"},{"line_number":88,"context_line":"`keystone/contrib/my_extension/migrate_repo/versions/`.  For the migration"},{"line_number":89,"context_line":"o work, both the migrate_repo and versions subdirectories should have empty"},{"line_number":90,"context_line":"__init__.py files.  SQLAlchemy-migrate will look for a configuration file in"},{"line_number":91,"context_line":"the migrate_repo named migrate.cfg. This conforms to a Key/value ini file"},{"line_number":92,"context_line":"format.  A sample config file with the minimal set of values is::"}],"source_content_type":"text/x-rst","patch_set":17,"id":"AAAAQn%2F%2FLUs%3D","line":89,"updated":"2013-08-05 22:43:09.000000000","message":"change \"should\" to \"must\"","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    required_dbs\u003d[]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"The directory `keystone/contrib/example` contains a sample extension migration."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Initial Sample Data"},{"line_number":102,"context_line":"-------------------"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"AAAAQn%2F%2FLVU%3D","line":100,"updated":"2013-08-05 22:43:09.000000000","message":"I think the recent change to not migrate the extension repo with db_sync is going to surprise developers and they will constantly be trying to change it so that their extension migration happens automatically. So I suggest adding a new paragraph here explaining that the developer will need to do `keystone-migrate db_sync --extension my_extension` to apply their migration.","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"}],"keystone/cli.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"025e3c37076bcacbc6c5a0f5427a8fdd1e51855e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            try:"},{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except Exception as e:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2FpLM%3D","line":77,"updated":"2013-07-15 13:41:36.000000000","message":"I think, it\u0027s will be better if you will catch some known exception here, not Exception.","commit_id":"49c28ef2d8e12b8c0270a99dc58e551b808c5924"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"025e3c37076bcacbc6c5a0f5427a8fdd1e51855e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":81,"context_line":"            except Exception as e:"},{"line_number":82,"context_line":"                pass"},{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                print \"running db_sync on %s\" % package_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2FpLI%3D","line":81,"updated":"2013-07-15 13:41:36.000000000","message":"ditto","commit_id":"49c28ef2d8e12b8c0270a99dc58e551b808c5924"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"025e3c37076bcacbc6c5a0f5427a8fdd1e51855e","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                print \"running db_sync on %s\" % package_name"},{"line_number":85,"context_line":"                migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":86,"context_line":"            except Exception as e:"},{"line_number":87,"context_line":"                print e"},{"line_number":88,"context_line":"                pass"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2FpLE%3D","line":86,"updated":"2013-07-15 13:41:36.000000000","message":"ditto","commit_id":"49c28ef2d8e12b8c0270a99dc58e551b808c5924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdf1b5c65bc09331aced69509a91d090779259f1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except ImportError:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":81,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2Fiu4%3D","line":78,"updated":"2013-07-16 19:36:40.000000000","message":"(NIT): would it be useful to have a little bit of logging, kicking some info back to the user on the ImportError before continuing with the loop?","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6435f81490f01910a992a85bb30991bf90269626","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except ImportError:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":81,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2FihM%3D","line":78,"in_reply_to":"AAAAP3%2F%2Fii4%3D","updated":"2013-07-16 20:17:05.000000000","message":"sounds good, thanks for the clarification","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5ef1193ee6834840360e688e781fe73df5ba8a96","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except ImportError:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":81,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2Fii4%3D","line":78,"in_reply_to":"AAAAP3%2F%2Fiu4%3D","updated":"2013-07-16 20:09:51.000000000","message":"No.  This is more a case of misusing exceptions.  If the exception is thrown, the extension does not have a migrate repo, and we should just carry on.","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c1a8f29ad1b5b26fd1a932756d7c3242beeab352","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":81,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"},{"line_number":82,"context_line":"                pass"},{"line_number":83,"context_line":"            print \"running db_sync on %s\" % package_name"},{"line_number":84,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAQn%2F%2FmSQ%3D","line":81,"updated":"2013-07-26 20:25:45.000000000","message":"why are we ignoring this error?","commit_id":"6c73c4498ec89741d33889332563639418fd2507"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"33a9f6f13ab02a8748264f412c5a60779f95898c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                driver.db_sync(CONF.command.version)"},{"line_number":71,"context_line":"        pkgpath \u003d os.path.dirname(contrib.__file__)"},{"line_number":72,"context_line":"        for name in [name for _, name, _ in pkgutil.iter_modules([pkgpath])]:"},{"line_number":73,"context_line":"            package_name \u003d \"%s.%s.migrate_repo\" % (contrib.__name__, name)"},{"line_number":74,"context_line":"            try:"},{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAQn%2F%2FiNw%3D","line":73,"updated":"2013-07-29 16:47:21.000000000","message":"I think it should be:\n\"%s.%s.sql.migrate_repo\"\nright?","commit_id":"d5c17f66ebdb32227d921c9a9718b6288eb80d2e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except ImportError:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                # Register the repo with the version control API"},{"line_number":81,"context_line":"                # If it already knows about the repo, it will throw"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZ5A%3D","line":78,"updated":"2013-07-31 17:44:21.000000000","message":"suggest add a comment here why this exception can be ignored... \"# This extension doesn\u0027t provide migrations\"","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":76,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":77,"context_line":"            except ImportError:"},{"line_number":78,"context_line":"                continue"},{"line_number":79,"context_line":"            try:"},{"line_number":80,"context_line":"                # Register the repo with the version control API"},{"line_number":81,"context_line":"                # If it already knows about the repo, it will throw"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZu8%3D","line":78,"in_reply_to":"AAAAQn%2F%2FZ5A%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":84,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"},{"line_number":85,"context_line":"                pass"},{"line_number":86,"context_line":"            print \"running db_sync on %s\" % package_name"},{"line_number":87,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZ4I%3D","line":86,"updated":"2013-07-31 17:44:21.000000000","message":"capitalize \"Running\"\n\nsuggest use contrib.__name__ here rather than package_name.","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":84,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"},{"line_number":85,"context_line":"                pass"},{"line_number":86,"context_line":"            print \"running db_sync on %s\" % package_name"},{"line_number":87,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZu4%3D","line":86,"in_reply_to":"AAAAQn%2F%2FZ4I%3D","updated":"2013-07-31 18:15:19.000000000","message":"Done","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"752b22b27d8e092596634a5793a05f6ff84a22b4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class DbVersion(BaseApp):"},{"line_number":91,"context_line":"    \"\"\"Print the current migration version of the database.\"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    name \u003d \u0027db_version\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZ3M%3D","line":90,"updated":"2013-07-31 17:44:21.000000000","message":"Can I get the version for an extension?","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f5cd6f9503b181f753b71fa81e2f8c8d0b1d8e4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class DbVersion(BaseApp):"},{"line_number":91,"context_line":"    \"\"\"Print the current migration version of the database.\"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    name \u003d \u0027db_version\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FZwE%3D","line":90,"in_reply_to":"AAAAQn%2F%2FZ3M%3D","updated":"2013-07-31 18:15:19.000000000","message":"I would suggest that as an additional RFE.","commit_id":"792a95ad4f613e7e4859ed93d2cbfba25e50c37b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5f7bdbeea069c52939618de3d175c34d277328bd","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from __future__ import absolute_import"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import grp"},{"line_number":20,"context_line":"from migrate import exceptions"},{"line_number":21,"context_line":"import os"},{"line_number":22,"context_line":"import pkgutil"},{"line_number":23,"context_line":"import pwd"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FSeY%3D","line":20,"updated":"2013-08-02 14:44:02.000000000","message":"migrate is not stdlib","commit_id":"58cbe9c44cf41e59352a976b66832f6cc128ed4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5f7bdbeea069c52939618de3d175c34d277328bd","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                            help\u003d(\u0027Migrate the database up to a specified \u0027"},{"line_number":60,"context_line":"                                  \u0027version. If not provided, db_sync will \u0027"},{"line_number":61,"context_line":"                                  \u0027migrate the database to the latest known \u0027"},{"line_number":62,"context_line":"                                  \u0027version.\u0027))"},{"line_number":63,"context_line":"        return parser"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FSc0%3D","line":62,"updated":"2013-08-02 14:44:02.000000000","message":"so, this argument inexplicably (from an end user\u0027s perspective, anyway) doesn\u0027t apply in any way to extensions ... i don\u0027t really find that intuitive/acceptable","commit_id":"58cbe9c44cf41e59352a976b66832f6cc128ed4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5f7bdbeea069c52939618de3d175c34d277328bd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            if hasattr(driver, \u0027db_sync\u0027):"},{"line_number":70,"context_line":"                driver.db_sync(CONF.command.version)"},{"line_number":71,"context_line":"        pkgpath \u003d os.path.dirname(contrib.__file__)"},{"line_number":72,"context_line":"        for name in [name for _, name, _ in pkgutil.iter_modules([pkgpath])]:"},{"line_number":73,"context_line":"            package_name \u003d \"%s.%s.migrate_repo\" % (contrib.__name__, name)"},{"line_number":74,"context_line":"            try:"},{"line_number":75,"context_line":"                package \u003d importutils.import_module(package_name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FSeE%3D","line":72,"updated":"2013-08-02 14:44:02.000000000","message":"this is overwriting the i18n function _()","commit_id":"58cbe9c44cf41e59352a976b66832f6cc128ed4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5f7bdbeea069c52939618de3d175c34d277328bd","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                migration.db_version_control(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":85,"context_line":"            except exceptions.DatabaseAlreadyControlledError:"},{"line_number":86,"context_line":"                pass"},{"line_number":87,"context_line":"            print \"Running migration for extension %s\" % contrib.__name__"},{"line_number":88,"context_line":"            migration.db_sync(version\u003dNone, repo_path\u003drepo_path)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FSd8%3D","line":87,"updated":"2013-08-02 14:44:02.000000000","message":"remove print statement","commit_id":"58cbe9c44cf41e59352a976b66832f6cc128ed4c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @staticmethod"},{"line_number":71,"context_line":"    def main():"},{"line_number":72,"context_line":"        version \u003d CONF.command.version"},{"line_number":73,"context_line":"        extension \u003d CONF.command.extension"},{"line_number":74,"context_line":"        if not extension:"},{"line_number":75,"context_line":"            migration.db_sync(version\u003dversion)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLRo%3D","line":72,"updated":"2013-08-05 22:43:09.000000000","message":"prior to this change, if all the backends were configured for non-db and I ran db_sync, it would just do nothing because none of the backends implement db_sync(). Now it\u0027s going to create the tables even if no backend is SQL. Is this change in behavior intentional? If so, mention it in the commit message.","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        version \u003d CONF.command.version"},{"line_number":73,"context_line":"        extension \u003d CONF.command.extension"},{"line_number":74,"context_line":"        if not extension:"},{"line_number":75,"context_line":"            migration.db_sync(version\u003dversion)"},{"line_number":76,"context_line":"        else:"},{"line_number":77,"context_line":"            package_name \u003d \"%s.%s.migrate_repo\" % (contrib.__name__, extension)"},{"line_number":78,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLTQ%3D","line":75,"updated":"2013-08-05 22:43:09.000000000","message":"looks like the different driver.db_syncs aren\u0027t used anymore, do you plan to remove these functions?","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"20fcb86feb614f9623e2111f8c65cf48f80c0202","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                package \u003d importutils.import_module(package_name)"},{"line_number":80,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":81,"context_line":"            except ImportError:"},{"line_number":82,"context_line":"                print \"This extension does not provide migrations.\""},{"line_number":83,"context_line":"                exit(1)"},{"line_number":84,"context_line":"            try:"},{"line_number":85,"context_line":"                # Register the repo with the version control API"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLbE%3D","line":82,"updated":"2013-08-05 21:55:54.000000000","message":"How come this does not use internationalization? Is this not a user facing string?","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":81,"context_line":"            except ImportError:"},{"line_number":82,"context_line":"                print \"This extension does not provide migrations.\""},{"line_number":83,"context_line":"                exit(1)"},{"line_number":84,"context_line":"            try:"},{"line_number":85,"context_line":"                # Register the repo with the version control API"},{"line_number":86,"context_line":"                # If it already knows about the repo, it will throw"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLTw%3D","line":83,"updated":"2013-08-05 22:43:09.000000000","message":"This doesn\u0027t seem like an error to me... seems like it \"worked\"\n\nI think it would be an error if the extension didn\u0027t exist.","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"20fcb86feb614f9623e2111f8c65cf48f80c0202","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                repo_path \u003d os.path.abspath(os.path.dirname(package.__file__))"},{"line_number":116,"context_line":"                print(migration.db_version(repo_path))"},{"line_number":117,"context_line":"            except ImportError:"},{"line_number":118,"context_line":"                print \"This extension does not provide migrations.\""},{"line_number":119,"context_line":"                exit(1)"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            print(migration.db_version())"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLbM%3D","line":118,"updated":"2013-08-05 21:55:54.000000000","message":"How come this does not use internationalization? Is this not a user facing string?","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"}],"keystone/common/sql/migration.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b8b8134f36ab7d691a3787cf2d6ad18eecd18327","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return version"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def find_migrate_repo(package):"},{"line_number":81,"context_line":"    \"\"\"Get the path for the migrate repository.\"\"\""},{"line_number":82,"context_line":"    path \u003d os.path.join(os.path.abspath(os.path.dirname(package.__file__)),"},{"line_number":83,"context_line":"                        \u0027migrate_repo\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAP3%2F%2Fmcw%3D","line":80,"updated":"2013-07-16 00:15:29.000000000","message":"Wouldn\u0027t this make more sense to make the same function with package being an optional kwarg, default set to \"None\".  if package is None just return __file__ instead of package.__file__ ? allowing _find_migrate_repo() and find_migrate_repo() to be the same.\n\nThis just feels a bit like it violates DRY.  if it\u0027s supposed to be a non-private module version, perhaps just call the private one directly with the right arguments?","commit_id":"9dfc6c4a4ec2e3fe38c2b2028a5a8d3ce3c47823"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"469f8c51ab7594163249dddb6d383ea36740253a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return version"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def find_migrate_repo(package):"},{"line_number":81,"context_line":"    \"\"\"Get the path for the migrate repository.\"\"\""},{"line_number":82,"context_line":"    path \u003d os.path.join(os.path.abspath(os.path.dirname(package.__file__)),"},{"line_number":83,"context_line":"                        \u0027migrate_repo\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAP3%2F%2FmV8%3D","line":80,"in_reply_to":"AAAAP3%2F%2Fmcw%3D","updated":"2013-07-16 01:09:29.000000000","message":"good idea.  I\u0027ll do that","commit_id":"9dfc6c4a4ec2e3fe38c2b2028a5a8d3ce3c47823"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdf1b5c65bc09331aced69509a91d090779259f1","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return version"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def find_migrate_repo(package\u003dNone):"},{"line_number":81,"context_line":"    \"\"\"Get the path for the migrate repository.\"\"\""},{"line_number":82,"context_line":"    if package is None:"},{"line_number":83,"context_line":"        file \u003d __file__"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2Fiwk%3D","line":80,"updated":"2013-07-16 19:36:40.000000000","message":"so here, from the old implementation we now have a public method that is implemented from a private method (def _find_migrate_repo())? In this case if we wanted to have a private implementation wouldn\u0027t we be using the public method as a conduit to the private method where the logic is?","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdf1b5c65bc09331aced69509a91d090779259f1","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def find_migrate_repo(package\u003dNone):"},{"line_number":81,"context_line":"    \"\"\"Get the path for the migrate repository.\"\"\""},{"line_number":82,"context_line":"    if package is None:"},{"line_number":83,"context_line":"        file \u003d __file__"},{"line_number":84,"context_line":"    else:"},{"line_number":85,"context_line":"        file \u003d package.__file__"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2Fivs%3D","line":82,"updated":"2013-07-16 19:36:40.000000000","message":"Under this implementation I don\u0027t *think* we would need the if check here would we? Since in _find_migrate_repo we don\u0027t ever pass in anything as package that carries over to this method?","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdf1b5c65bc09331aced69509a91d090779259f1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    path \u003d os.path.join(os.path.abspath(os.path.dirname(file)),"},{"line_number":87,"context_line":"                        \u0027migrate_repo\u0027)"},{"line_number":88,"context_line":"    assert os.path.exists(path)"},{"line_number":89,"context_line":"    return path"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def _find_migrate_repo():"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2FiwQ%3D","line":89,"updated":"2013-07-16 19:36:40.000000000","message":"I guess I would have expected the logic from line 82 - 89 to be implemented in the private method and this is where we would make that call.","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5ef1193ee6834840360e688e781fe73df5ba8a96","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    return path"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def _find_migrate_repo():"},{"line_number":93,"context_line":"    return find_migrate_repo()"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2Fii0%3D","line":92,"updated":"2013-07-16 20:09:51.000000000","message":"Got rid of the internal function, put it all in the external.","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdf1b5c65bc09331aced69509a91d090779259f1","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def _find_migrate_repo():"},{"line_number":93,"context_line":"    return find_migrate_repo()"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2FivU%3D","line":93,"updated":"2013-07-16 19:36:40.000000000","message":"... and here is where we would perform the logic from def find_migrate_repo?","commit_id":"e6532ff1dba657cea9cfdf14b5538aaedf3b4955"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"555693bd1472fba1beb50a2f1f4067f0d36051e6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sys.exit(\u0027python-migrate is not installed. Exiting.\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def migrate_repository(version, current_version, repo_path):"},{"line_number":43,"context_line":"    if version is None or version \u003e current_version:"},{"line_number":44,"context_line":"        result \u003d versioning_api.upgrade(CONF.sql.connection,"},{"line_number":45,"context_line":"                                        repo_path, version)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FsgU%3D","line":42,"updated":"2013-07-24 22:31:12.000000000","message":"Since version can be None, suggest use version\u003dNone","commit_id":"ecde589ba35641a97b3b85d63d28ac919e62e373"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"555693bd1472fba1beb50a2f1f4067f0d36051e6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            raise Exception(_(\u0027version should be an integer\u0027))"},{"line_number":58,"context_line":"    if repo_path is None:"},{"line_number":59,"context_line":"        repo_path \u003d find_migrate_repo()"},{"line_number":60,"context_line":"    current_version \u003d db_version(repo_path)"},{"line_number":61,"context_line":"    return migrate_repository(version, current_version, repo_path)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FsfM%3D","line":60,"updated":"2013-07-24 22:31:12.000000000","message":"use repo_path\u003drepo_path here since it\u0027s a keyword argument.","commit_id":"ecde589ba35641a97b3b85d63d28ac919e62e373"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"882c0b2f4e5858a3799f699d2bf221f3ef12307d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                                  autocommit\u003dFalse)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        self.initialize_sql()"},{"line_number":74,"context_line":"        self.repo_path \u003d migration.find_migrate_repo()"},{"line_number":75,"context_line":"        self.schema \u003d versioning_api.ControlledSchema.create("},{"line_number":76,"context_line":"            self.engine,"},{"line_number":77,"context_line":"            self.repo_path, 0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAQn%2F%2FZVk%3D","line":74,"updated":"2013-07-31 20:13:52.000000000","message":"I would\u0027ve expected more tests on the contrib migration.","commit_id":"1c5de6d34f84ebc8fa992d3fdce23ed447eb6af3"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"20fcb86feb614f9623e2111f8c65cf48f80c0202","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                         test.testsdir(\u0027test_overrides.conf\u0027),"},{"line_number":55,"context_line":"                         test.testsdir(\u0027backend_sql.conf\u0027)]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    #override this to sepcify the complete list of configuration files"},{"line_number":58,"context_line":"    def config_files(self):"},{"line_number":59,"context_line":"        return self._config_file_list"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLao%3D","line":57,"updated":"2013-08-05 21:55:54.000000000","message":"since you are touching this file can you fix the typo on this line as well?","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a66308da8a574f5f8e5921e9827043c305302d1","unresolved":false,"context_lines":[{"line_number":144,"context_line":"class SqlUpgradeTests(SqlMigrateBase):"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def repo_package(self):"},{"line_number":147,"context_line":"        return None"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_blank_db_to_start(self):"},{"line_number":150,"context_line":"        self.assertTableDoesNotExist(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2FLR4%3D","line":147,"updated":"2013-08-05 22:43:09.000000000","message":"suggest move this function up to SqlMigrateBase as the default implementation.","commit_id":"c9cd07220c1876f2ae7d1f09f53b42d7d4b720f5"}]}
