)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":12,"context_line":"header in PUT request, using copy is more convenient especially when"},{"line_number":13,"context_line":"using copy for updating object metadata non-destructively."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I1338ac411f418f4adb3d06753d044a484a7f32a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1ac06dbe_281168ad","line":15,"updated":"2016-08-19 18:12:10.000000000","message":"Probably should also add a\n\n Closes-Bug: 1474939","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"}],"doc/manpages/swift.1":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"\\fBcopy\\fR [\\fIcommand-options\\fR] \\fIcontainer\\fR \\fIobject\\fR"},{"line_number":83,"context_line":".RS 4"},{"line_number":84,"context_line":"Copies object to new destination or adds user metadata to object depending"},{"line_number":85,"context_line":"on the args given. The \\-\\-destination option sets destination in the form"},{"line_number":86,"context_line":"/container/object. If not set, object will be copied on self which is useful"},{"line_number":87,"context_line":"for adding metadata. The \\-M or \\-\\-fresh-metadata option copies object without"}],"source_content_type":"text/troff","patch_set":2,"id":"9aed3d3a_f24c8978","line":84,"updated":"2016-02-25 21:04:08.000000000","message":"Is it worth pointing out the difference between \"adding metadata to an object\" with copy vs posting (and overwriting whatever was set there before)?\n\nNot sure this is the correct place, but it\u0027s just that reading that very quickly, I think the difference to post would not be entirely obvious.","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"\\fBcopy\\fR [\\fIcommand-options\\fR] \\fIcontainer\\fR \\fIobject\\fR"},{"line_number":83,"context_line":".RS 4"},{"line_number":84,"context_line":"Copies object to new destination or adds user metadata to object depending"},{"line_number":85,"context_line":"on the args given. The \\-\\-destination option sets destination in the form"},{"line_number":86,"context_line":"/container/object. If not set, object will be copied on self which is useful"},{"line_number":87,"context_line":"for adding metadata. The \\-M or \\-\\-fresh-metadata option copies object without"}],"source_content_type":"text/troff","patch_set":2,"id":"5aef4532_c65eaae8","line":84,"in_reply_to":"9aed3d3a_f24c8978","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"\\fBcopy\\fR [\\fIcommand-options\\fR] \\fIcontainer\\fR \\fIobject\\fR"},{"line_number":83,"context_line":".RS 4"},{"line_number":84,"context_line":"Copies object to new destination or adds user metadata to object (current user"},{"line_number":85,"context_line":"metadata will be preserved in contrast with the post command) depending"},{"line_number":86,"context_line":"on the args given. The \\-\\-destination option sets destination in the form"},{"line_number":87,"context_line":"/container/object. If not set, object will be copied on self which is useful"}],"source_content_type":"text/troff","patch_set":14,"id":"3ac371cc_3f194289","line":84,"range":{"start_line":84,"start_character":6,"end_line":84,"end_character":13},"updated":"2016-08-16 21:12:39.000000000","message":"should probably be \u0027an object\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":85,"context_line":"user metadata will be preserved, in contrast with the post command) depending"},{"line_number":86,"context_line":"on the args given. The \\-\\-destination option sets the destination in the form"},{"line_number":87,"context_line":"/container/object. If not set, the object will be copied onto itself which is useful"},{"line_number":88,"context_line":"for adding metadata. The \\-M or \\-\\-fresh-metadata option copies the object without"},{"line_number":89,"context_line":"the existing user metadata. The \\-m or \\-\\-meta option is always allowed and is used"},{"line_number":90,"context_line":"to define the user metadata items to set in the form Name:Value (this option"},{"line_number":91,"context_line":"can be repeated)."}],"source_content_type":"text/troff","patch_set":19,"id":"1ac06dbe_26764b06","line":88,"range":{"start_line":88,"start_character":41,"end_line":88,"end_character":42},"updated":"2016-08-22 23:14:58.000000000","message":"tiniest of nits: this could use a backslash","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":88,"context_line":"for adding metadata. The \\-M or \\-\\-fresh-metadata option copies the object without"},{"line_number":89,"context_line":"the existing user metadata. The \\-m or \\-\\-meta option is always allowed and is used"},{"line_number":90,"context_line":"to define the user metadata items to set in the form Name:Value (this option"},{"line_number":91,"context_line":"can be repeated)."},{"line_number":92,"context_line":"For more details and options see swift copy \\-\\-help."},{"line_number":93,"context_line":".RE"},{"line_number":94,"context_line":""}],"source_content_type":"text/troff","patch_set":19,"id":"1ac06dbe_264dabc4","line":91,"updated":"2016-08-22 23:14:58.000000000","message":"Should we call out -H / --header here?","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"}],"doc/source/apis.rst":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":526,"context_line":"Copy"},{"line_number":527,"context_line":"----"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"Copy can be called against an objects in order to copy object or"},{"line_number":530,"context_line":"update the metadata attached to the given items. Each element of the object list"},{"line_number":531,"context_line":"may be a plain string of the object name, or a ``SwiftCopyObject`` that"},{"line_number":532,"context_line":"allows finer control over the options applied to each of the individual copy"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9aed3d3a_724b592c","line":529,"updated":"2016-02-25 21:04:08.000000000","message":"first sentence is a little funny. How about: Copy can be called to copy an object or update the metadata on the given items","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":526,"context_line":"Copy"},{"line_number":527,"context_line":"----"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"Copy can be called against an objects in order to copy object or"},{"line_number":530,"context_line":"update the metadata attached to the given items. Each element of the object list"},{"line_number":531,"context_line":"may be a plain string of the object name, or a ``SwiftCopyObject`` that"},{"line_number":532,"context_line":"allows finer control over the options applied to each of the individual copy"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5aef4532_e65be6f4","line":529,"in_reply_to":"9aed3d3a_724b592c","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":561,"context_line":"Example"},{"line_number":562,"context_line":"~~~~~~~"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":".. Do we want to hide this section until it is complete?"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"TBD"},{"line_number":567,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9aed3d3a_928d3d7e","line":564,"updated":"2016-02-25 21:04:08.000000000","message":"please provide example","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":561,"context_line":"Example"},{"line_number":562,"context_line":"~~~~~~~"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":".. Do we want to hide this section until it is complete?"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"TBD"},{"line_number":567,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5aef4532_46961a4d","line":564,"in_reply_to":"9aed3d3a_928d3d7e","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"}],"doc/source/service-api.rst":[{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":106,"context_line":"passed to the ``SwiftService`` during initialisation. The options available"},{"line_number":107,"context_line":"in this dictionary are described below, along with their defaults:"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Options"},{"line_number":110,"context_line":"~~~~~~~"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    ``retries``: ``5``"},{"line_number":113,"context_line":"        The number of times that the library should attempt to retry HTTP"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_1ca1efa3","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":7},"updated":"2016-05-09 21:12:33.000000000","message":"I think we need to add details of the \u0027fresh_metadata\u0027 and \u0027destination\u0027 options here.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":107,"context_line":"in this dictionary are described below, along with their defaults:"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Options"},{"line_number":110,"context_line":"~~~~~~~"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    ``retries``: ``5``"},{"line_number":113,"context_line":"        The number of times that the library should attempt to retry HTTP"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_0e832e57","line":110,"in_reply_to":"dab17558_1ca1efa3","updated":"2016-05-26 18:35:57.000000000","message":"Done","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    ``fresh_metadata``: ``None``"},{"line_number":226,"context_line":"        When copying objects, this specifies that the object metadata on the"},{"line_number":227,"context_line":"        source will *not* be appoied to the destination object - the"},{"line_number":228,"context_line":"        destination object will have a new fresh set of metadata that includes"},{"line_number":229,"context_line":"        *only* the metadata specified in the meta option if any at all."},{"line_number":230,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"3ac371cc_9f3b1638","line":227,"range":{"start_line":227,"start_character":29,"end_line":227,"end_character":36},"updated":"2016-08-16 21:12:39.000000000","message":"typo: \u0027applied\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":763,"context_line":"of the individual copy operations (destination, fresh_metadata, options)."},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"Destination should be in format /container/object, if not set, object will be"},{"line_number":766,"context_line":"copied on self. Fresh_metadata sets mode of operation on metadata. If not set,"},{"line_number":767,"context_line":"current object user metadata will be copied/preserved, if set, all current user."},{"line_number":768,"context_line":"metadata will be removed."},{"line_number":769,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"3ac371cc_7fd29ad3","line":766,"range":{"start_line":766,"start_character":7,"end_line":766,"end_character":14},"updated":"2016-08-16 21:12:39.000000000","message":"maybe better as \u0027to itself\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":764,"context_line":""},{"line_number":765,"context_line":"Destination should be in format /container/object, if not set, object will be"},{"line_number":766,"context_line":"copied on self. Fresh_metadata sets mode of operation on metadata. If not set,"},{"line_number":767,"context_line":"current object user metadata will be copied/preserved, if set, all current user."},{"line_number":768,"context_line":"metadata will be removed."},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"Returns an iterator over the results generated for each object copy."}],"source_content_type":"text/x-rst","patch_set":14,"id":"3ac371cc_df8f4eca","line":767,"range":{"start_line":767,"start_character":79,"end_line":767,"end_character":80},"updated":"2016-08-16 21:12:39.000000000","message":"extra full stop here should be removed","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":762,"context_line":"``SwiftCopyObject`` that allows finer control over the options applied to each"},{"line_number":763,"context_line":"of the individual copy operations (destination, fresh_metadata, options)."},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"Destination should be in format /container/object, if not set, the object will be"},{"line_number":766,"context_line":"copied onto itself. Fresh_metadata sets mode of operation on metadata. If not set,"},{"line_number":767,"context_line":"current object user metadata will be copied/preserved, if set, all current user"},{"line_number":768,"context_line":"metadata will be removed."}],"source_content_type":"text/x-rst","patch_set":19,"id":"1ac06dbe_06f86f48","line":765,"range":{"start_line":765,"start_character":49,"end_line":765,"end_character":50},"updated":"2016-08-22 23:14:58.000000000","message":"nit: semicolon instead of comma","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":764,"context_line":""},{"line_number":765,"context_line":"Destination should be in format /container/object, if not set, the object will be"},{"line_number":766,"context_line":"copied onto itself. Fresh_metadata sets mode of operation on metadata. If not set,"},{"line_number":767,"context_line":"current object user metadata will be copied/preserved, if set, all current user"},{"line_number":768,"context_line":"metadata will be removed."},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"Returns an iterator over the results generated for each object copy."}],"source_content_type":"text/x-rst","patch_set":19,"id":"1ac06dbe_664cc39e","line":767,"range":{"start_line":767,"start_character":53,"end_line":767,"end_character":54},"updated":"2016-08-22 23:14:58.000000000","message":"nit: semicolon instead of comma","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":767,"context_line":"current object user metadata will be copied/preserved, if set, all current user"},{"line_number":768,"context_line":"metadata will be removed."},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"Returns an iterator over the results generated for each object copy."},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"When a string is given for the object name, destination and fresh metadata will"},{"line_number":773,"context_line":"default to None and None, which result in adding metadata to existing objects."}],"source_content_type":"text/x-rst","patch_set":19,"id":"1ac06dbe_c67657d6","line":770,"updated":"2016-08-22 23:14:58.000000000","message":"Probably worth calling out that the iterator may include create_container results.","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"}],"examples/copy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"                {\"meta\": [\"foo:bar\"], \"Destination\": \"/cc\"}):"},{"line_number":16,"context_line":"            if i[\"success\"]:"},{"line_number":17,"context_line":"                print("},{"line_number":18,"context_line":"                    \"object %s copied from /%s/%s\" %"},{"line_number":19,"context_line":"                    (i[\"destination\"], i[\"container\"], i[\"object\"])"},{"line_number":20,"context_line":"                )"},{"line_number":21,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_43e8077d","line":18,"updated":"2016-08-19 18:12:10.000000000","message":"This isn\u0027t necessarily a copy result, though, is it? What about the container creation results?","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"885f8d0e6bdf7990e62a88f1b4e209e58affdde2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"                    (i[\"destination\"], i[\"container\"], i[\"object\"])"},{"line_number":20,"context_line":"                )"},{"line_number":21,"context_line":"            else:"},{"line_number":22,"context_line":"                raise i[\"error\"]"},{"line_number":23,"context_line":"    except SwiftError as e:"},{"line_number":24,"context_line":"        logger.error(e.value)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_cd216a4f","line":22,"updated":"2016-08-22 17:01:18.000000000","message":"There won\u0027t necessarily be an error, though, right?","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4eb10a446a4a2a0ce2312b9683e6390178666477","unresolved":false,"context_lines":[{"line_number":19,"context_line":"                    (i[\"destination\"], i[\"container\"], i[\"object\"])"},{"line_number":20,"context_line":"                )"},{"line_number":21,"context_line":"            else:"},{"line_number":22,"context_line":"                raise i[\"error\"]"},{"line_number":23,"context_line":"    except SwiftError as e:"},{"line_number":24,"context_line":"        logger.error(e.value)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_53e074fa","line":22,"in_reply_to":"1ac06dbe_54105fa8","updated":"2016-08-22 17:49:06.000000000","message":"We still need to consider the container creation responses :-)","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6f7c756061ad4c405510920b886d41d7e777de9c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"                    (i[\"destination\"], i[\"container\"], i[\"object\"])"},{"line_number":20,"context_line":"                )"},{"line_number":21,"context_line":"            else:"},{"line_number":22,"context_line":"                raise i[\"error\"]"},{"line_number":23,"context_line":"    except SwiftError as e:"},{"line_number":24,"context_line":"        logger.error(e.value)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_54105fa8","line":22,"in_reply_to":"1ac06dbe_cd216a4f","updated":"2016-08-22 17:24:15.000000000","message":"I need to check, but if it\u0027s not successful there should be an error.","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"}],"swiftclient/client.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"                headers\u003dNone, fresh_metadata\u003dNone, http_conn\u003dNone,"},{"line_number":1266,"context_line":"                response_dict\u003dNone, service_token\u003dNone):"},{"line_number":1267,"context_line":"    \"\"\""},{"line_number":1268,"context_line":"    Copy object metadata"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    :param url: storage URL"},{"line_number":1271,"context_line":"    :param token: auth token; if None, no token will be sent"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_722519c1","line":1268,"updated":"2016-02-25 21:04:08.000000000","message":"Copy object metadata?\nmaybe just: Copy object","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"                headers\u003dNone, fresh_metadata\u003dNone, http_conn\u003dNone,"},{"line_number":1266,"context_line":"                response_dict\u003dNone, service_token\u003dNone):"},{"line_number":1267,"context_line":"    \"\"\""},{"line_number":1268,"context_line":"    Copy object metadata"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    :param url: storage URL"},{"line_number":1271,"context_line":"    :param token: auth token; if None, no token will be sent"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_4673ba80","line":1268,"in_reply_to":"9aed3d3a_722519c1","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"def copy_object(url, token\u003dNone, container\u003dNone, name\u003dNone, destination\u003dNone,"},{"line_number":1283,"context_line":"                headers\u003dNone, fresh_metadata\u003dNone, http_conn\u003dNone,"},{"line_number":1284,"context_line":"                response_dict\u003dNone, service_token\u003dNone):"},{"line_number":1285,"context_line":"    \"\"\""},{"line_number":1286,"context_line":"    Copy object"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_2b9c1b5c","line":1283,"range":{"start_line":1283,"start_character":16,"end_line":1283,"end_character":49},"updated":"2016-04-16 02:49:17.000000000","message":"We\u0027ve got headers, fresh_metadata in the function definition, but fresh_metadata then headers in the docstring. Mind making the order consistent? I don\u0027t really prefer one or the other, but having them match is nice.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"def copy_object(url, token\u003dNone, container\u003dNone, name\u003dNone, destination\u003dNone,"},{"line_number":1283,"context_line":"                headers\u003dNone, fresh_metadata\u003dNone, http_conn\u003dNone,"},{"line_number":1284,"context_line":"                response_dict\u003dNone, service_token\u003dNone):"},{"line_number":1285,"context_line":"    \"\"\""},{"line_number":1286,"context_line":"    Copy object"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_b7e8c0e3","line":1283,"range":{"start_line":1283,"start_character":16,"end_line":1283,"end_character":49},"in_reply_to":"5a18252c_2b9c1b5c","updated":"2016-04-26 07:20:50.000000000","message":"Done","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    headers \u003d dict(headers) if headers else {}"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    if destination:"},{"line_number":1322,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(destination)"},{"line_number":1323,"context_line":"    elif container and name:"},{"line_number":1324,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(\u0027/%s/%s\u0027 % (container, name))"},{"line_number":1325,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_6b129358","line":1322,"range":{"start_line":1322,"start_character":17,"end_line":1322,"end_character":28},"updated":"2016-04-16 02:49:17.000000000","message":"Should we also include Destination-Account as an explicit parameter? Since we\u0027ve got the generic headers dict, users/devs can still use it, but we might want the explicit support.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    headers \u003d dict(headers) if headers else {}"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    if destination:"},{"line_number":1322,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(destination)"},{"line_number":1323,"context_line":"    elif container and name:"},{"line_number":1324,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(\u0027/%s/%s\u0027 % (container, name))"},{"line_number":1325,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_eaae8a2c","line":1322,"range":{"start_line":1322,"start_character":17,"end_line":1322,"end_character":28},"in_reply_to":"5a18252c_6b129358","updated":"2016-04-26 07:20:50.000000000","message":"I could not find Destination-Account header in documentation. Does copy really support copying objects between accounts?","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"    elif container and name:"},{"line_number":1324,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(\u0027/%s/%s\u0027 % (container, name))"},{"line_number":1325,"context_line":"    else:"},{"line_number":1326,"context_line":"        raise TypeError(\"container and name or destination must be set\")"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    if fresh_metadata is not None:"},{"line_number":1329,"context_line":"        # remove potential fresh metadata headers"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_c07c66b7","line":1326,"range":{"start_line":1326,"start_character":25,"end_line":1326,"end_character":43},"updated":"2016-04-16 02:49:17.000000000","message":"Container and name should *always* be set, yeah? COPY doesn\u0027t work against an account or container, does it? I wonder if we should strengthen this assertion.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"    elif container and name:"},{"line_number":1324,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(\u0027/%s/%s\u0027 % (container, name))"},{"line_number":1325,"context_line":"    else:"},{"line_number":1326,"context_line":"        raise TypeError(\"container and name or destination must be set\")"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    if fresh_metadata is not None:"},{"line_number":1329,"context_line":"        # remove potential fresh metadata headers"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_d799fc7a","line":1326,"range":{"start_line":1326,"start_character":25,"end_line":1326,"end_character":43},"in_reply_to":"5a18252c_c07c66b7","updated":"2016-04-26 07:20:50.000000000","message":"Container and name do not need to be set: COPY method accepts full path as source and put object method also can work on object without container and name set.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"        raise TypeError(\"container and name or destination must be set\")"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    if fresh_metadata is not None:"},{"line_number":1329,"context_line":"        # remove potential fresh metadata headers"},{"line_number":1330,"context_line":"        for fresh_hdr in [hdr for hdr in headers.keys()"},{"line_number":1331,"context_line":"                          if hdr.lower() \u003d\u003d \u0027x-fresh-metadata\u0027]:"},{"line_number":1332,"context_line":"            headers.pop(fresh_hdr)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_0b84bf5b","line":1329,"updated":"2016-04-16 02:49:17.000000000","message":"Good call. At some point we really ought to switch to using requests.structures.CaseInsensitiveDict as we\u0027re building headers...","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"        for fresh_hdr in [hdr for hdr in headers.keys()"},{"line_number":1331,"context_line":"                          if hdr.lower() \u003d\u003d \u0027x-fresh-metadata\u0027]:"},{"line_number":1332,"context_line":"            headers.pop(fresh_hdr)"},{"line_number":1333,"context_line":"        headers[\u0027X-Fresh-Metadata\u0027] \u003d \u0027true\u0027 if fresh_metadata else \u0027false\u0027"},{"line_number":1334,"context_line":"    if token:"},{"line_number":1335,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":1336,"context_line":"    if service_token:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_cbef67e7","line":1333,"range":{"start_line":1333,"start_character":39,"end_line":1333,"end_character":75},"updated":"2016-04-16 02:49:17.000000000","message":"str(bool(fresh_metadata)), maybe? Up to you.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"        for fresh_hdr in [hdr for hdr in headers.keys()"},{"line_number":1331,"context_line":"                          if hdr.lower() \u003d\u003d \u0027x-fresh-metadata\u0027]:"},{"line_number":1332,"context_line":"            headers.pop(fresh_hdr)"},{"line_number":1333,"context_line":"        headers[\u0027X-Fresh-Metadata\u0027] \u003d \u0027true\u0027 if fresh_metadata else \u0027false\u0027"},{"line_number":1334,"context_line":"    if token:"},{"line_number":1335,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":1336,"context_line":"    if service_token:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_576facfb","line":1333,"range":{"start_line":1333,"start_character":39,"end_line":1333,"end_character":75},"in_reply_to":"5a18252c_cbef67e7","updated":"2016-04-26 07:20:50.000000000","message":"str(bool(fresh_metadata) will output \u0027True\u0027 and \u0027False\u0027, I am staying with current statement","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"    store_response(resp, response_dict)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"    if resp.status \u003c 200 or resp.status \u003e\u003d 300:"},{"line_number":1348,"context_line":"        raise ClientException(\u0027Object COPY failed\u0027, http_scheme\u003dparsed.scheme,"},{"line_number":1349,"context_line":"                              http_host\u003dconn.host, http_path\u003dpath,"},{"line_number":1350,"context_line":"                              http_status\u003dresp.status, http_reason\u003dresp.reason,"},{"line_number":1351,"context_line":"                              http_response_content\u003dbody)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_0b2e7f42","line":1348,"range":{"start_line":1348,"start_character":14,"end_line":1348,"end_character":29},"updated":"2016-04-16 02:49:17.000000000","message":"nit: try the ClientException.from_response factory; I think you may like it better.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"    store_response(resp, response_dict)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"    if resp.status \u003c 200 or resp.status \u003e\u003d 300:"},{"line_number":1348,"context_line":"        raise ClientException(\u0027Object COPY failed\u0027, http_scheme\u003dparsed.scheme,"},{"line_number":1349,"context_line":"                              http_host\u003dconn.host, http_path\u003dpath,"},{"line_number":1350,"context_line":"                              http_status\u003dresp.status, http_reason\u003dresp.reason,"},{"line_number":1351,"context_line":"                              http_response_content\u003dbody)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_b778c0c5","line":1348,"range":{"start_line":1348,"start_character":14,"end_line":1348,"end_character":29},"in_reply_to":"5a18252c_0b2e7f42","updated":"2016-04-26 07:20:50.000000000","message":"thanks, its much better","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"    if name:"},{"line_number":1317,"context_line":"        path \u003d \u0027%s/%s\u0027 % (path.rstrip(\u0027/\u0027), quote(name))"},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"    headers \u003d dict(headers) if headers else {}"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    if destination:"},{"line_number":1322,"context_line":"        headers[\u0027Destination\u0027] \u003d quote(destination)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_0332eaa6","line":1319,"updated":"2016-05-26 18:35:57.000000000","message":"oh, just always make sure it\u0027s a requests.structures.CaseInsensitiveDict here and then later you can just:\n\n    headers.pop(\u0027x-fresh-metadata\u0027)","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    if fresh_metadata is not None:"},{"line_number":1329,"context_line":"        # remove potential fresh metadata headers"},{"line_number":1330,"context_line":"        for fresh_hdr in [hdr for hdr in headers.keys()"},{"line_number":1331,"context_line":"                          if hdr.lower() \u003d\u003d \u0027x-fresh-metadata\u0027]:"},{"line_number":1332,"context_line":"            headers.pop(fresh_hdr)"},{"line_number":1333,"context_line":"        headers[\u0027X-Fresh-Metadata\u0027] \u003d \u0027true\u0027 if fresh_metadata else \u0027false\u0027"},{"line_number":1334,"context_line":"    if token:"},{"line_number":1335,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d token"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_06d70324","line":1332,"range":{"start_line":1330,"start_character":8,"end_line":1332,"end_character":34},"updated":"2016-05-09 21:12:33.000000000","message":"Perhaps this would be cleaner as follows:\n\n    headers \u003d {k: v for (k, v) in headers.items() if k.lower() !\u003d \u0027x-fresh-metadata\u0027}","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    Copy object"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    :param url: storage URL"},{"line_number":1329,"context_line":"    :param token: auth token; if None, no token will be sent"},{"line_number":1330,"context_line":"    :param container: container name that the source object is in; if None, the"},{"line_number":1331,"context_line":"                      container name is expected to be part of the url"},{"line_number":1332,"context_line":"    :param name: source object name; if None, the object name is expected"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_8325dfc3","line":1329,"range":{"start_line":1329,"start_character":28,"end_line":1329,"end_character":60},"updated":"2016-08-19 18:12:10.000000000","message":"This seems non-standard for our API.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f854f7f5b2f9dd6f44fe36a7db96e19eb2eafc12","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    Copy object"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    :param url: storage URL"},{"line_number":1329,"context_line":"    :param token: auth token; if None, no token will be sent"},{"line_number":1330,"context_line":"    :param container: container name that the source object is in; if None, the"},{"line_number":1331,"context_line":"                      container name is expected to be part of the url"},{"line_number":1332,"context_line":"    :param name: source object name; if None, the object name is expected"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_4d89fa25","line":1329,"range":{"start_line":1329,"start_character":28,"end_line":1329,"end_character":60},"in_reply_to":"1ac06dbe_0378a18e","updated":"2016-08-22 17:00:03.000000000","message":"Ah, got it. I was looking off of post_object, since that was just above.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"3ebeecb552ce0e5d7c438d49e24188d99cdd06ef","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    Copy object"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    :param url: storage URL"},{"line_number":1329,"context_line":"    :param token: auth token; if None, no token will be sent"},{"line_number":1330,"context_line":"    :param container: container name that the source object is in; if None, the"},{"line_number":1331,"context_line":"                      container name is expected to be part of the url"},{"line_number":1332,"context_line":"    :param name: source object name; if None, the object name is expected"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_0378a18e","line":1329,"range":{"start_line":1329,"start_character":28,"end_line":1329,"end_character":60},"in_reply_to":"1ac06dbe_8325dfc3","updated":"2016-08-21 21:35:54.000000000","message":"It does seem to match put_object and a couple of others (although it does highlight some possible bugs in put_object). I\u0027ll add a follow on patch when we decide what\u0027s \u0027right\u0027.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    :param url: storage URL"},{"line_number":1329,"context_line":"    :param token: auth token; if None, no token will be sent"},{"line_number":1330,"context_line":"    :param container: container name that the source object is in; if None, the"},{"line_number":1331,"context_line":"                      container name is expected to be part of the url"},{"line_number":1332,"context_line":"    :param name: source object name; if None, the object name is expected"},{"line_number":1333,"context_line":"                 to be part of the url"},{"line_number":1334,"context_line":"    :param destination: The container and object name of the destination object"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_e31c9379","line":1331,"range":{"start_line":1330,"start_character":65,"end_line":1331,"end_character":70},"updated":"2016-08-19 18:12:10.000000000","message":"...and this.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":1329,"context_line":"    :param token: auth token; if None, no token will be sent"},{"line_number":1330,"context_line":"    :param container: container name that the source object is in; if None, the"},{"line_number":1331,"context_line":"                      container name is expected to be part of the url"},{"line_number":1332,"context_line":"    :param name: source object name; if None, the object name is expected"},{"line_number":1333,"context_line":"                 to be part of the url"},{"line_number":1334,"context_line":"    :param destination: The container and object name of the destination object"},{"line_number":1335,"context_line":"                        in the form of /container/object; if None, will be set"},{"line_number":1336,"context_line":"                        same as the source. If destination is not set,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_4312c763","line":1333,"range":{"start_line":1332,"start_character":35,"end_line":1333,"end_character":38},"updated":"2016-08-19 18:12:10.000000000","message":"...and this.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"885f8d0e6bdf7990e62a88f1b4e209e58affdde2","unresolved":false,"context_lines":[{"line_number":1350,"context_line":"        parsed, conn \u003d http_connection(url)"},{"line_number":1351,"context_line":""},{"line_number":1352,"context_line":"    path \u003d parsed.path"},{"line_number":1353,"context_line":"    # path should be /version/account/container/object"},{"line_number":1354,"context_line":"    path_components \u003d path.lstrip(\u0027/\u0027).split(\u0027/\u0027, 3)"},{"line_number":1355,"context_line":"    if container is not None:"},{"line_number":1356,"context_line":"        if len(path_components) \u003e\u003d 3:"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_000509bb","line":1353,"range":{"start_line":1353,"start_character":6,"end_line":1353,"end_character":54},"updated":"2016-08-22 17:01:18.000000000","message":"Weeellll...\n\nIt\u0027s kinda tricky to make assumptions about the storage url. We can do it in middleware because we\u0027re right on top of the storage layer, but as a client we only know some auth system said \"store stuff here\". There may be a reverse proxy between us and Swift proper that\u0027s rewriting URLs. We *can* get away with it for put_object, but only because there\u0027s just the one resource involved.\n\nI wonder if it would be better to just require that container and name be provided, and that url be the account url.\n\n(I almost wouldn\u0027t have thought of these problems, but I was doing some packaging recently and noticed that https://pypi.python.org/packages/ gets proxied to some AWS bucket, so requests like https://pypi.python.org/packages/?prefix\u003dsource/p/python-swiftclient/ are perfectly fine!)","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6f7c756061ad4c405510920b886d41d7e777de9c","unresolved":false,"context_lines":[{"line_number":1350,"context_line":"        parsed, conn \u003d http_connection(url)"},{"line_number":1351,"context_line":""},{"line_number":1352,"context_line":"    path \u003d parsed.path"},{"line_number":1353,"context_line":"    # path should be /version/account/container/object"},{"line_number":1354,"context_line":"    path_components \u003d path.lstrip(\u0027/\u0027).split(\u0027/\u0027, 3)"},{"line_number":1355,"context_line":"    if container is not None:"},{"line_number":1356,"context_line":"        if len(path_components) \u003e\u003d 3:"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_94fe5736","line":1353,"range":{"start_line":1353,"start_character":6,"end_line":1353,"end_character":54},"in_reply_to":"1ac06dbe_000509bb","updated":"2016-08-22 17:24:15.000000000","message":"That\u0027s a fair point... I did actually make a version that required the container and object params, but I felt like I was making too many changes when other methods used that style.\n\nI\u0027ll make a version that requires the container and object tonight and we can see how we feel about it.","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"}],"swiftclient/service.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":2387,"context_line":""},{"line_number":2388,"context_line":"    # Copy related methods"},{"line_number":2389,"context_line":"    #"},{"line_number":2390,"context_line":"    def copy(self, container, objects, options\u003dNone):"},{"line_number":2391,"context_line":"        \"\"\""},{"line_number":2392,"context_line":"        Copy operations on list of objects"},{"line_number":2393,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_d28ce537","line":2390,"updated":"2016-02-25 21:04:08.000000000","message":"is this source container? if providing the ability to copy multiple objects, why not copy from different containers?","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":2387,"context_line":""},{"line_number":2388,"context_line":"    # Copy related methods"},{"line_number":2389,"context_line":"    #"},{"line_number":2390,"context_line":"    def copy(self, container, objects, options\u003dNone):"},{"line_number":2391,"context_line":"        \"\"\""},{"line_number":2392,"context_line":"        Copy operations on list of objects"},{"line_number":2393,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_26e30e07","line":2390,"in_reply_to":"9aed3d3a_d28ce537","updated":"2016-03-08 13:58:09.000000000","message":"Yes, it is source container. I am limiting source container to only one to have copy call similar to other methods.","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":2391,"context_line":"        \"\"\""},{"line_number":2392,"context_line":"        Copy operations on list of objects"},{"line_number":2393,"context_line":""},{"line_number":2394,"context_line":"        :param container: The container to make the post operation against."},{"line_number":2395,"context_line":"        :param objects: A list of object names (strings) or SwiftCopyObject"},{"line_number":2396,"context_line":"                        instances containing an object name, destination and an"},{"line_number":2397,"context_line":"                        options dict (can be None) to override the options for"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_b2f161d0","line":2394,"updated":"2016-02-25 21:04:08.000000000","message":"s/post/copy","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":2391,"context_line":"        \"\"\""},{"line_number":2392,"context_line":"        Copy operations on list of objects"},{"line_number":2393,"context_line":""},{"line_number":2394,"context_line":"        :param container: The container to make the post operation against."},{"line_number":2395,"context_line":"        :param objects: A list of object names (strings) or SwiftCopyObject"},{"line_number":2396,"context_line":"                        instances containing an object name, destination and an"},{"line_number":2397,"context_line":"                        options dict (can be None) to override the options for"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_66ed16ef","line":2394,"in_reply_to":"9aed3d3a_b2f161d0","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":2409,"context_line":"                        The options dict is described below."},{"line_number":2410,"context_line":"        :param options: A dictionary containing options to override the global"},{"line_number":2411,"context_line":"                        options specified during the service object creation."},{"line_number":2412,"context_line":"                        These options are applied to all post operations"},{"line_number":2413,"context_line":"                        performed by this call, unless overridden on a per"},{"line_number":2414,"context_line":"                        object basis. Possible options are given below::"},{"line_number":2415,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_92909dee","line":2412,"updated":"2016-02-25 21:04:08.000000000","message":"copy","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":2409,"context_line":"                        The options dict is described below."},{"line_number":2410,"context_line":"        :param options: A dictionary containing options to override the global"},{"line_number":2411,"context_line":"                        options specified during the service object creation."},{"line_number":2412,"context_line":"                        These options are applied to all post operations"},{"line_number":2413,"context_line":"                        performed by this call, unless overridden on a per"},{"line_number":2414,"context_line":"                        object basis. Possible options are given below::"},{"line_number":2415,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_e6b766f3","line":2412,"in_reply_to":"9aed3d3a_92909dee","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e6f25f655ce875bf722e4beeabd76a0d862e7bde","unresolved":false,"context_lines":[{"line_number":2445,"context_line":"                if \u0027meta\u0027 in obj_options:"},{"line_number":2446,"context_line":"                    headers.update("},{"line_number":2447,"context_line":"                        split_headers("},{"line_number":2448,"context_line":"                            obj_options[\u0027meta\u0027], \u0027X-Object-Meta\u0027"},{"line_number":2449,"context_line":"                        )"},{"line_number":2450,"context_line":"                    )"},{"line_number":2451,"context_line":"                if \u0027headers\u0027 in obj_options:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_12d64dc5","line":2448,"updated":"2016-02-25 21:04:08.000000000","message":"X-Object-Meta-","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"1a618bd76d7e3ce496df860fc081e6091830eee4","unresolved":false,"context_lines":[{"line_number":2445,"context_line":"                if \u0027meta\u0027 in obj_options:"},{"line_number":2446,"context_line":"                    headers.update("},{"line_number":2447,"context_line":"                        split_headers("},{"line_number":2448,"context_line":"                            obj_options[\u0027meta\u0027], \u0027X-Object-Meta\u0027"},{"line_number":2449,"context_line":"                        )"},{"line_number":2450,"context_line":"                    )"},{"line_number":2451,"context_line":"                if \u0027headers\u0027 in obj_options:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_46cf3a7f","line":2448,"in_reply_to":"9aed3d3a_12d64dc5","updated":"2016-03-08 13:58:09.000000000","message":"Done","commit_id":"a005ab90d6e64a8a03c96ee0d8308da45422059f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":315,"context_line":"    allowing the destination/headers/metadata/fresh_metadata to be specified"},{"line_number":316,"context_line":"    separately for each individual object."},{"line_number":317,"context_line":"    \"\"\""},{"line_number":318,"context_line":"    def __init__(self, object_name, destination\u003dNone, fresh_metadata\u003dNone,"},{"line_number":319,"context_line":"                 options\u003dNone):"},{"line_number":320,"context_line":"        if not isinstance(object_name, string_types) or not object_name:"},{"line_number":321,"context_line":"            raise SwiftError("}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_8b6f2f2a","line":318,"range":{"start_line":318,"start_character":36,"end_line":318,"end_character":73},"updated":"2016-04-16 02:49:17.000000000","message":"These wouldn\u0027t be baked into the options dict?","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":315,"context_line":"    allowing the destination/headers/metadata/fresh_metadata to be specified"},{"line_number":316,"context_line":"    separately for each individual object."},{"line_number":317,"context_line":"    \"\"\""},{"line_number":318,"context_line":"    def __init__(self, object_name, destination\u003dNone, fresh_metadata\u003dNone,"},{"line_number":319,"context_line":"                 options\u003dNone):"},{"line_number":320,"context_line":"        if not isinstance(object_name, string_types) or not object_name:"},{"line_number":321,"context_line":"            raise SwiftError("}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_527e9a6a","line":318,"range":{"start_line":318,"start_character":36,"end_line":318,"end_character":73},"in_reply_to":"5a18252c_8b6f2f2a","updated":"2016-04-26 07:20:50.000000000","message":"I like destination and fresh_metadata being emphasized. But when default destination a fresh_metadata for all objects is added to options, for consistency will be better to have it in options.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":2416,"context_line":""},{"line_number":2417,"context_line":"                            {"},{"line_number":2418,"context_line":"                                \u0027meta\u0027: [],"},{"line_number":2419,"context_line":"                                \u0027header\u0027: [],"},{"line_number":2420,"context_line":"                            }"},{"line_number":2421,"context_line":""},{"line_number":2422,"context_line":"        :returns: A generator returning the results of copy a list of objects."}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_064f966b","line":2419,"updated":"2016-04-16 02:49:17.000000000","message":"Shouldn\u0027t this have destination and fresh_metadata keys?","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":2416,"context_line":""},{"line_number":2417,"context_line":"                            {"},{"line_number":2418,"context_line":"                                \u0027meta\u0027: [],"},{"line_number":2419,"context_line":"                                \u0027header\u0027: [],"},{"line_number":2420,"context_line":"                            }"},{"line_number":2421,"context_line":""},{"line_number":2422,"context_line":"        :returns: A generator returning the results of copy a list of objects."}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_122c2298","line":2419,"in_reply_to":"5a18252c_064f966b","updated":"2016-04-26 07:20:50.000000000","message":"It should, when destination for all objects or destination for one object out of SwiftCopyObject is implemented.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":2437,"context_line":"            for obj in objects"},{"line_number":2438,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2439,"context_line":"        )"},{"line_number":2440,"context_line":"        containers.add(container)"},{"line_number":2441,"context_line":"        policy_header \u003d {}"},{"line_number":2442,"context_line":"        _header \u003d split_headers(options[\"header\"])"},{"line_number":2443,"context_line":"        if POLICY in _header:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_6612ca58","line":2440,"range":{"start_line":2440,"start_character":23,"end_line":2440,"end_character":32},"updated":"2016-04-16 02:49:17.000000000","message":"I\u0027m not sure we want container here. If the container doesn\u0027t exist, then surely none of the objects we\u0027re trying to create exist -- it doesn\u0027t matter whether we create it proactively or not; the operation will fail with a 404.\n\nI think what we really want is to parse the container out of options[\u0027destination\u0027] (assuming it\u0027s set), and add that.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":2437,"context_line":"            for obj in objects"},{"line_number":2438,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2439,"context_line":"        )"},{"line_number":2440,"context_line":"        containers.add(container)"},{"line_number":2441,"context_line":"        policy_header \u003d {}"},{"line_number":2442,"context_line":"        _header \u003d split_headers(options[\"header\"])"},{"line_number":2443,"context_line":"        if POLICY in _header:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_f72cf8ad","line":2440,"range":{"start_line":2440,"start_character":23,"end_line":2440,"end_character":32},"in_reply_to":"5a18252c_6612ca58","updated":"2016-04-26 07:20:50.000000000","message":"you are right, container should not be created.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"142bcb8f7353552fb1b880324e5f61a98e2b33c6","unresolved":false,"context_lines":[{"line_number":2459,"context_line":"        for copy_object in copy_objects:"},{"line_number":2460,"context_line":"            obj \u003d copy_object.object_name"},{"line_number":2461,"context_line":"            obj_options \u003d copy_object.options"},{"line_number":2462,"context_line":"            destination \u003d copy_object.destination"},{"line_number":2463,"context_line":"            fresh_metadata \u003d copy_object.fresh_metadata"},{"line_number":2464,"context_line":"            response_dict \u003d {}"},{"line_number":2465,"context_line":"            headers \u003d split_headers("}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_a644e2b6","line":2462,"range":{"start_line":2462,"start_character":12,"end_line":2462,"end_character":49},"updated":"2016-04-16 02:49:17.000000000","message":"Oh, I see... destination isn\u0027t taken from options. It\u0027s coming from the SwiftCopyObject, which was either created by the developer (so they could set the destination themselves) or _make_copy_objects (where it would have the default of None, i.e. copy to self).\n\nI\u0027m not sure I like it; as a developer, I kinda want to be able to just say:\n\n  service.copy(\u0027container\u0027, [\u0027obj\u0027], {\u0027destination\u0027: \u0027/other_cont/dest\u0027})","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"7251d7fa79cee6151f611670ff4f81c83fe0af83","unresolved":false,"context_lines":[{"line_number":2459,"context_line":"        for copy_object in copy_objects:"},{"line_number":2460,"context_line":"            obj \u003d copy_object.object_name"},{"line_number":2461,"context_line":"            obj_options \u003d copy_object.options"},{"line_number":2462,"context_line":"            destination \u003d copy_object.destination"},{"line_number":2463,"context_line":"            fresh_metadata \u003d copy_object.fresh_metadata"},{"line_number":2464,"context_line":"            response_dict \u003d {}"},{"line_number":2465,"context_line":"            headers \u003d split_headers("}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_9294b28b","line":2462,"range":{"start_line":2462,"start_character":12,"end_line":2462,"end_character":49},"in_reply_to":"5a18252c_a644e2b6","updated":"2016-04-26 07:20:50.000000000","message":"yes, it is good idea, will add it.","commit_id":"33dda22a75172dc26e963adf7d696bac2a2e53f1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":317,"context_line":"    destination and fresh_metadata should be set in options"},{"line_number":318,"context_line":"    \"\"\""},{"line_number":319,"context_line":"    def __init__(self, object_name, options\u003dNone):"},{"line_number":320,"context_line":"        if not isinstance(object_name, string_types) or not object_name:"},{"line_number":321,"context_line":"            raise SwiftError("},{"line_number":322,"context_line":"                \"Object names must be specified as non-empty strings\""},{"line_number":323,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_63e496df","line":320,"updated":"2016-05-26 18:35:57.000000000","message":"I can\u0027t read\n\n    not a or not b\n\nas well as\n\n    not (a and b)\n\nBut I\u0027m pretty sure they\u0027re logical equivalents.  I guess this was just copied from SwiftPostObject tho - so they should probably both be cleaned up together in a follow up.\n\nA doc string for params would probably be nice\n\n    :param object_name: a non-empty string, the name of the object, may contain slashes","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        else:"},{"line_number":325,"context_line":"            self.object_name \u003d object_name"},{"line_number":326,"context_line":"            self.options \u003d options.copy() if options else {}"},{"line_number":327,"context_line":"            self.destination \u003d self.options.pop(\u0027Destination\u0027, None)"},{"line_number":328,"context_line":"            self.fresh_metadata \u003d self.options.pop(\u0027X-Fresh-Metadata\u0027, None)"},{"line_number":329,"context_line":"            if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":330,"context_line":"                # only container set in destination"},{"line_number":331,"context_line":"                self.destination \u003d \"{0}/{1}\".format(self.destination,"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_a6a437a6","line":328,"range":{"start_line":327,"start_character":12,"end_line":328,"end_character":76},"updated":"2016-05-09 21:12:33.000000000","message":"All the other options in service.py are lower case and use python style underscores for names. Maybe \u0027destination\u0027 and \u0027fresh_metadata\u0027 would be better option names?","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        else:"},{"line_number":325,"context_line":"            self.object_name \u003d object_name"},{"line_number":326,"context_line":"            self.options \u003d options.copy() if options else {}"},{"line_number":327,"context_line":"            self.destination \u003d self.options.pop(\u0027Destination\u0027, None)"},{"line_number":328,"context_line":"            self.fresh_metadata \u003d self.options.pop(\u0027X-Fresh-Metadata\u0027, None)"},{"line_number":329,"context_line":"            if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":330,"context_line":"                # only container set in destination"},{"line_number":331,"context_line":"                self.destination \u003d \"{0}/{1}\".format(self.destination,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_753f29b4","line":328,"range":{"start_line":327,"start_character":12,"end_line":328,"end_character":76},"in_reply_to":"dab17558_a6a437a6","updated":"2016-05-26 18:35:57.000000000","message":"e.g.\n\n\u0027header\u0027, \u0027meta\u0027, \u0027dir_marker\u0027","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":2410,"context_line":"                                SwiftCopyObject("},{"line_number":2411,"context_line":"                                    \u0027object_name\u0027,"},{"line_number":2412,"context_line":"                                     options\u003d{"},{"line_number":2413,"context_line":"                                        \u0027Destination\u0027: \u0027/container/object\u0027,"},{"line_number":2414,"context_line":"                                        \u0027X-Fresh-Metadata\u0027: False,"},{"line_number":2415,"context_line":"                                        ..."},{"line_number":2416,"context_line":"                                        }),"},{"line_number":2417,"context_line":"                                ..."}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_869f734f","line":2414,"range":{"start_line":2413,"start_character":40,"end_line":2414,"end_character":66},"updated":"2016-05-09 21:12:33.000000000","message":"See above","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":2436,"context_line":"                            {"},{"line_number":2437,"context_line":"                                \u0027meta\u0027: [],"},{"line_number":2438,"context_line":"                                \u0027header\u0027: [],"},{"line_number":2439,"context_line":"                                \u0027Destination\u0027: \u0027/container/object\u0027,"},{"line_number":2440,"context_line":"                                \u0027X-Fresh-Metadata\u0027: False,"},{"line_number":2441,"context_line":"                            }"},{"line_number":2442,"context_line":""},{"line_number":2443,"context_line":"        :returns: A generator returning the results of copy a list of objects."}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_e6ae3f84","line":2440,"range":{"start_line":2439,"start_character":32,"end_line":2440,"end_character":58},"updated":"2016-05-09 21:12:33.000000000","message":"and again...","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":2437,"context_line":"                                \u0027meta\u0027: [],"},{"line_number":2438,"context_line":"                                \u0027header\u0027: [],"},{"line_number":2439,"context_line":"                                \u0027Destination\u0027: \u0027/container/object\u0027,"},{"line_number":2440,"context_line":"                                \u0027X-Fresh-Metadata\u0027: False,"},{"line_number":2441,"context_line":"                            }"},{"line_number":2442,"context_line":""},{"line_number":2443,"context_line":"        :returns: A generator returning the results of copy a list of objects."}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_355c817c","line":2440,"in_reply_to":"dab17558_e6ae3f84","updated":"2016-05-26 18:35:57.000000000","message":"I think this is the one where it\u0027s move obvious that these stick out like a sore thumb!","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"        # permissions, so we\u0027ll ignore any error. If there\u0027s really a problem,"},{"line_number":2455,"context_line":"        # it\u0027ll surface on the first object COPY."},{"line_number":2456,"context_line":"        containers \u003d set("},{"line_number":2457,"context_line":"            next(p for p in obj.destination.split(\"/\") if p)"},{"line_number":2458,"context_line":"            for obj in objects"},{"line_number":2459,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2460,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_66e88fb5","line":2457,"range":{"start_line":2457,"start_character":12,"end_line":2457,"end_character":60},"updated":"2016-05-09 21:12:33.000000000","message":"We already know that obj.destination is not None and not an empty string here, so can\u0027t we just use\n\n     obj.destination.lstrip().split(\"/\")[0]\n\nhere?","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"        # permissions, so we\u0027ll ignore any error. If there\u0027s really a problem,"},{"line_number":2455,"context_line":"        # it\u0027ll surface on the first object COPY."},{"line_number":2456,"context_line":"        containers \u003d set("},{"line_number":2457,"context_line":"            next(p for p in obj.destination.split(\"/\") if p)"},{"line_number":2458,"context_line":"            for obj in objects"},{"line_number":2459,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2460,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_1861b439","line":2457,"in_reply_to":"dab17558_66e88fb5","updated":"2016-05-26 18:35:57.000000000","message":"I\u0027m not sure the copy objects validate that destination starts with a \"/\"\n\n... scared to change it","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":2456,"context_line":"        containers \u003d set("},{"line_number":2457,"context_line":"            next(p for p in obj.destination.split(\"/\") if p)"},{"line_number":2458,"context_line":"            for obj in objects"},{"line_number":2459,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2460,"context_line":"        )"},{"line_number":2461,"context_line":"        if options.get(\u0027Destination\u0027):"},{"line_number":2462,"context_line":"            destination_split \u003d options[\u0027Destination\u0027].split(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_9ca67f0e","line":2459,"range":{"start_line":2459,"start_character":52,"end_line":2459,"end_character":67},"updated":"2016-05-09 21:12:33.000000000","message":"perhaps this should check\n\n    obj.destination.lstrip()\n\nhere?","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":2456,"context_line":"        containers \u003d set("},{"line_number":2457,"context_line":"            next(p for p in obj.destination.split(\"/\") if p)"},{"line_number":2458,"context_line":"            for obj in objects"},{"line_number":2459,"context_line":"            if isinstance(obj, SwiftCopyObject) and obj.destination"},{"line_number":2460,"context_line":"        )"},{"line_number":2461,"context_line":"        if options.get(\u0027Destination\u0027):"},{"line_number":2462,"context_line":"            destination_split \u003d options[\u0027Destination\u0027].split(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_385c787c","line":2459,"in_reply_to":"dab17558_9ca67f0e","updated":"2016-05-26 18:35:57.000000000","message":"like to prevent it being empty whitespace?  That should be in SwiftCopyObject - it\u0027s not doing *nearly* enough validation - see below.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":2461,"context_line":"        if options.get(\u0027Destination\u0027):"},{"line_number":2462,"context_line":"            destination_split \u003d options[\u0027Destination\u0027].split(\u0027/\u0027)"},{"line_number":2463,"context_line":"            if destination_split[0]:"},{"line_number":2464,"context_line":"                raise SwiftError(\"Destination must be in format /cont[/obj]\")"},{"line_number":2465,"context_line":"            if len(destination_split) \u003e 2 and len(objects) \u003e 1:"},{"line_number":2466,"context_line":"                raise SwiftError(\"Combination of multiple objects and \""},{"line_number":2467,"context_line":"                                 \"destination including object is invalid\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_6b110c52","line":2464,"updated":"2016-05-26 18:35:57.000000000","message":"I think this sort of validation should happen in SwiftCopyObject - if we called _make_copy_objects *first* we could then just iterate over the list and collect obj.dest_container and know that they\u0027ve *all* been validated with the same logic in one place.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":2462,"context_line":"            destination_split \u003d options[\u0027Destination\u0027].split(\u0027/\u0027)"},{"line_number":2463,"context_line":"            if destination_split[0]:"},{"line_number":2464,"context_line":"                raise SwiftError(\"Destination must be in format /cont[/obj]\")"},{"line_number":2465,"context_line":"            if len(destination_split) \u003e 2 and len(objects) \u003e 1:"},{"line_number":2466,"context_line":"                raise SwiftError(\"Combination of multiple objects and \""},{"line_number":2467,"context_line":"                                 \"destination including object is invalid\")"},{"line_number":2468,"context_line":"            containers.add(destination_split[1])"},{"line_number":2469,"context_line":""},{"line_number":2470,"context_line":"        policy_header \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_fc734b13","line":2467,"range":{"start_line":2465,"start_character":12,"end_line":2467,"end_character":75},"updated":"2016-05-09 21:12:33.000000000","message":"Is this really an error? I can imagine wanting to copy a bunch of objects into a new container whilst adding a prefix to the object name. Maybe a follow up patch?","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":2464,"context_line":"                raise SwiftError(\"Destination must be in format /cont[/obj]\")"},{"line_number":2465,"context_line":"            if len(destination_split) \u003e 2 and len(objects) \u003e 1:"},{"line_number":2466,"context_line":"                raise SwiftError(\"Combination of multiple objects and \""},{"line_number":2467,"context_line":"                                 \"destination including object is invalid\")"},{"line_number":2468,"context_line":"            containers.add(destination_split[1])"},{"line_number":2469,"context_line":""},{"line_number":2470,"context_line":"        policy_header \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_d5f9b54f","line":2467,"in_reply_to":"dab17558_fc734b13","updated":"2016-05-26 18:35:57.000000000","message":"yeah that would be awesome!  follow up!","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6caf7ad26d91f1754e5a97c6fd29567c7e6540a3","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            self.object_name \u003d object_name"},{"line_number":347,"context_line":"            self.options \u003d options.copy() if options else {}"},{"line_number":348,"context_line":"            self.destination \u003d self.options.pop(\u0027destination\u0027, None)"},{"line_number":349,"context_line":"            self.fresh_metadata \u003d self.options.pop(\u0027x-fresh-metadata\u0027, False)"},{"line_number":350,"context_line":"            if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":351,"context_line":"                # only container set in destination"},{"line_number":352,"context_line":"                self.destination \u003d \"{0}/{1}\".format(self.destination,"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a9d85d2_1eb29594","line":349,"range":{"start_line":348,"start_character":12,"end_line":349,"end_character":77},"updated":"2016-06-21 15:46:52.000000000","message":"It would be nice to see these defaults set in the default dicts at the top of service.py rather than using pop with a default. If nothing else it\u0027s a single place that lists all the possible options for every call and a convenient place to look for things you might want to override.","commit_id":"b30f22b9c20874a0675d95ea91360102e67cd8d6"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2420,"context_line":"    #"},{"line_number":2421,"context_line":"    def copy(self, container, objects, options\u003dNone):"},{"line_number":2422,"context_line":"        \"\"\""},{"line_number":2423,"context_line":"        Copy operations on list of objects in a container. Destination"},{"line_number":2424,"context_line":"        containers will be created."},{"line_number":2425,"context_line":""},{"line_number":2426,"context_line":"        :param container: The container from which copy the objects."}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c26935c0","line":2423,"range":{"start_line":2423,"start_character":26,"end_line":2423,"end_character":31},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027a list\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2423,"context_line":"        Copy operations on list of objects in a container. Destination"},{"line_number":2424,"context_line":"        containers will be created."},{"line_number":2425,"context_line":""},{"line_number":2426,"context_line":"        :param container: The container from which copy the objects."},{"line_number":2427,"context_line":"        :param objects: A list of object names (strings) or SwiftCopyObject"},{"line_number":2428,"context_line":"                        instances containing an object name and an"},{"line_number":2429,"context_line":"                        options dict (can be None) to override the options for"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_024d0d6c","line":2426,"range":{"start_line":2426,"start_character":50,"end_line":2426,"end_character":55},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027to copy\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2448,"context_line":"                        performed by this call, unless overridden on a per"},{"line_number":2449,"context_line":"                        object basis."},{"line_number":2450,"context_line":"                        The options \"destination\" and \"fresh-metadata\" do"},{"line_number":2451,"context_line":"                        not need to be set, then will objects copied on self"},{"line_number":2452,"context_line":"                        and metadata will not be refreshed."},{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_62f7a1f5","line":2451,"range":{"start_line":2451,"start_character":44,"end_line":2451,"end_character":53},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027in this case\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2448,"context_line":"                        performed by this call, unless overridden on a per"},{"line_number":2449,"context_line":"                        object basis."},{"line_number":2450,"context_line":"                        The options \"destination\" and \"fresh-metadata\" do"},{"line_number":2451,"context_line":"                        not need to be set, then will objects copied on self"},{"line_number":2452,"context_line":"                        and metadata will not be refreshed."},{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_02e98d14","line":2451,"range":{"start_line":2451,"start_character":69,"end_line":2451,"end_character":76},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027onto themselves\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2450,"context_line":"                        The options \"destination\" and \"fresh-metadata\" do"},{"line_number":2451,"context_line":"                        not need to be set, then will objects copied on self"},{"line_number":2452,"context_line":"                        and metadata will not be refreshed."},{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_8210dd02","line":2453,"range":{"start_line":2453,"start_character":49,"end_line":2453,"end_character":70},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027can also be specified in the format\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2451,"context_line":"                        not need to be set, then will objects copied on self"},{"line_number":2452,"context_line":"                        and metadata will not be refreshed."},{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c221354f","line":2454,"range":{"start_line":2454,"start_character":59,"end_line":2454,"end_character":67},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027an explicit\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2452,"context_line":"                        and metadata will not be refreshed."},{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"},{"line_number":2458,"context_line":"                        /container/object is invalid.  Possible options are"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_42d4251f","line":2455,"range":{"start_line":2455,"start_character":54,"end_line":2455,"end_character":65},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027the destination\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"},{"line_number":2458,"context_line":"                        /container/object is invalid.  Possible options are"},{"line_number":2459,"context_line":"                        given below::"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_22d76924","line":2456,"range":{"start_line":2456,"start_character":55,"end_line":2456,"end_character":56},"updated":"2016-08-16 21:12:39.000000000","message":"Missing full stop","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2453,"context_line":"                        The option \"destination\" can be also in format"},{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"},{"line_number":2458,"context_line":"                        /container/object is invalid.  Possible options are"},{"line_number":2459,"context_line":"                        given below::"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_02ca2d6d","line":2456,"range":{"start_line":2456,"start_character":57,"end_line":2456,"end_character":65},"updated":"2016-08-16 21:12:39.000000000","message":"Should be \u0027The combination\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"},{"line_number":2458,"context_line":"                        /container/object is invalid.  Possible options are"},{"line_number":2459,"context_line":"                        given below::"},{"line_number":2460,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c296554b","line":2457,"range":{"start_line":2457,"start_character":45,"end_line":2457,"end_character":56},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027a destination\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"                        \u0027/container\u0027, then objects without explicit"},{"line_number":2455,"context_line":"                        destination will be copied to destination"},{"line_number":2456,"context_line":"                        /container/original_object_name Combination of"},{"line_number":2457,"context_line":"                        multiple objects and destination in format"},{"line_number":2458,"context_line":"                        /container/object is invalid.  Possible options are"},{"line_number":2459,"context_line":"                        given below::"},{"line_number":2460,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_8283bd03","line":2457,"range":{"start_line":2457,"start_character":60,"end_line":2457,"end_character":66},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027the format\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2465,"context_line":"                                \u0027fresh-metadata\u0027: False,"},{"line_number":2466,"context_line":"                            }"},{"line_number":2467,"context_line":""},{"line_number":2468,"context_line":"        :returns: A generator returning the results of copy a list of objects."},{"line_number":2469,"context_line":""},{"line_number":2470,"context_line":"        :raises: SwiftError"},{"line_number":2471,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_e2727148","line":2468,"range":{"start_line":2468,"start_character":55,"end_line":2468,"end_character":59},"updated":"2016-08-16 21:12:39.000000000","message":"should be \u0027copying\u0027","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"dec47c8963284226077c6fd5d8f5b921df722fea","unresolved":false,"context_lines":[{"line_number":2565,"context_line":"                    \"The copy operation takes only strings or \""},{"line_number":2566,"context_line":"                    \"SwiftCopyObjects as input\","},{"line_number":2567,"context_line":"                    obj\u003do)"},{"line_number":2568,"context_line":"        options.pop(\"destination\", None)"},{"line_number":2569,"context_line":"        options.pop(\"fresh-metadata\", None)"},{"line_number":2570,"context_line":""},{"line_number":2571,"context_line":"        return copy_objects"},{"line_number":2572,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_3d830a58","line":2569,"range":{"start_line":2568,"start_character":8,"end_line":2569,"end_character":43},"updated":"2016-08-16 21:12:39.000000000","message":"Why are we popping off the options here? It looks like this could result in a SwiftService object configured with defaults for copy having those defaults removed after the first copy operation. I really think this should be a call to \u0027get\u0027 and that we should avoid transforming the default options of the SwiftService instance.","commit_id":"7183debb3090a58431551c265c7ce9003748668c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            self.destination \u003d self.options.get(\u0027destination\u0027)"},{"line_number":356,"context_line":"            self.fresh_metadata \u003d self.options.get(\u0027fresh_metadata\u0027, False)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":359,"context_line":"            # only container set in destination"},{"line_number":360,"context_line":"            self.destination \u003d \"{0}/{1}\".format(self.destination, object_name)"},{"line_number":361,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_a37e1bac","line":358,"range":{"start_line":358,"start_character":67,"end_line":358,"end_character":68},"updated":"2016-08-19 18:12:10.000000000","message":"What if self.destination doesn\u0027t have a leading \u0027/\u0027?\n\nMore generally, should we have more destination validation here, like what we\u0027ve got in copy()?","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":359,"context_line":"            # only container set in destination"},{"line_number":360,"context_line":"            self.destination \u003d \"{0}/{1}\".format(self.destination, object_name)"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class _SwiftReader(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_8302ff3c","line":360,"range":{"start_line":360,"start_character":31,"end_line":360,"end_character":40},"updated":"2016-08-19 18:12:10.000000000","message":"Should this have a leading \u0027/\u0027?","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f854f7f5b2f9dd6f44fe36a7db96e19eb2eafc12","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if self.destination and len(self.destination.split(\u0027/\u0027)) \u003c 3:"},{"line_number":359,"context_line":"            # only container set in destination"},{"line_number":360,"context_line":"            self.destination \u003d \"{0}/{1}\".format(self.destination, object_name)"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class _SwiftReader(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_40326111","line":360,"range":{"start_line":360,"start_character":31,"end_line":360,"end_character":40},"in_reply_to":"1ac06dbe_8302ff3c","updated":"2016-08-22 17:00:03.000000000","message":"Oh, got it! self.destination still has the leading /! OK.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":2492,"context_line":"            destination_split \u003d options[\u0027destination\u0027].split(\u0027/\u0027)"},{"line_number":2493,"context_line":"            if destination_split[0]:"},{"line_number":2494,"context_line":"                raise SwiftError(\"destination must be in format /cont[/obj]\")"},{"line_number":2495,"context_line":"            if len(destination_split) \u003e 2 and len(objects) \u003e 1:"},{"line_number":2496,"context_line":"                # TODO (clayg): could be useful to copy multiple objects into"},{"line_number":2497,"context_line":"                # a destination like \"/container/common/prefix/for/objects/\""},{"line_number":2498,"context_line":"                # where the trailing \"/\" indecates the destination option is a"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_03956fe3","line":2495,"range":{"start_line":2495,"start_character":50,"end_line":2495,"end_character":57},"updated":"2016-08-19 18:12:10.000000000","message":"Should we only do this if there\u0027s more than one non-SwiftCopyObject item in objects? I suppose it\u0027s easier to be overly strict and later loosen it than the other way around...","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":2495,"context_line":"            if len(destination_split) \u003e 2 and len(objects) \u003e 1:"},{"line_number":2496,"context_line":"                # TODO (clayg): could be useful to copy multiple objects into"},{"line_number":2497,"context_line":"                # a destination like \"/container/common/prefix/for/objects/\""},{"line_number":2498,"context_line":"                # where the trailing \"/\" indecates the destination option is a"},{"line_number":2499,"context_line":"                # prefix!"},{"line_number":2500,"context_line":"                raise SwiftError(\"Combination of multiple objects and \""},{"line_number":2501,"context_line":"                                 \"destination including object is invalid\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_439f6703","line":2498,"range":{"start_line":2498,"start_character":41,"end_line":2498,"end_character":50},"updated":"2016-08-19 18:12:10.000000000","message":"nit: s/indecates/indicates/","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":2515,"context_line":"            for cont in containers"},{"line_number":2516,"context_line":"        ]"},{"line_number":2517,"context_line":""},{"line_number":2518,"context_line":"        # wait for first container job to complete before COPY"},{"line_number":2519,"context_line":"        for r in interruptable_as_completed(create_containers):"},{"line_number":2520,"context_line":"            res \u003d r.result()"},{"line_number":2521,"context_line":"            yield res"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_c39357f9","line":2518,"range":{"start_line":2518,"start_character":19,"end_line":2518,"end_character":24},"updated":"2016-08-19 18:12:10.000000000","message":"First, or all? This looks like all.","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":2527,"context_line":"            obj_options \u003d copy_object.options"},{"line_number":2528,"context_line":"            destination \u003d copy_object.destination"},{"line_number":2529,"context_line":"            fresh_metadata \u003d copy_object.fresh_metadata"},{"line_number":2530,"context_line":"            response_dict \u003d {}"},{"line_number":2531,"context_line":"            headers \u003d split_headers("},{"line_number":2532,"context_line":"                options[\u0027meta\u0027], \u0027X-Object-Meta-\u0027)"},{"line_number":2533,"context_line":"            # add header options to the headers object for the request."}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_e3c013e3","line":2530,"range":{"start_line":2530,"start_character":12,"end_line":2530,"end_character":25},"updated":"2016-08-19 18:12:10.000000000","message":"Still not sure about plumbing in response_dict from here. We never use it in this scope, right? Should we just let _copy_object_job instantiate it?","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"885f8d0e6bdf7990e62a88f1b4e209e58affdde2","unresolved":false,"context_lines":[{"line_number":2594,"context_line":"            \u0027destination\u0027: destination,"},{"line_number":2595,"context_line":"            \u0027headers\u0027: headers,"},{"line_number":2596,"context_line":"            \u0027fresh_metadata\u0027: fresh_metadata,"},{"line_number":2597,"context_line":"            \u0027response_dict\u0027: result"},{"line_number":2598,"context_line":"        }"},{"line_number":2599,"context_line":"        try:"},{"line_number":2600,"context_line":"            conn.copy_object("}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_03bb5328","line":2597,"range":{"start_line":2597,"start_character":29,"end_line":2597,"end_character":35},"updated":"2016-08-22 17:01:18.000000000","message":"I was thinking the response dict initialization could just go here, and we could stop thinking about it in copy() entirely.","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6f7c756061ad4c405510920b886d41d7e777de9c","unresolved":false,"context_lines":[{"line_number":2594,"context_line":"            \u0027destination\u0027: destination,"},{"line_number":2595,"context_line":"            \u0027headers\u0027: headers,"},{"line_number":2596,"context_line":"            \u0027fresh_metadata\u0027: fresh_metadata,"},{"line_number":2597,"context_line":"            \u0027response_dict\u0027: result"},{"line_number":2598,"context_line":"        }"},{"line_number":2599,"context_line":"        try:"},{"line_number":2600,"context_line":"            conn.copy_object("}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_34bde368","line":2597,"range":{"start_line":2597,"start_character":29,"end_line":2597,"end_character":35},"in_reply_to":"1ac06dbe_03bb5328","updated":"2016-08-22 17:24:15.000000000","message":"seems reasonable.","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"}],"swiftclient/shell.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":717,"context_line":"            options.sync_key) and not args:"},{"line_number":718,"context_line":"        exit(\u0027-r, -w, -t, and -k options only allowed for containers\u0027)"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"    _opts \u003d vars(options)"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"    with SwiftService(options\u003d_opts) as swift:"},{"line_number":723,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_f5ee7920","line":720,"updated":"2016-05-26 18:35:57.000000000","message":"If it looks strange to rename the command line options for `destination` and `fresh_metadata` when creating the service object - it\u0027s because it\u0027s not following the pre-existing pattern here.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":789,"context_line":"        \u0027-d\u0027, \u0027--destination\u0027, dest\u003d\u0027destination\u0027, help\u003d\u0027The container and \u0027"},{"line_number":790,"context_line":"        \u0027name of the destination object\u0027)"},{"line_number":791,"context_line":"    parser.add_argument("},{"line_number":792,"context_line":"        \u0027-M\u0027, \u0027--fresh-metadata\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027fresh-metadata\u0027,"},{"line_number":793,"context_line":"        help\u003d\u0027Copy the object without any existing metadata\u0027, default\u003dFalse)"},{"line_number":794,"context_line":"    parser.add_argument("},{"line_number":795,"context_line":"        \u0027-m\u0027, \u0027--meta\u0027, action\u003d\u0027append\u0027, dest\u003d\u0027meta\u0027, default\u003d[],"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_b5fd11b3","line":792,"updated":"2016-05-26 18:35:57.000000000","message":"so weird to set dest to a value that can\u0027t be accessed directly.  there\u0027s a reason the default is convert \u0027-\u0027 to \u0027_\u0027 - it\u0027s so you don\u0027t have to resort to\n\n    getattr(options, \u0027fresh-metadata\u0027)\n\nbecause\n\n    options.fresh-metadata\n\nis not going to work.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    args \u003d args[1:]"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    _opts \u003d vars(options)"},{"line_number":808,"context_line":"    destination \u003d _opts.pop(\u0027destination\u0027, None)"},{"line_number":809,"context_line":"    fresh_metadata \u003d _opts.pop(\u0027fresh-metadata\u0027)"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"    with SwiftService(options\u003d_opts) as swift:"},{"line_number":812,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_bc1c2314","line":809,"range":{"start_line":808,"start_character":4,"end_line":809,"end_character":48},"updated":"2016-05-09 21:12:33.000000000","message":"It seems strange to remove these options, only to introduce them later with slightly different names.","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    _opts \u003d vars(options)"},{"line_number":808,"context_line":"    destination \u003d _opts.pop(\u0027destination\u0027, None)"},{"line_number":809,"context_line":"    fresh_metadata \u003d _opts.pop(\u0027fresh-metadata\u0027)"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"    with SwiftService(options\u003d_opts) as swift:"},{"line_number":812,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_aee1422c","line":809,"in_reply_to":"dab17558_bc1c2314","updated":"2016-05-26 18:35:57.000000000","message":"Done","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"4e3e83d3f3f39d5b58d52db2aaefb7b5636d26f4","unresolved":false,"context_lines":[{"line_number":822,"context_line":""},{"line_number":823,"context_line":"                for r in swift.copy("},{"line_number":824,"context_line":"                    container\u003dcontainer, objects\u003dobjects,"},{"line_number":825,"context_line":"                    options\u003d{\u0027Destination\u0027: destination,"},{"line_number":826,"context_line":"                             \u0027X-Fresh-Metadata\u0027: fresh_metadata}):"},{"line_number":827,"context_line":"                    if r[\u0027success\u0027]:"},{"line_number":828,"context_line":"                        if options.verbose:"},{"line_number":829,"context_line":"                            if \u0027object\u0027 in r:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_9cde7f3d","line":826,"range":{"start_line":825,"start_character":20,"end_line":826,"end_character":66},"updated":"2016-05-09 21:12:33.000000000","message":"see above","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"71e0e835da9c1ec07e0ad5649599105d2fb8f6d1","unresolved":false,"context_lines":[{"line_number":823,"context_line":"                for r in swift.copy("},{"line_number":824,"context_line":"                    container\u003dcontainer, objects\u003dobjects,"},{"line_number":825,"context_line":"                    options\u003d{\u0027Destination\u0027: destination,"},{"line_number":826,"context_line":"                             \u0027X-Fresh-Metadata\u0027: fresh_metadata}):"},{"line_number":827,"context_line":"                    if r[\u0027success\u0027]:"},{"line_number":828,"context_line":"                        if options.verbose:"},{"line_number":829,"context_line":"                            if \u0027object\u0027 in r:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_0ed16e57","line":826,"in_reply_to":"dab17558_9cde7f3d","updated":"2016-05-26 18:35:57.000000000","message":"Done","commit_id":"a2b67b824f3f938712e32c6135682d817f541732"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6caf7ad26d91f1754e5a97c6fd29567c7e6540a3","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        \u0027-d\u0027, \u0027--destination\u0027, help\u003d\u0027The container and name of the \u0027"},{"line_number":783,"context_line":"        \u0027destination object\u0027)"},{"line_number":784,"context_line":"    parser.add_argument("},{"line_number":785,"context_line":"        \u0027-M\u0027, \u0027--fresh-metadata\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":786,"context_line":"        help\u003d\u0027Copy the object without any existing metadata\u0027, default\u003dFalse)"},{"line_number":787,"context_line":"    parser.add_argument("},{"line_number":788,"context_line":"        \u0027-m\u0027, \u0027--meta\u0027, action\u003d\u0027append\u0027, dest\u003d\u0027meta\u0027, default\u003d[],"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a9d85d2_5e509d5d","line":785,"range":{"start_line":785,"start_character":17,"end_line":785,"end_character":22},"updated":"2016-06-21 15:46:52.000000000","message":"The option used by the code in service.py looks for options[\u0027x-fresh-metadata\u0027] and there are no tests in test_shell.py that set --fresh-metadata.\n\nIt looks like this option won\u0027t be passed through.","commit_id":"b30f22b9c20874a0675d95ea91360102e67cd8d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dd9e7e0469b8d6cfc755ea676cdc1ec7c18b23c","unresolved":false,"context_lines":[{"line_number":814,"context_line":"                        options\u003doptions):"},{"line_number":815,"context_line":"                    if r[\u0027success\u0027]:"},{"line_number":816,"context_line":"                        if options[\u0027verbose\u0027]:"},{"line_number":817,"context_line":"                            if \u0027object\u0027 in r:"},{"line_number":818,"context_line":"                                output_manager.print_msg("},{"line_number":819,"context_line":"                                    \u0027%s/%s copied to %s\u0027 % ("},{"line_number":820,"context_line":"                                        r[\u0027container\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ac06dbe_635b8355","line":817,"range":{"start_line":817,"start_character":28,"end_line":817,"end_character":45},"updated":"2016-08-19 18:12:10.000000000","message":"Maybe better to check for\n\n r[\u0027action\u0027] \u003d\u003d \u0027copy_object\u0027\n\n?","commit_id":"eaee608a4c7358f6adc325fd6398f5e56aace554"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"885f8d0e6bdf7990e62a88f1b4e209e58affdde2","unresolved":false,"context_lines":[{"line_number":814,"context_line":"                        options\u003doptions):"},{"line_number":815,"context_line":"                    if r[\u0027success\u0027]:"},{"line_number":816,"context_line":"                        if options[\u0027verbose\u0027]:"},{"line_number":817,"context_line":"                            if r \u003d\u003d \u0027copy_object\u0027:"},{"line_number":818,"context_line":"                                output_manager.print_msg("},{"line_number":819,"context_line":"                                    \u0027%s/%s copied to %s\u0027 % ("},{"line_number":820,"context_line":"                                        r[\u0027container\u0027],"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_2362cfad","line":817,"range":{"start_line":817,"start_character":31,"end_line":817,"end_character":32},"updated":"2016-08-22 17:01:18.000000000","message":"Surely we want\n\n r[\u0027action\u0027]\n\nAnd probably also some better test coverage.","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6f7c756061ad4c405510920b886d41d7e777de9c","unresolved":false,"context_lines":[{"line_number":814,"context_line":"                        options\u003doptions):"},{"line_number":815,"context_line":"                    if r[\u0027success\u0027]:"},{"line_number":816,"context_line":"                        if options[\u0027verbose\u0027]:"},{"line_number":817,"context_line":"                            if r \u003d\u003d \u0027copy_object\u0027:"},{"line_number":818,"context_line":"                                output_manager.print_msg("},{"line_number":819,"context_line":"                                    \u0027%s/%s copied to %s\u0027 % ("},{"line_number":820,"context_line":"                                        r[\u0027container\u0027],"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_34320311","line":817,"range":{"start_line":817,"start_character":31,"end_line":817,"end_character":32},"in_reply_to":"1ac06dbe_2362cfad","updated":"2016-08-22 17:24:15.000000000","message":"yes, yes we do want r[\u0027action\u0027] here, and a bit more test coverage couldn\u0027t hurt...","commit_id":"e0a8c6e0c579e68363460067f6701a890b1702c8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c507ea75e949e1a1439a299f5956d43483c47a11","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                container \u003d args[0]"},{"line_number":804,"context_line":"                if \u0027/\u0027 in container:"},{"line_number":805,"context_line":"                    output_manager.error("},{"line_number":806,"context_line":"                        \u0027WARNING: / in container name; you might have \u0027"},{"line_number":807,"context_line":"                        \"meant \u0027%s\u0027 instead of \u0027%s\u0027.\" %"},{"line_number":808,"context_line":"                        (args[0].replace(\u0027/\u0027, \u0027 \u0027, 1), args[0]))"},{"line_number":809,"context_line":"                    return"}],"source_content_type":"text/x-python","patch_set":19,"id":"1ac06dbe_c195a187","line":806,"range":{"start_line":806,"start_character":25,"end_line":806,"end_character":32},"updated":"2016-08-22 23:14:58.000000000","message":"Looks like an error, not a warning.","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"11e537b9878a0c194c197a04427c3d2f451aad5b","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                container \u003d args[0]"},{"line_number":804,"context_line":"                if \u0027/\u0027 in container:"},{"line_number":805,"context_line":"                    output_manager.error("},{"line_number":806,"context_line":"                        \u0027WARNING: / in container name; you might have \u0027"},{"line_number":807,"context_line":"                        \"meant \u0027%s\u0027 instead of \u0027%s\u0027.\" %"},{"line_number":808,"context_line":"                        (args[0].replace(\u0027/\u0027, \u0027 \u0027, 1), args[0]))"},{"line_number":809,"context_line":"                    return"}],"source_content_type":"text/x-python","patch_set":19,"id":"1ac06dbe_514a0827","line":806,"range":{"start_line":806,"start_character":25,"end_line":806,"end_character":32},"in_reply_to":"1ac06dbe_c195a187","updated":"2016-08-23 09:31:18.000000000","message":"This is labelled as a warning in all the other st_* functions as well. Maybe we should consider a follow-up patch to change those too?","commit_id":"773aa3828fc4fc65729cf54b9298f9da20243704"}],"tests/unit/test_shell.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"aae46c9cb0027a5d565c7e2d4e5da43a5772198e","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"                fresh_metadata\u003dFalse, headers\u003d{\u0027X-Object-Meta-Color\u0027: \u0027Blue\u0027},"},{"line_number":1309,"context_line":"                response_dict\u003d{})"},{"line_number":1310,"context_line":"        ]"},{"line_number":1311,"context_line":"        connection.return_value.copy_object.assert_has_calls(calls)"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"    @mock.patch(\u0027swiftclient.service.Connection\u0027)"},{"line_number":1314,"context_line":"    def test_copy_two_objects_destination(self, connection):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ac06dbe_cf7a9e23","line":1311,"updated":"2016-08-23 21:37:05.000000000","message":"That test failure on patchset 19 came from a race to mock out the Connection. We\u0027ll want something like\n\n connection.return_value.copy_object.return_value \u003d None\n\nbefore we call main.","commit_id":"3acfdbd31d0d8e5b858f003290fb25ce4487d8d2"}]}
