)]}'
{"swiftclient/client.py":[{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":593,"context_line":"    :param url: storage URL"},{"line_number":594,"context_line":"    :param token: auth token"},{"line_number":595,"context_line":"    :param headers: additional headers to include in the request"},{"line_number":596,"context_line":"    :param query_string: if set will be appended with \u0027?\u0027 to generated path"},{"line_number":597,"context_line":"    :param data: an optional message body for the request"},{"line_number":598,"context_line":"    :param http_conn: HTTP connection object (If None, it will create the"},{"line_number":599,"context_line":"                      conn object)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_0f2acd2c","line":596,"updated":"2015-06-15 21:35:11.000000000","message":"This changes the usage a bit, since now :url: must not contain a query string (or else the final URL will contain two \u0027?\u0027 chars).  Before this change, the only way to pass in a query string was to include the query params in :url:, so presumably anyone who needs to do so was doing what must now never be done.  Arguably this is less likely in posting to an account as opposed to an object, but it\u0027s worth considering.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":593,"context_line":"    :param url: storage URL"},{"line_number":594,"context_line":"    :param token: auth token"},{"line_number":595,"context_line":"    :param headers: additional headers to include in the request"},{"line_number":596,"context_line":"    :param query_string: if set will be appended with \u0027?\u0027 to generated path"},{"line_number":597,"context_line":"    :param data: an optional message body for the request"},{"line_number":598,"context_line":"    :param http_conn: HTTP connection object (If None, it will create the"},{"line_number":599,"context_line":"                      conn object)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_b7cf777e","line":596,"in_reply_to":"fa32b979_0f2acd2c","updated":"2015-06-16 02:05:30.000000000","message":":url: already can\u0027t contain a query string. Or rather, any query string in :url: is already ignored. Before, we grabbed parsed.path, which cuts down a url like http://foo:42/bar?baz#quux to just /bar.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                      conn object)"},{"line_number":600,"context_line":"    :param response_dict: an optional dictionary into which to place"},{"line_number":601,"context_line":"                     the response - status, reason and headers"},{"line_number":602,"context_line":"    :raises ClientException: HTTP POST request failed"},{"line_number":603,"context_line":"    \"\"\""},{"line_number":604,"context_line":"    if http_conn:"},{"line_number":605,"context_line":"        parsed, conn \u003d http_conn"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_2fd4711e","line":602,"updated":"2015-06-15 21:35:11.000000000","message":":returns: resp_headers, body","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                      conn object)"},{"line_number":600,"context_line":"    :param response_dict: an optional dictionary into which to place"},{"line_number":601,"context_line":"                     the response - status, reason and headers"},{"line_number":602,"context_line":"    :raises ClientException: HTTP POST request failed"},{"line_number":603,"context_line":"    \"\"\""},{"line_number":604,"context_line":"    if http_conn:"},{"line_number":605,"context_line":"        parsed, conn \u003d http_conn"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_f7abbf87","line":602,"in_reply_to":"fa32b979_2fd4711e","updated":"2015-06-16 02:05:30.000000000","message":"Done","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"change_message_id":"5eb5e142c4d305538780e552dda925008df160e9","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    return resp_headers"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"def post_account(url, token, headers, query_string\u003dNone, data\u003dNone,"},{"line_number":583,"context_line":"                 http_conn\u003dNone, response_dict\u003dNone):"},{"line_number":584,"context_line":"    \"\"\""},{"line_number":585,"context_line":"    Update an account\u0027s metadata."}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_d8e987e7","line":582,"updated":"2015-06-24 21:07:29.000000000","message":"Won\u0027t this break any code that supplies the optional `http_conn` and `response_dict` arguments positionally? (I\u0027d suggest keyword-only arguments, but I don\u0027t think we\u0027re allowed to drop Python 2 support ...)","commit_id":"28f1ebc24af9317c6267b61f53940e6e8389495a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17875dfa3134a60f1c3bd790ba068296ac48f999","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    return resp_headers"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"def post_account(url, token, headers, query_string\u003dNone, data\u003dNone,"},{"line_number":583,"context_line":"                 http_conn\u003dNone, response_dict\u003dNone):"},{"line_number":584,"context_line":"    \"\"\""},{"line_number":585,"context_line":"    Update an account\u0027s metadata."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_da29709c","line":582,"in_reply_to":"fa32b979_d8e987e7","updated":"2015-07-02 21:39:07.000000000","message":"Yeah, and there was actually a similar argument surrounding I355ad2827a2f7c14526db6bbb691cc2d2a880b2a (though that had to do with changing the name of an arg that we always assumed would be used positionally).\n\nWill fix, and file this away in the back of my head as one of the places that needs improvement when we eventually reorganize everything to have a sane, consistent interface (and as a result break the world).","commit_id":"28f1ebc24af9317c6267b61f53940e6e8389495a"}],"swiftclient/service.py":[{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"    # Bulk methods"},{"line_number":2092,"context_line":"    #"},{"line_number":2093,"context_line":"    @staticmethod"},{"line_number":2094,"context_line":"    def _bulkdelete(conn, object_list\u003dNone, object_list_file\u003dNone):"},{"line_number":2095,"context_line":"        results_dict \u003d {}"},{"line_number":2096,"context_line":"        try:"},{"line_number":2097,"context_line":"            headers \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_215c85ec","line":2094,"updated":"2015-06-15 21:35:11.000000000","message":"In the general case, these are objects-and-containers, not objects. I\u0027d suggest \"resource_list\"/\"resource_list_file\" as parameter names.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"    # Bulk methods"},{"line_number":2092,"context_line":"    #"},{"line_number":2093,"context_line":"    @staticmethod"},{"line_number":2094,"context_line":"    def _bulkdelete(conn, object_list\u003dNone, object_list_file\u003dNone):"},{"line_number":2095,"context_line":"        results_dict \u003d {}"},{"line_number":2096,"context_line":"        try:"},{"line_number":2097,"context_line":"            headers \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_77aecf86","line":2094,"in_reply_to":"fa32b979_215c85ec","updated":"2015-06-16 02:05:30.000000000","message":"Done","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"            }"},{"line_number":2101,"context_line":"            if object_list_file:"},{"line_number":2102,"context_line":"                res \u003d {\u0027object_list_file\u0027: object_list_file}"},{"line_number":2103,"context_line":"                with open(object_list_file, \u0027r\u0027) as fd:"},{"line_number":2104,"context_line":"                    headers, body \u003d conn.post_account("},{"line_number":2105,"context_line":"                        headers\u003dheaders,"},{"line_number":2106,"context_line":"                        query_string\u003d\u0027bulk-delete\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_4183c956","line":2103,"updated":"2015-06-15 21:35:11.000000000","message":"\"fd\" usually implies an OS-level file descriptor, such as what is returned by os.open (or accepted by os.fdopen)","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"            }"},{"line_number":2101,"context_line":"            if object_list_file:"},{"line_number":2102,"context_line":"                res \u003d {\u0027object_list_file\u0027: object_list_file}"},{"line_number":2103,"context_line":"                with open(object_list_file, \u0027r\u0027) as fd:"},{"line_number":2104,"context_line":"                    headers, body \u003d conn.post_account("},{"line_number":2105,"context_line":"                        headers\u003dheaders,"},{"line_number":2106,"context_line":"                        query_string\u003d\u0027bulk-delete\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_97a9137e","line":2103,"in_reply_to":"fa32b979_4183c956","updated":"2015-06-16 02:05:30.000000000","message":"Done","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":2104,"context_line":"                    headers, body \u003d conn.post_account("},{"line_number":2105,"context_line":"                        headers\u003dheaders,"},{"line_number":2106,"context_line":"                        query_string\u003d\u0027bulk-delete\u0027,"},{"line_number":2107,"context_line":"                        data\u003dLineQuotingIter(fd),"},{"line_number":2108,"context_line":"                        response_dict\u003dresults_dict)"},{"line_number":2109,"context_line":"            else:"},{"line_number":2110,"context_line":"                res \u003d {\u0027object_list\u0027: object_list}"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_810471c0","line":2107,"updated":"2015-06-15 21:35:11.000000000","message":"I have no objection if you give the caller the responsibility for ensuring that container names appear after all their contents.  But you should probably document that in the bulkdelete docstring.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":2104,"context_line":"                    headers, body \u003d conn.post_account("},{"line_number":2105,"context_line":"                        headers\u003dheaders,"},{"line_number":2106,"context_line":"                        query_string\u003d\u0027bulk-delete\u0027,"},{"line_number":2107,"context_line":"                        data\u003dLineQuotingIter(fd),"},{"line_number":2108,"context_line":"                        response_dict\u003dresults_dict)"},{"line_number":2109,"context_line":"            else:"},{"line_number":2110,"context_line":"                res \u003d {\u0027object_list\u0027: object_list}"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_1af76af6","line":2107,"in_reply_to":"fa32b979_810471c0","updated":"2015-06-16 02:05:30.000000000","message":"Done","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":2131,"context_line":"        \"\"\""},{"line_number":2132,"context_line":"        Bulk delete operations on a list of objects."},{"line_number":2133,"context_line":""},{"line_number":2134,"context_line":"        :param objects: The list of objects to delete, including container."},{"line_number":2135,"context_line":"        :param options: A dictionary containing options to override the global"},{"line_number":2136,"context_line":"                        options specified during the service object creation::"},{"line_number":2137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_415f49e5","line":2134,"updated":"2015-06-15 21:35:11.000000000","message":"In the general case, these are objects-and-containers, not objects.  I\u0027d suggest \"resources\" as a parameter name.\n\nHmm, on second reading I\u0027m not sure whether this handles the general case of objects in multiple containers, e.g. [\u0027/c1/o1\u0027, \u0027/c1/o2\u0027, \u0027/c1\u0027, \u0027/c4/o3\u0027, \u0027/c7/o4\u0027].  Is it intended to?  (Does the :remove_container: kwarg only make sense if :prefix: is also given?  Seems to be some confusion between remove_container and delete_container...)","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":2131,"context_line":"        \"\"\""},{"line_number":2132,"context_line":"        Bulk delete operations on a list of objects."},{"line_number":2133,"context_line":""},{"line_number":2134,"context_line":"        :param objects: The list of objects to delete, including container."},{"line_number":2135,"context_line":"        :param options: A dictionary containing options to override the global"},{"line_number":2136,"context_line":"                        options specified during the service object creation::"},{"line_number":2137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_d026c1cd","line":2134,"in_reply_to":"fa32b979_415f49e5","updated":"2015-06-16 02:05:30.000000000","message":"It *is* intended to work, and actually will as written, provided you don\u0027t include the leading slash. Given that all the documentation for bulk delete includes that slash, though, this should also support it. Will fix.\n\nremove_container isn\u0027t a kwarg; it\u0027s just a local flag so we know to delete the container as well. It lets us use the presence of a trailing slash to differentiate between \"delete this container and everything in it\" and \"delete everything in this container, but leave the container alone\".","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"        if options[\u0027prefix\u0027]:"},{"line_number":2166,"context_line":"            if \u0027/\u0027 not in options[\u0027prefix\u0027]:"},{"line_number":2167,"context_line":"                options[\u0027prefix\u0027] +\u003d \u0027/\u0027"},{"line_number":2168,"context_line":"                remove_container \u003d True"},{"line_number":2169,"context_line":"            cont, prefix \u003d options[\u0027prefix\u0027].split(\u0027/\u0027, 1)"},{"line_number":2170,"context_line":"            list_options \u003d {\u0027prefix\u0027: prefix}"},{"line_number":2171,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_8178f1f3","line":2168,"updated":"2015-06-15 21:35:11.000000000","message":"Why does \u0027/\u0027-not-in-options[\u0027prefix\u0027] imply that we want to remove the container?  If I bulk-delete \"myprefix-*\" (presumably by doing the API\u0027s equivalent of POSTing the bulk delete request to the container rather than the account), why would that imply that I want to delete the container?  For that matter, if the container contains objects that don\u0027t have the prefix, then the container *can\u0027t* be deleted because it won\u0027t be empty.  I suspect I\u0027m misunderstanding something here...","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"        if options[\u0027prefix\u0027]:"},{"line_number":2166,"context_line":"            if \u0027/\u0027 not in options[\u0027prefix\u0027]:"},{"line_number":2167,"context_line":"                options[\u0027prefix\u0027] +\u003d \u0027/\u0027"},{"line_number":2168,"context_line":"                remove_container \u003d True"},{"line_number":2169,"context_line":"            cont, prefix \u003d options[\u0027prefix\u0027].split(\u0027/\u0027, 1)"},{"line_number":2170,"context_line":"            list_options \u003d {\u0027prefix\u0027: prefix}"},{"line_number":2171,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_d7d79bbd","line":2168,"in_reply_to":"fa32b979_8178f1f3","updated":"2015-06-16 02:05:30.000000000","message":"I think the confusion arises from the fact that I\u0027m not using the standard semantics for --prefix: where `swift list foo --prefix bar/baz` will show you all objects that start with \"bar/baz\" in container \"foo\", `swift bulkdelete foo --prefix bar/baz` will issue a single-item bulk delete for the container \"foo\", then list all objects that start with \"baz\" in container \"bar\" and issue a bulk delete for each page returned.\n\nSince the prefix includes the container and we only try to delete the container if there are no slashes at all, we\u0027ll never try to delete a container unless we\u0027ve tried to delete all the objects in that container. We might still get an error (say, if someone uploads a new object while we\u0027re still deleting), but that\u0027s always a danger when trying to delete containers.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"93fe36e62f16a3b262c7b8decb36045daebaacc9","unresolved":false,"context_lines":[{"line_number":2115,"context_line":"                                cancelled \u003d True"},{"line_number":2116,"context_line":""},{"line_number":2117,"context_line":"    def _should_bulk_delete(self, objects):"},{"line_number":2118,"context_line":"        if len(objects) \u003c 3:"},{"line_number":2119,"context_line":"            # Not many objects; may as well delete one-by-one"},{"line_number":2120,"context_line":"            return False"},{"line_number":2121,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a29b11f_0c5132d8","line":2118,"updated":"2015-10-21 12:34:23.000000000","message":"I\u0027m not completely convinced that this is the correct threshold for bulk-deletes; will 3 local threads processing in parallel really be slower than submitting the bulk delete request and performing them sequentially on the proxy? I\u0027ll not hold up the patch over it, just want to suggest that it\u0027s something we might want to look into (some function of the number of object_dd threads perhaps?).","commit_id":"6491ef315a7cf1504db13d87741732be816ab9e3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca4cf132b98eaa66a33c7fcc4da2412bce7b514d","unresolved":false,"context_lines":[{"line_number":2115,"context_line":"                                cancelled \u003d True"},{"line_number":2116,"context_line":""},{"line_number":2117,"context_line":"    def _should_bulk_delete(self, objects):"},{"line_number":2118,"context_line":"        if len(objects) \u003c 3:"},{"line_number":2119,"context_line":"            # Not many objects; may as well delete one-by-one"},{"line_number":2120,"context_line":"            return False"},{"line_number":2121,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a29b11f_fe01753a","line":2118,"in_reply_to":"3a29b11f_0c5132d8","updated":"2015-10-26 02:38:43.000000000","message":"I\u0027m not convinced either, but I\u0027m also not in a position to try to determine what that threshold should be, at least not in the immediate future. This seems \"good enough\", and leaves the decision making to a well defined location.","commit_id":"6491ef315a7cf1504db13d87741732be816ab9e3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"49385e1649b4bc1168fe210487d1291941265a6c","unresolved":false,"context_lines":[{"line_number":2326,"context_line":"            headers, body \u003d conn.post_account("},{"line_number":2327,"context_line":"                headers\u003dheaders,"},{"line_number":2328,"context_line":"                query_string\u003d\u0027bulk-delete\u0027,"},{"line_number":2329,"context_line":"                data\u003d\u0027\\n\u0027.join("},{"line_number":2330,"context_line":"                    quote((\u0027/%s/%s\u0027 % (container, obj)).encode(\u0027utf-8\u0027))"},{"line_number":2331,"context_line":"                    for obj in objects).encode(\u0027utf-8\u0027),"},{"line_number":2332,"context_line":"                response_dict\u003dresults_dict)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a29b11f_cc19d723","line":2329,"updated":"2015-10-22 04:45:39.000000000","message":"It always irritates me when people leave the last line unterminated. I know that this works, but... I would use \u0027\u0027.join(\u0027xxxxx\\n\u0027).","commit_id":"6491ef315a7cf1504db13d87741732be816ab9e3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca4cf132b98eaa66a33c7fcc4da2412bce7b514d","unresolved":false,"context_lines":[{"line_number":2326,"context_line":"            headers, body \u003d conn.post_account("},{"line_number":2327,"context_line":"                headers\u003dheaders,"},{"line_number":2328,"context_line":"                query_string\u003d\u0027bulk-delete\u0027,"},{"line_number":2329,"context_line":"                data\u003d\u0027\\n\u0027.join("},{"line_number":2330,"context_line":"                    quote((\u0027/%s/%s\u0027 % (container, obj)).encode(\u0027utf-8\u0027))"},{"line_number":2331,"context_line":"                    for obj in objects).encode(\u0027utf-8\u0027),"},{"line_number":2332,"context_line":"                response_dict\u003dresults_dict)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a29b11f_1eff9135","line":2329,"in_reply_to":"3a29b11f_cc19d723","updated":"2015-10-26 02:38:43.000000000","message":"Done","commit_id":"6491ef315a7cf1504db13d87741732be816ab9e3"},{"author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"change_message_id":"6a0eccf4f43ca213cd2e3fa88388efe12d193a6c","unresolved":false,"context_lines":[{"line_number":2061,"context_line":"                obj_dels \u003d {}"},{"line_number":2062,"context_line":""},{"line_number":2063,"context_line":"                if self._should_bulk_delete(objects):"},{"line_number":2064,"context_line":"                    self._bulk_delete(container, objects, options, obj_dels)"},{"line_number":2065,"context_line":"                else:"},{"line_number":2066,"context_line":"                    self._per_item_delete(container, objects, options,"},{"line_number":2067,"context_line":"                                          obj_dels, rq)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a26ad4f_7f0151ae","line":2064,"updated":"2015-11-02 22:36:34.000000000","message":"I don\u0027t want to hold this patch up unnecessarily, but is there a case here for paginating the bulk deletes so that we don\u0027t end up sending a single bulk operation with millions of objects. I ask this for 2 reasons:\n\n1) Multiple bulk operations on smaller numbers of objects may be faster than one huge bulk operation.\n2) Even if multiple bulk operations are no faster, they should at least be no slower and we would get progress updates and restrict the response/request sizes.","commit_id":"2a9def3436c73d81809b580fcfe9323b46ed1227"}],"swiftclient/shell.py":[{"author":{"_account_id":8262,"name":"Jon Snitow","email":"otherjon@swiftstack.com","username":"otherjon"},"change_message_id":"7f8669cd12e9965801ac56e7a91e52870c3284a7","unresolved":false,"context_lines":[{"line_number":920,"context_line":"                    output_manager.print_items(details.items(), offset\u003doffset)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"                elif bulkdel_result[\u0027action\u0027] \u003d\u003d \u0027delete_container\u0027:"},{"line_number":923,"context_line":"                    output_manager.print_msg(\u0027\\nRemoved container: %s\u0027,"},{"line_number":924,"context_line":"                                             bulkdel_result[\u0027container\u0027])"},{"line_number":925,"context_line":"    except SwiftError as e:"},{"line_number":926,"context_line":"        output_manager.error(e.value)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_21eb25b2","line":923,"updated":"2015-06-15 21:35:11.000000000","message":"This will provide different output for containers removed via the option vs. containers removed by being explicitly listed in the POST data -- might be confusing.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"442ab3f9e3d01de51186f6bc9860d227a7d1a318","unresolved":false,"context_lines":[{"line_number":920,"context_line":"                    output_manager.print_items(details.items(), offset\u003doffset)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"                elif bulkdel_result[\u0027action\u0027] \u003d\u003d \u0027delete_container\u0027:"},{"line_number":923,"context_line":"                    output_manager.print_msg(\u0027\\nRemoved container: %s\u0027,"},{"line_number":924,"context_line":"                                             bulkdel_result[\u0027container\u0027])"},{"line_number":925,"context_line":"    except SwiftError as e:"},{"line_number":926,"context_line":"        output_manager.error(e.value)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_08be3dd4","line":923,"in_reply_to":"fa32b979_21eb25b2","updated":"2015-06-16 02:05:30.000000000","message":"I\u0027m not really happy with the output format right now. I\u0027m going to try rolling up the deleted/not found numbers, but I\u0027m really not sure what to do about random non-\"200 OK\" responses when we\u0027re getting back a lot of responses.","commit_id":"a75674092af324a68812910d0a677fc71a20affa"}],"tests/unit/test_swiftclient.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"36be63e6cf9062e008db291031c2871b9f82f67d","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        self.assertRequests(["},{"line_number":625,"context_line":"            (\u0027POST\u0027, \u0027http://www.tests.com\u0027, None, {\u0027x-auth-token\u0027: \u0027asdf\u0027})"},{"line_number":626,"context_line":"        ])"},{"line_number":627,"context_line":"        # TODO: this is a fairly brittle test of the __repr__ on the"},{"line_number":628,"context_line":"        # ClientException which should probably be in a targeted test"},{"line_number":629,"context_line":"        new_body \u003d \"[first 60 chars of response] \" + body[0:60]"},{"line_number":630,"context_line":"        self.assertEqual(e.__str__()[-89:], new_body)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da6ed579_ac803ec1","line":627,"updated":"2016-01-14 03:50:50.000000000","message":"Could probably just drop the verification of the exact body.","commit_id":"7a1e192803b8f4b739c9c3086bbfdc9a9c8d6753"}]}
