)]}'
{"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"22909df8b6766e34b661bc660f94875300ff3bba","unresolved":false,"context_lines":[{"line_number":71,"context_line":"import prettytable"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"import six.moves.urllib.parse as urlparse"},{"line_number":74,"context_line":"from sqlalchemy.engine import url as sqla_url"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"from nova.api.ec2 import ec2utils"},{"line_number":77,"context_line":"from nova import availability_zones"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_af674ab7","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":45},"updated":"2017-07-27 14:00:47.000000000","message":"You might want to use this for parsing the sqla URL into parts and re-assembling rather than relying on regex.","commit_id":"a4cc3f4e3a21261ce8cd68f790cc0c588de40852"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"a7fd37c8f83f52080e03deb128b279f740a11cf1","unresolved":false,"context_lines":[{"line_number":71,"context_line":"import prettytable"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"import six.moves.urllib.parse as urlparse"},{"line_number":74,"context_line":"from sqlalchemy.engine import url as sqla_url"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"from nova.api.ec2 import ec2utils"},{"line_number":77,"context_line":"from nova import availability_zones"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_061cf8be","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":45},"in_reply_to":"ff346bd7_af674ab7","updated":"2017-07-27 17:38:40.000000000","message":"one of the advantages of doing it with urlparse is that you get urlunparse, which lets you rebuild the url pretty robustly.","commit_id":"a4cc3f4e3a21261ce8cd68f790cc0c588de40852"}],"nova/tests/unit/test_nova_manage.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b8ef4afadc3825092dcf58c2c5bae63f74cbc8a3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            manage.mask_passwd_in_url(url1))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # pretty standard kinds of urls that we expect, have different"},{"line_number":54,"context_line":"        # schemes. This ensures none of the parts get lots."},{"line_number":55,"context_line":"        url2 \u003d \"mysql+pymysql://root:pass@127.0.0.1/nova_api?charset\u003dutf8\""},{"line_number":56,"context_line":"        self.assertEqual("},{"line_number":57,"context_line":"            \"mysql+pymysql://root:****@127.0.0.1/nova_api?charset\u003dutf8\","}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_37beecfe","line":54,"range":{"start_line":54,"start_character":54,"end_line":54,"end_character":58},"updated":"2017-07-28 13:16:57.000000000","message":"lost","commit_id":"d326d3b214fcb51336d493e815aefcc0bc988856"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6d28f9b7941243b5be25cdce17f690fe9814db08","unresolved":false,"context_lines":[{"line_number":1136,"context_line":"        self.assertEqual(\u0027none:///\u0027, cell_mapping.transport_url)"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027fake://netloc/nova_cell0\u0027,"},{"line_number":1138,"context_line":"                         cell_mapping.database_connection)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"    @ddt.data(\u0027mysql+pymysql://nova:abcd0123:AB@controller/%s\u0027,"},{"line_number":1141,"context_line":"              \u0027mysql+pymysql://nova:abcd0123?AB@controller/%s\u0027,"},{"line_number":1142,"context_line":"              \u0027mysql+pymysql://nova:abcd0123@AB@controller/%s\u0027,"},{"line_number":1143,"context_line":"              \u0027mysql+pymysql://nova:abcd0123/AB@controller/%s\u0027,"},{"line_number":1144,"context_line":"              \u0027mysql+pymysql://test:abcd0123/AB@controller/%s?charset\u003dutf8\u0027)"},{"line_number":1145,"context_line":"    def test_map_cell0_default_database_special_characters(self,"},{"line_number":1146,"context_line":"                                                           connection):"},{"line_number":1147,"context_line":"        \"\"\"Tests that a URL with special characters, like in the credentials,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df3967d1_3b1b1e1c","line":1144,"range":{"start_line":1139,"start_character":0,"end_line":1144,"end_character":76},"updated":"2017-07-31 16:00:15.000000000","message":"We should really test with all of these, and also one that has TLS stuff in it like bug 1706118.","commit_id":"d326d3b214fcb51336d493e815aefcc0bc988856"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"e447cd5c496968e3d84c97da2e6f1a9097da2144","unresolved":false,"context_lines":[{"line_number":1136,"context_line":"        self.assertEqual(\u0027none:///\u0027, cell_mapping.transport_url)"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027fake://netloc/nova_cell0\u0027,"},{"line_number":1138,"context_line":"                         cell_mapping.database_connection)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"    @ddt.data(\u0027mysql+pymysql://nova:abcd0123:AB@controller/%s\u0027,"},{"line_number":1141,"context_line":"              \u0027mysql+pymysql://nova:abcd0123?AB@controller/%s\u0027,"},{"line_number":1142,"context_line":"              \u0027mysql+pymysql://nova:abcd0123@AB@controller/%s\u0027,"},{"line_number":1143,"context_line":"              \u0027mysql+pymysql://nova:abcd0123/AB@controller/%s\u0027,"},{"line_number":1144,"context_line":"              \u0027mysql+pymysql://test:abcd0123/AB@controller/%s?charset\u003dutf8\u0027)"},{"line_number":1145,"context_line":"    def test_map_cell0_default_database_special_characters(self,"},{"line_number":1146,"context_line":"                                                           connection):"},{"line_number":1147,"context_line":"        \"\"\"Tests that a URL with special characters, like in the credentials,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df3967d1_55beaa65","line":1144,"range":{"start_line":1139,"start_character":0,"end_line":1144,"end_character":76},"in_reply_to":"df3967d1_3b1b1e1c","updated":"2017-07-31 19:49:04.000000000","message":"Most of these are invalid urls by https://tools.ietf.org/html/rfc3986. The following are reserved characters that can not show up in users or passwords unencoded:\n\n\":\", \"/\", \"?\", \"#\", \"[\", \"]\", \"@\"","commit_id":"d326d3b214fcb51336d493e815aefcc0bc988856"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9c3a6f16bbb8487a02b9b973105893049206d783","unresolved":false,"context_lines":[{"line_number":1136,"context_line":"        self.assertEqual(\u0027none:///\u0027, cell_mapping.transport_url)"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027fake://netloc/nova_cell0\u0027,"},{"line_number":1138,"context_line":"                         cell_mapping.database_connection)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"    @ddt.data(\u0027mysql+pymysql://nova:abcd0123:AB@controller/%s\u0027,"},{"line_number":1141,"context_line":"              \u0027mysql+pymysql://nova:abcd0123?AB@controller/%s\u0027,"},{"line_number":1142,"context_line":"              \u0027mysql+pymysql://nova:abcd0123@AB@controller/%s\u0027,"},{"line_number":1143,"context_line":"              \u0027mysql+pymysql://nova:abcd0123/AB@controller/%s\u0027,"},{"line_number":1144,"context_line":"              \u0027mysql+pymysql://test:abcd0123/AB@controller/%s?charset\u003dutf8\u0027)"},{"line_number":1145,"context_line":"    def test_map_cell0_default_database_special_characters(self,"},{"line_number":1146,"context_line":"                                                           connection):"},{"line_number":1147,"context_line":"        \"\"\"Tests that a URL with special characters, like in the credentials,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df3967d1_9663d71a","line":1144,"range":{"start_line":1139,"start_character":0,"end_line":1144,"end_character":76},"in_reply_to":"df3967d1_55beaa65","updated":"2017-08-01 19:12:09.000000000","message":"OK yeah:\n\nhttps://tools.ietf.org/html/rfc3986#appendix-A\n\nuserinfo      \u003d *( unreserved / pct-encoded / sub-delims / \":\" )\n\nreserved      \u003d gen-delims / sub-delims\n   gen-delims    \u003d \":\" / \"/\" / \"?\" / \"#\" / \"[\" / \"]\" / \"@\"\n   sub-delims    \u003d \"!\" / \"$\" / \"\u0026\" / \"\u0027\" / \"(\" / \")\"\n                 / \"*\" / \"+\" / \",\" / \";\" / \"\u003d\"","commit_id":"d326d3b214fcb51336d493e815aefcc0bc988856"}]}
