)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"To reduce memory consumption this patch adds the"},{"line_number":14,"context_line":"full_listing_iter parameter that returns"},{"line_number":15,"context_line":"an iterator instead of the a list of the full listing."},{"line_number":16,"context_line":"The caller will be able to consume it safely regarding"},{"line_number":17,"context_line":"the memory usage."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAVn%2F%2FlHY%3D","line":15,"updated":"2014-03-05 09:13:09.000000000","message":"maybe \"an iterator instead of a full listing\" ?","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"}],"swiftclient/client.py":[{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"abc68af1ffe015cb4ce4f6be86457c5f70e93e6a","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.next_marker \u003d marker"},{"line_number":240,"context_line":"        self.end_marker \u003d end_marker"},{"line_number":241,"context_line":"        self.http_conn \u003d http_conn"},{"line_number":242,"context_line":"        self.listing \u003d None"},{"line_number":243,"context_line":"        self.account_head \u003d head_account(self.url,"},{"line_number":244,"context_line":"                                         self.token,"},{"line_number":245,"context_line":"                                         self.http_conn)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2F5UQ%3D","line":242,"updated":"2014-02-27 15:07:23.000000000","message":"This causes one extra operation. Is it possible to do the first get_account() here, stash the results and hand out *this* result in next()?","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"19daf10eaa72308b6b3b9b1e582f07c41620dfe9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.next_marker \u003d marker"},{"line_number":240,"context_line":"        self.end_marker \u003d end_marker"},{"line_number":241,"context_line":"        self.http_conn \u003d http_conn"},{"line_number":242,"context_line":"        self.listing \u003d None"},{"line_number":243,"context_line":"        self.account_head \u003d head_account(self.url,"},{"line_number":244,"context_line":"                                         self.token,"},{"line_number":245,"context_line":"                                         self.http_conn)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FsGg%3D","line":242,"in_reply_to":"AAAAVX%2F%2F5UQ%3D","updated":"2014-03-04 17:32:16.000000000","message":"Yes sure we can replace head_account by get_account and use the listing of this get_account to fill self.listing at init time.\nThe next patchset will fix that.","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"abc68af1ffe015cb4ce4f6be86457c5f70e93e6a","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if not self.listing:"},{"line_number":316,"context_line":"                raise StopIteration"},{"line_number":317,"context_line":"            else:"},{"line_number":318,"context_line":"                if not self.delimiter:"},{"line_number":319,"context_line":"                    self.next_marker \u003d self.listing[-1][\u0027name\u0027]"},{"line_number":320,"context_line":"                else:"},{"line_number":321,"context_line":"                    self.next_marker \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2F5M8%3D","line":318,"updated":"2014-02-27 15:07:23.000000000","message":"I didn\u0027t run this to understand the subdir interaction, but won\u0027t you also have this for self.path?","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"19daf10eaa72308b6b3b9b1e582f07c41620dfe9","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if not self.listing:"},{"line_number":316,"context_line":"                raise StopIteration"},{"line_number":317,"context_line":"            else:"},{"line_number":318,"context_line":"                if not self.delimiter:"},{"line_number":319,"context_line":"                    self.next_marker \u003d self.listing[-1][\u0027name\u0027]"},{"line_number":320,"context_line":"                else:"},{"line_number":321,"context_line":"                    self.next_marker \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FsEQ%3D","line":318,"in_reply_to":"AAAAVX%2F%2F5M8%3D","updated":"2014-03-04 17:32:16.000000000","message":"After some try, it seems that if you use path as query parameter you never get a subdir results. But specifying a delimiter can instead return subdir as result.\nSo I think keeping the original implementation as done in the full_listing conditional\nblock is sufficient. What do you think ?","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"abc68af1ffe015cb4ce4f6be86457c5f70e93e6a","unresolved":false,"context_lines":[{"line_number":501,"context_line":"    :param full_listing: if True, return a full listing, else returns a max"},{"line_number":502,"context_line":"                         of 10000 listings"},{"line_number":503,"context_line":"    :param full_listing_iter: if True, return an iterator of the full listing,"},{"line_number":504,"context_line":"                              else returns a max of 10000 listings"},{"line_number":505,"context_line":"    :returns: a tuple of (response headers, a list or iterator of containers)"},{"line_number":506,"context_line":"              The response headers will be a dict and all header names will"},{"line_number":507,"context_line":"              be lowercase."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2F5Lw%3D","line":504,"updated":"2014-02-27 15:07:23.000000000","message":"You don\u0027t say that full_listing\u003dtrue overrides full_listing_iter","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"19daf10eaa72308b6b3b9b1e582f07c41620dfe9","unresolved":false,"context_lines":[{"line_number":501,"context_line":"    :param full_listing: if True, return a full listing, else returns a max"},{"line_number":502,"context_line":"                         of 10000 listings"},{"line_number":503,"context_line":"    :param full_listing_iter: if True, return an iterator of the full listing,"},{"line_number":504,"context_line":"                              else returns a max of 10000 listings"},{"line_number":505,"context_line":"    :returns: a tuple of (response headers, a list or iterator of containers)"},{"line_number":506,"context_line":"              The response headers will be a dict and all header names will"},{"line_number":507,"context_line":"              be lowercase."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FsD4%3D","line":504,"in_reply_to":"AAAAVX%2F%2F5Lw%3D","updated":"2014-03-04 17:32:16.000000000","message":"Yes you\u0027re right. Have a look to the next patchset.","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"abc68af1ffe015cb4ce4f6be86457c5f70e93e6a","unresolved":false,"context_lines":[{"line_number":509,"context_line":"    \"\"\""},{"line_number":510,"context_line":"    if not http_conn:"},{"line_number":511,"context_line":"        http_conn \u003d http_connection(url)"},{"line_number":512,"context_line":"    if full_listing:"},{"line_number":513,"context_line":"        rv \u003d get_account(url, token, marker, limit, prefix,"},{"line_number":514,"context_line":"                         end_marker, http_conn)"},{"line_number":515,"context_line":"        listing \u003d rv[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2F5Jw%3D","line":512,"updated":"2014-02-27 15:07:23.000000000","message":"Can you use ContainerIter() here instead of having duplicate calls to get_account? I guess this would be very slow as you would end up extending rv[1] line by line instead of 10000 lines","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"19daf10eaa72308b6b3b9b1e582f07c41620dfe9","unresolved":false,"context_lines":[{"line_number":509,"context_line":"    \"\"\""},{"line_number":510,"context_line":"    if not http_conn:"},{"line_number":511,"context_line":"        http_conn \u003d http_connection(url)"},{"line_number":512,"context_line":"    if full_listing:"},{"line_number":513,"context_line":"        rv \u003d get_account(url, token, marker, limit, prefix,"},{"line_number":514,"context_line":"                         end_marker, http_conn)"},{"line_number":515,"context_line":"        listing \u003d rv[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fr%2FE%3D","line":512,"in_reply_to":"AAAAVX%2F%2F5Jw%3D","updated":"2014-03-04 17:32:16.000000000","message":"Yes finally, in the next patchset I use ContainersIter for the full listing too and\nfill a list with the full listing that I return to the caller.\nNo it shouldn\u0027t be slow. The iterator will not perform a request at each call of next unless the iterator as been instantiated with limit \u003d 1. There is an internal cache in the iterator that will be pre-fill when it become empty. So if no limit is specified each sub-requests of the iterator will returns the maximum amount of c or o allowed by the Swift proxy.","commit_id":"4816250d6f8b183b2faa657ee84e3ae9e2375886"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    :param http_conn: HTTP connection object (If None, it will create the"},{"line_number":512,"context_line":"                      conn object)"},{"line_number":513,"context_line":"    :param full_listing: if True, return a full listing, else returns a max"},{"line_number":514,"context_line":"                         of 10000 listings"},{"line_number":515,"context_line":"    :param full_listing_iter: if True and full_listing is False then return an"},{"line_number":516,"context_line":"                              iterator of the full listing. limit controls"},{"line_number":517,"context_line":"                              the amount of containers cached in the iterator."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlGw%3D","line":514,"updated":"2014-03-05 09:13:09.000000000","message":"maybe you can change this also:\n\n\"else return a list with max 10000 entries\"","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":653,"context_line":"    :param http_conn: HTTP connection object (If None, it will create the"},{"line_number":654,"context_line":"                      conn object)"},{"line_number":655,"context_line":"    :param full_listing: if True, return a full listing, else returns a max"},{"line_number":656,"context_line":"                         of 10000 listings"},{"line_number":657,"context_line":"    :param full_listing_iter: if True and full_listing is False then return an"},{"line_number":658,"context_line":"                              iterator of the full listing. limit controls"},{"line_number":659,"context_line":"                              the amount of object cached in the iterator."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlGs%3D","line":656,"updated":"2014-03-05 09:13:09.000000000","message":"maybe you can change this also:\n\n\"else return a list with max 10000 entries\"","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":1348,"context_line":"        \"\"\"Wrapper for :func:`head_account`\"\"\""},{"line_number":1349,"context_line":"        return self._retry(None, head_account)"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"    def get_account(self, marker\u003dNone, limit\u003dNone, prefix\u003dNone,"},{"line_number":1352,"context_line":"                    end_marker\u003dNone, full_listing\u003dFalse):"},{"line_number":1353,"context_line":"        \"\"\"Wrapper for :func:`get_account`\"\"\""},{"line_number":1354,"context_line":"        # TODO(unknown): With full_listing\u003dTrue this will restart the entire"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlEU%3D","line":1351,"updated":"2014-03-05 09:13:09.000000000","message":"I would prefer if you add full_listing_iter\u003dFalse here","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"        # listing with each retry. Need to make a better version that just"},{"line_number":1356,"context_line":"        # retries where it left off."},{"line_number":1357,"context_line":"        return self._retry(None, get_account, marker\u003dmarker, limit\u003dlimit,"},{"line_number":1358,"context_line":"                           prefix\u003dprefix, end_marker\u003dend_marker,"},{"line_number":1359,"context_line":"                           full_listing\u003dfull_listing)"},{"line_number":1360,"context_line":""},{"line_number":1361,"context_line":"    def post_account(self, headers, response_dict\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlDM%3D","line":1358,"updated":"2014-03-05 09:13:09.000000000","message":"and full_listing_iter\u003dfull_listing_iter","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":1368,"context_line":"        return self._retry(None, head_container, container)"},{"line_number":1369,"context_line":""},{"line_number":1370,"context_line":"    def get_container(self, container, marker\u003dNone, limit\u003dNone, prefix\u003dNone,"},{"line_number":1371,"context_line":"                      delimiter\u003dNone, end_marker\u003dNone, path\u003dNone,"},{"line_number":1372,"context_line":"                      full_listing\u003dFalse):"},{"line_number":1373,"context_line":"        \"\"\"Wrapper for :func:`get_container`\"\"\""},{"line_number":1374,"context_line":"        # TODO(unknown): With full_listing\u003dTrue this will restart the entire"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlCw%3D","line":1371,"updated":"2014-03-05 09:13:09.000000000","message":"I would prefer if you add full_listing_iter\u003dFalse here","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fcf62f06ce6a45d66b267e5542cb3f33b3b0b397","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"        # retries where it left off."},{"line_number":1377,"context_line":"        return self._retry(None, get_container, container, marker\u003dmarker,"},{"line_number":1378,"context_line":"                           limit\u003dlimit, prefix\u003dprefix, delimiter\u003ddelimiter,"},{"line_number":1379,"context_line":"                           end_marker\u003dend_marker, path\u003dpath,"},{"line_number":1380,"context_line":"                           full_listing\u003dfull_listing)"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"    def put_container(self, container, headers\u003dNone, response_dict\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FlCs%3D","line":1379,"updated":"2014-03-05 09:13:09.000000000","message":"and full_listing_iter\u003dfull_listing_iter","commit_id":"44a1b4472064c9c3d6d87ca9ff7946cd64f0a586"}]}
