)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"cefdbd0d56eac3f89c1cf8c8ddccd85a3354bd92","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Angus Lees \u003cgus@inodes.org\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-07-15 11:18:36 +1000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow tox tests with complex OS_TEST_DBAPI_CONNECTION URLs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In particular, this allows OS_TEST_DBAPI_ADMIN_CONNECTION URLs with"},{"line_number":10,"context_line":"alternate drivers like mysql+mysqlconnector://... to survive through"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"baada198_0a25a409","line":7,"updated":"2014-07-17 05:12:32.000000000","message":"As I mentioned in a comment to another your commit, I\u0027m not sure, if we are going to implement the same functionality in oslo.db. At the same time, this particular change is still useful, as it makes provision.py DB API driver agnostic.","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"}],"oslo/db/sqlalchemy/provision.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0efe6c0769cf735d8f38ecb1e79e94fd30f16a57","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    else:"},{"line_number":77,"context_line":"        raise ValueError(\u0027Unsupported RDBMS %s\u0027 % driver)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    new_url \u003d copy.copy(engine.url)"},{"line_number":80,"context_line":"    new_url.database \u003d database"},{"line_number":81,"context_line":"    return str(new_url)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_6a2cf502","line":79,"updated":"2014-07-13 23:52:56.000000000","message":"hm are you sure that it\u0027s enough to copy here, and not deepcopy?","commit_id":"7f00c43db98e089fccaad082ce86b10886f5af42"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"9406a8f751399ded4ba71541d33f7deb792a8220","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    else:"},{"line_number":77,"context_line":"        raise ValueError(\u0027Unsupported RDBMS %s\u0027 % driver)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    new_url \u003d copy.copy(engine.url)"},{"line_number":80,"context_line":"    new_url.database \u003d database"},{"line_number":81,"context_line":"    return str(new_url)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_8a9b0917","line":79,"in_reply_to":"baada198_2a4bddb1","updated":"2014-07-14 00:16:42.000000000","message":"ok, removing my -1","commit_id":"7f00c43db98e089fccaad082ce86b10886f5af42"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"e1b3cb0a7af9f86dd33562d9b3a96228218d42e2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    else:"},{"line_number":77,"context_line":"        raise ValueError(\u0027Unsupported RDBMS %s\u0027 % driver)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    new_url \u003d copy.copy(engine.url)"},{"line_number":80,"context_line":"    new_url.database \u003d database"},{"line_number":81,"context_line":"    return str(new_url)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_2a4bddb1","line":79,"in_reply_to":"baada198_6a2cf502","updated":"2014-07-14 00:08:49.000000000","message":"I read the relevant url code when making this change, and yes a shallow copy is sufficient.\n\nI agree that in some hypothetical future, a shallow copy might not be sufficient - so I\u0027m happy to change this to a deepcopy if you\u0027d like.  On the other hand, a deepcopy might also go crazy in a hypothetical future that makes url objects refer to some enormous shared structure.\n\nSince I\u0027m only changing a single member, invoking __str__ and then immediately discarding the temporary copy, I felt a shallow copy was the most efficient with the current implementation, and the safest in the future.  I gather your -1 indicates you would have preferred a deepcopy, so I\u0027m interested to hear your reasoning so I can make a better judgement next time.","commit_id":"7f00c43db98e089fccaad082ce86b10886f5af42"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"cefdbd0d56eac3f89c1cf8c8ddccd85a3354bd92","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def create_database(engine):"},{"line_number":61,"context_line":"    \"\"\"Provide temporary user and database for each particular test.\"\"\""},{"line_number":62,"context_line":"    driver \u003d engine.name"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    database \u003d \u0027\u0027.join(random.choice(string.ascii_lowercase)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ea007068","line":61,"updated":"2014-07-17 05:12:32.000000000","message":"nit: we must have missed this during one of the previous changes of this function, but create_database() no longer creates a temporary user","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a2cbc0b488761546077c35853d84b2fa438d87b","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def create_database(engine):"},{"line_number":61,"context_line":"    \"\"\"Provide temporary user and database for each particular test.\"\"\""},{"line_number":62,"context_line":"    driver \u003d engine.name"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    database \u003d \u0027\u0027.join(random.choice(string.ascii_lowercase)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_6b199421","line":61,"in_reply_to":"baada198_ea007068","updated":"2014-07-18 06:01:09.000000000","message":"Yep - I\u0027ve cleaned up these comments in the next revision.","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"cefdbd0d56eac3f89c1cf8c8ddccd85a3354bd92","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Provide temporary user and database for each particular test.\"\"\""},{"line_number":62,"context_line":"    driver \u003d engine.name"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    database \u003d \u0027\u0027.join(random.choice(string.ascii_lowercase)"},{"line_number":65,"context_line":"                       for i in moves.range(10))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    sqls \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ca59ec8f","line":64,"updated":"2014-07-17 05:12:32.000000000","message":"I was going to yell these are unrelated changes, but as long as the code looks better I\u0027m cool with that, thanks! :P","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a2cbc0b488761546077c35853d84b2fa438d87b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Provide temporary user and database for each particular test.\"\"\""},{"line_number":62,"context_line":"    driver \u003d engine.name"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    database \u003d \u0027\u0027.join(random.choice(string.ascii_lowercase)"},{"line_number":65,"context_line":"                       for i in moves.range(10))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    sqls \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_4b8f702e","line":64,"in_reply_to":"baada198_ca59ec8f","updated":"2014-07-18 06:01:09.000000000","message":"Oh, I hadn\u0027t intended any unrelated changes - I\u0027m sorry it looks that way.\n\nBecause I\u0027m copying the incoming URL object below, I no longer needed to keep a separate copy of user+passwd.  Once I removed those, I was left with a single \u0027database\u0027 entry in the dict.  Then it made sense just to collapse the dict to a regular scalar and lots of the below disappeared.","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"cefdbd0d56eac3f89c1cf8c8ddccd85a3354bd92","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    else:"},{"line_number":77,"context_line":"        raise ValueError(\u0027Unsupported RDBMS %s\u0027 % driver)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    new_url \u003d copy.copy(engine.url)"},{"line_number":80,"context_line":"    new_url.database \u003d database"},{"line_number":81,"context_line":"    return str(new_url)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_4ae4fcab","line":79,"updated":"2014-07-17 05:12:32.000000000","message":"\u003cparanoid mode\u003e\n\nthis will create a shallow copy of a URL instance, which means that dicts like new_url.query will be shared. Not sure, if we actually change them somewhere, but we can always go for deepcopy() here.\n\n\u003c/paranoid mode\u003e","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a2cbc0b488761546077c35853d84b2fa438d87b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    else:"},{"line_number":77,"context_line":"        raise ValueError(\u0027Unsupported RDBMS %s\u0027 % driver)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    new_url \u003d copy.copy(engine.url)"},{"line_number":80,"context_line":"    new_url.database \u003d database"},{"line_number":81,"context_line":"    return str(new_url)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_6b48b4cc","line":79,"in_reply_to":"baada198_4ae4fcab","updated":"2014-07-18 06:01:09.000000000","message":"You\u0027re the second reviewer to feel nervous about the copy :(\n\nI deliberately chose shallow copy because I thought a URL class might legitimately one day have a reference to a HTTP cache object (or similar), and I certainly didn\u0027t want to deepcopy an entire cache.  Given the following trivial use of the temporary copy, shallow seemed the more robust choice.\n\nI just added a comment that hopefully explains that, since it is obviously a red flag for people reading the code.","commit_id":"c6197cf7bae3f8c9f0f6d9a491aa5ae42512c886"}]}
